Firebase云消息传递:奇怪的消息传递

时间:2016-06-20 19:40:55

标签: android google-cloud-messaging firebase-cloud-messaging

我定义了firebase服务:

public class MyFirebaseMessagingService extends FirebaseMessagingService {

    public void onMessageReceived(com.google.firebase.messaging.RemoteMessage remoteMessage) {
        mgr.showNotification("X:" + remoteMessage.getNotification().getTitle(), "X:" + remoteMessage.getNotification().getBody(), data);
    }

    @Override
    public void onDeletedMessages() {}
     @Override
    public void onMessageSent(java.lang.String s) {}
    @Override
    public void onSendError(java.lang.String s, java.lang.Exception e) {}
}

和android清单:

<service
    android:name=".integration.MyFirebaseMessagingService">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT"/>
    </intent-filter>
</service>

我注意到FCM有两种非常奇怪的行为:

  1. 有时调用onMessageReceived(),有时不调用。这取决于我的应用程序是否正在运行。无论如何,通知仍然显示(这就是为什么我添加了“X:”)

  2. 有时没有通知,根本没有调用onMessageReceived,但我可以在开发者控制台的“FCM诊断”中看到该消息已被确认:

  3. Current Status    Acknowledged
    Collapse Key  <key>
    TTL   2,419,200
    TIME  CURRENT STATUS
    20 Jun 17:35
    Device connected
    20 Jun 21:23
    Accepted
    20 Jun 21:23
    Delivered
    20 Jun 21:28
    Acknowledged
    

    有人可以解释一下吗?

1 个答案:

答案 0 :(得分:3)

当消息通过Firebase控制台发送时, onMessageReceived(...)方法将调用,如果该应用位于后台或已杀死

但是如果您通过API发送消息,它可以正常工作。无论app是在后台,前台还是已杀死,都会以onMessageReceived(...)方式传递消息。

FCM中有两种类型的消息:

  • 通知:当您的应用处于前台时工作
  • 数据有效负载:即使您的应用处于后台也能正常工作

参考:https://firebase.google.com/docs/cloud-messaging/downstream#sample-receive

更新:

如果您不知道如何使用API​​发送消息,可以使用名为AdvancedREST Client的工具,其Chrome扩展程序或类似工具,并使用以下参数发送消息。参考链接:https://firebase.google.com/docs/cloud-messaging/downstream

从服务器发送下游消息

要解决或“定位”下游消息,应用服务器将使用接收客户端应用的注册令牌设置为。您可以使用预定义字段或自定义数据消息发送通知消息;有关有效负载支持的详细信息,请参阅消息有效内容中的通知和数据此页面中的示例显示如何使用HTTP和XMPP协议发送数据消息。

HTTP POST请求

https://fcm.googleapis.com/fcm/send
Content-Type:application/json
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA

{ "data": {
    "score": "5x1",
    "time": "15:10"
  },
  "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
}

您可以从firebase控制台获取服务器密钥(AIzaSyZ-1u ... 0GBYzPu7Udno5aA):您的项目 - &gt;设置 - &gt;项目设置 - &gt;云消息传递 - &gt;服务器密钥