首页 文章

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

提问于
浏览
29

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

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

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

4 回答

  • 49

    快速回答:

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

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

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

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

    完整解释:

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

    • display-messages:
      有效载荷 {"notification" : { "body" : "hello world"}}
      这些消息是 automatically displayed when the app is in background ,如果应用程序已经在前台,则会调用 FirebaseMessagingService.onMessageReceived() .

    • data-messages:
      有效载荷 {"data" : { "key1" : "value1"}}
      这些消息 always invoke FirebaseMessagingService.onMessageReceived()
      即使应用程序已关闭或在后台运行 .

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

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

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

  • 1

    看起来this section of the guide是背景应用程序难题的关键:

    接收消息使用扩展FirebaseMessagingService的服务 . 您的服务应覆盖为大多数消息类型提供的onMessageReceived回调,但以下情况除外:当您的应用在后台时发送的通知 . 在这种情况下,通知将传递到设备的系统托盘 . 用户点按通知会默认打开应用启动器 . 具有通知和数据有效负载的消息 . 在这种情况下,通知将传递到设备的系统托盘,并且数据有效负载将在启动器活动的附加内容中传递 .

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

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

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

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

    STEP 1

    关于FCM user guide . 通过从Firebase console推送消息确保一切正常 .

    STEP 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步 .

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

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

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

    NOTE

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

  • 7

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

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

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

相关问题