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

ste*_*ker 31 android firebase firebase-cloud-messaging firebase-notifications

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

我知道我可以设置click_action,但这只是为了自定义通知点击会启动哪些活动,我需要在收到通知时自动启动的内容.

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

Die*_*ini 52

快速回答:

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

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

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

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

完整解释:

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

  1. display-messages:
    payload {"notification" : { "body" : "hello world"}}
    这些消息在应用程序处于后台时自动显示,FirebaseMessagingService.onMessageReceived()如果应用程序已在前台,则会调用这些消息.

  2. data-messages:
    payload {"data" : { "key1" : "value1"}}
    这些消息总是会调用 FirebaseMessagingService.onMessageReceived(),
    即使应用程序已关闭或在后台运行.

click_action 是通知有效负载的参数,因此它适用于显示消息.

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

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

  • 我不明白为什么这个答案会被接受,这个答案是指定当用户点击通知时应该启动哪个Activity,问题是"如何在没有任何用户交互的情况下自动启动特定的Activity?" (7认同)
  • 还有一件事:Firebase Web控制台只能发送显示消息.要发送数据消息,您需要使用服务器端API. (5认同)
  • 是.要发送数据消息,您仍需要实施单独的应用服务器,因为Firebase Web控制台仅发送显示消息.如果您希望控制台支持数据消息,请发送功能请求:https://firebase.google.com/support/contact/bugs-features/ (4认同)
  • @stevyhacker为了进行测试,您可以使用[Google Advanced REST Client](https://chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo)工具,并将您的json消息发送到`https:// fcm.googleapis.com/FCM/send`.一个例子是[这里](http://i.imgur.com/MIOuj2U.png) (4认同)

Kat*_*ato 17

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

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

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

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

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

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

<intent-filter>
  <action android:name="OPEN_ACTIVITY_1" />
  <category android:name="android.intent.category.DEFAULT" />
</intent-filter>
Run Code Online (Sandbox Code Playgroud)

  • 刚才我尝试了GCM,它适用于我的用例没有问题,太糟糕的FCM不支持这个. (3认同)
  • 这不是问题的答案,我们需要在没有用户交互(例如点击通知)的情况下自动启动活动。 (2认同)

tha*_*h84 8

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

步骤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));
}
}
Run Code Online (Sandbox Code Playgroud)

现在再次使用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"
   },
 } 
Run Code Online (Sandbox Code Playgroud)

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

YOUR_DEVICE_FCM_TOKEN已FirebaseInstanceId.getInstance().getToken()开启onTokenRefresh()

注意

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