【问题标题】:Firebase Cloud Messaging: strange message deliveryFirebase 云消息传递:奇怪的消息传递
【发布时间】:2016-06-20 19:40:55
【问题描述】:

我定义了 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 诊断”中看到该消息已被确认:

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

谁能解释一下?

【问题讨论】:

  • 您如何确定是否调用了 onMessageReceived? mgr.showNotification 有什么作用?
  • @Marcin 你有没有解决这个问题?

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


【解决方案1】:
当通过 Firebase 控制台发送消息时,

onMessageReceived(...) 方法将不会被调用如果应用程序处于后台或被杀死

但是如果您通过 API 发送消息,它可以正常工作。消息以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):您的项目 -> 设置 -> 项目设置 -> 云消息传递 -> 服务器密钥

【讨论】:

  • 感谢您的回答!我正在使用 API 发送消息。我尝试了数据消息和混合消息(包含通知和数据)。当我的应用程序未运行时,仍然不总是调用 onMessageReceived(...) :(.
  • @Marcin - 您在哪个 Android 版本上遇到此问题?你是在真机还是模拟器上测试?
  • 真机,三星S5,And5.0
  • 您能否发布类似于我的回答中给出的 API HTTP POST 请求?
  • @RBhagwat 下载一个名为 Advanced REST Client 的 chrome 扩展,并将 HTTP POST 请求数据放入字段中。这是链接:chrome.google.com/webstore/detail/advanced-rest-client/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-10
  • 2018-02-06
  • 1970-01-01
相关资源
最近更新 更多