在收到 Firebase 通知时打开应用 (FCM)

Posted

技术标签:

【中文标题】在收到 Firebase 通知时打开应用 (FCM)【英文标题】:Open app on firebase notification received (FCM) 【发布时间】:2016-09-29 23:20:05 【问题描述】:

我想在收到通知时自动打开应用程序,这可以通过 Firebase 和新的 FCM 通知实现吗?

我知道我可以设置 click_action 但这只是为了自定义在点击通知时启动哪个活动,我需要在收到通知时自动启动的东西。

我尝试了快速启动消息传递 firebase 示例,并且有一个 onMessageReceived() 方法,但它仅在应用程序处于前台时才有效。应用程序在后台时是否也会执行某些操作? GCM 可以通过直接从收到通知时调用的广播接收器启动活动意图来执行我想要的操作。

【问题讨论】:

如果您再次阅读文档,您将看到 onMessageReceived 只有在您的有效负载中没有通知标签时才会在后台调用 但是我尝试添加一个启动意图并且 startActivity 甚至没有被调用。 如果你看这里,你会看到 onMessageReceived 在哪里被调用并且它写入前台。 firebase.google.com/docs/cloud-messaging/… 在这里查看我的答案,也许你会有一个想法:***.com/a/37843845/1507602 检查这个***.com/a/44800598/7329597我希望你能得到你的答案并且它是可用的。 【参考方案1】:

快速回答:

要通过 FCM 自动打开应用程序,您需要使用 data-message,它保证始终调用 FirebaseMessagingService.onMessageReceived() 方法。

然后您可以在.onMessageReceived() 方法中添加您的逻辑以启动首选活动。

警告:在没有任何用户交互的情况下启动 UI 对于大多数应用程序来说是一种非常非常糟糕的做法!请在此处阅读 MarkG 答案: How to start an Activity from a Service?

[...] 打断用户当前正在做的事情被认为是糟糕的设计形式,尤其是从应该在后台运行的事情中。 因此,当用户决定是时候进行调查时,您应该考虑使用通知 [...] 来启动所需的活动。 [...]

完整解释:

FCM 的工作原理与 GCM 类似,可以接收两种类型的消息:

    显示消息: 有效负载 "notification" : "body" : "hello world" 这些消息在应用处于后台时自动显示,如果应用已经处于前台,它们会调用FirebaseMessagingService.onMessageReceived()数据消息: 有效载荷"data" : "key1" : "value1" 这些消息总是调用FirebaseMessagingService.onMessageReceived(), 即使应用已关闭或在后台运行。

click_action 是通知负载的一个参数,因此它适用于显示消息。

表示与用户点击通知相关联的操作。 如果这是设置一个具有匹配意图过滤器的活动 在用户点击通知时启动

https://firebase.google.com/docs/cloud-messaging/http-server-ref#notification-payload-support

【讨论】:

还有一件事:Firebase Web 控制台只能发送显示消息。要发送数据消息,您需要使用服务器端 API。 是的。要发送数据消息,您仍然必须实现单独的应用服务器,因为 Firebase Web 控制台仅发送显示消息。如果您希望控制台支持数据消息,请发送功能请求:firebase.google.com/support/contact/bugs-features @stevyhacker 用于测试,您可以使用Google Advanced REST Client 工具,并将您的json 消息发送到https://fcm.googleapis.com/fcm/send。一个例子是here 我不明白为什么这个答案被接受,这个答案是为了指定当用户点击通知时应该启动哪个活动,问题是“如何自动启动一个特定的活动而不任何用户交互?” FirebaseMessagingService.onMessageReceived() 如果应用程序在后台并且您在通知中有数据有效负载,则不会调用此方法,经过尝试和测试!【参考方案2】:

看来this section of the guide 是破解后台应用之谜的关键:

接收消息使用扩展的服务 FirebaseMessagingService。您的服务应该覆盖 onMessageReceived 回调,为大多数消息提供 类型,但以下情况除外:

当您的应用处于后台时发送通知。 在这个 在这种情况下,通知会发送到设备的系统托盘。一种 默认情况下,用户点击通知会打开应用启动器。

