收到firebase通知的打开应用程序(FCM)

我希望在收到通知时自动打开应用程序,Firebase和新的FCM通知是否可以实现?

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

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

Solutions Collecting From Web of "收到firebase通知的打开应用程序(FCM)"

快速回答:

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

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

警告:对于大多数应用程序而言,在没有任何用户交互的情况下启动UI是非常糟糕的做法! 请在此处阅读MarkG答案: 如何从服务启动活动?

[…]中断用户当前正在做的事情被认为是糟糕的设计forms,尤其是那些应该在后台运行的东西。
因此,当用户决定进行调查时,您应该考虑使用通知[…]启动所需的活动。 […]

完整解释:

FCM与GCM的工作方式类似,可以接收两种types的消息:

  1. 显示的消息:
    有效载荷{"notification" : { "body" : "hello world"}}
    当应用程序处于后台时,这些消息会自动显示,如果应用程序已在前台,则会调用FirebaseMessagingService.onMessageReceived()
  2. 数据的消息:
    payload {"data" : { "key1" : "value1"}}
    这些消息始终调用 FirebaseMessagingService.onMessageReceived()
    即使应用程序已关闭或在后台运行。

click_action是通知有效负载的参数,因此它适用于display-messages。

表示与用户单击通知关联的操作。
如果设置了此选项,则会在用户单击通知时启动具有匹配意图filter的活动。

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

看起来本指南的这一部分是背景应用程序难题的关键:

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

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

具有通知和数据有效负载的消息。
在这种情况下,通知将传递到设备的系统托盘,并且数据有效负载将在启动器活动的附加内容中传递。

从本质上讲,当应用程序背景化时,它不会真正响应或在此时运行。 因此,消息将传递到系统托盘。 但是,就在下面,解释了解决方案。

如果要打开应用程序并执行特定操作[在后台运行时],请在通知有效内容中设置click_action,并将其映射到要启动的活动中的意图filter。 例如,将click_action设置为OPEN_ACTIVITY_1以触​​发如下所示的intentfilter:

     

我总结了这里的步骤,希望它有所帮助

步骤1

关注FCM用户指南 。 通过从Firebase控制台推送消息,确保一切正常。

第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步。

第3步

安装Google Advanced REST客户端

输入以下参数:

 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" }, } 

FirePro控制台>设置窗格>云消息传递选项卡中提供了YOUR_SERVER_KEY

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

注意

在没有用户交互的情况下启动UI是糟糕的用户体验,您可能需要将启动活动替换为启动服务或后台的某些内容。 我只是将活动用于测试目的,因此它比服务更具视觉效果。 感谢@ 2ndgab介绍Google Advanced REST客户端工具。

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

如果您的应用程序在后台,则从控制台发送的任何消息都会为您提供系统通知,如果触摸该通知,将激活您的应用程序。

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