包含通知和数据负载的消息。 在这种情况下, 通知被传送到设备的系统托盘,并且数据 有效载荷是在您的启动器意图的附加内容中交付的 活动。

基本上,当应用程序在后台运行时,此时它并没有真正响应或运行。因此,消息被传递到系统托盘。但是,下面将解释解决方案。

如果您想打开您的应用并[在后台运行时]执行特定操作,请设置 通知负载中的 click_action 并将其映射到意图 过滤您要启动的活动。例如,设置 click_actionOPEN_ACTIVITY_1 以触发类似的意图过滤器 以下:

<intent-filter>
  <action android:name="OPEN_ACTIVITY_1" />
  <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

【讨论】:

我需要一个自定义消息接收器之类的东西,我可以在其中执行将启动应用程序的代码,但我不确定 FCM 是否可行 刚才我尝试了 GCM,它适用于我的用例没有问题,可惜 FCM 不支持这个。 感谢您的出色解决方案。使用您的解决方案,它正在启动我的 TargetActivity,但没有在该活动中获得额外功能。请问有什么解决办法吗? 这不是问题的答案,我们需要在没有用户交互的情况下自动启动活动,如点击通知。 我期待你们如何自动启动应用程序而无需用户点击系统托盘中的通知。【参考方案3】:

我总结了这里的步骤,希望对你有帮助

第 1 步

关注FCM user guide。通过推送来自Firebase console 的消息,确保一切正常。

第 2 步

如下更改您的自定义 FirebaseMessagingService 类:

public class MyFirebaseMessagingService extends FirebaseMessagingService 

private static final String TAG = "MyFirebaseMsgService";
@Override
public void onMessageReceived(RemoteMessage remoteMessage) 
    Log.d(TAG, "From: " + remoteMessage.getFrom());
    startActivity(new Intent(this, SplashActivity.class));


现在再次使用 Firebase 控制台推送消息,您会发现 onMessageReceived 仅在您的应用处于前台时触发。因为 Firebase 控制台只能发送 Notification message。为了发送Data message,我们需要第三步。

第 3 步

安装Google Advanced REST client

在参数下方输入:

url: https://fcm.googleapis.com/fcm/send
method: POST 
Raw header: 
Content-Type: application/json
Authorization:key=YOUR_SERVER_KEY
Raw payload:

   "to" : "YOUR_DEVICE_FCM_TOKEN",
   "data" : 
     "Nick" : "Mario",
     "body" : "great match!",
     "Room" : "PortugalVSDenmark"
   ,
  

YOUR_SERVER_KEY 在 Firebase 控制台 > 设置窗格 > 云消息选项卡中可用

YOUR_DEVICE_FCM_TOKEN 在onTokenRefresh() 上是FirebaseInstanceId.getInstance().getToken()

注意

在没有用户交互的情况下启动 UI 是不好的 UX,您可能需要用启动服务或后台的东西替换启动活动。我只是将活动用于测试目的,因此它比服务更直观。 感谢 @2ndgab 介绍 Google 高级 REST 客户端工具。

【讨论】:

它不起作用。应用在后台时,收不到任何消息 假设你完成了第2步并在第3步失败了,发送帖子时的响应是什么,如果不是200,请检查你正在使用的参数【参考方案4】:

[安卓] 如果您使用的是 Firebase 通知(不是 Firebase 云消息传递),您只需在 build.gradle 中包含 Firebase 消息传递,然后将您的应用链接到 Firebase 控制台上的项目。

如果您的应用在后台,从控制台发送的任何消息都会给您一个系统通知,如果触摸该通知,将激活您的应用。

看这里:https://youtu.be/KpTSpVh9SfY?t=10m22s

【讨论】:

以上是关于在收到 Firebase 通知时打开应用 (FCM)的主要内容,如果未能解决你的问题,请参考以下文章

Firebase FCM 最初不工作,但如果应用程序打开,则在 3-4 次后工作

IONIC android FCM 通知

使用 xamarin 表单在前台未收到 FCM 通知

收到 FCM 通知时如何在不点击通知的情况下打开(启动)应用程序

Web 应用中的 Firebase 通知收件箱(非 FCM)

Firebase (FCM):打开活动并在通知点击时传递数据。安卓