Firebase Cloud Messaging 多次发送上游消息,尽管我发送了确认

Posted

技术标签:

【中文标题】Firebase Cloud Messaging 多次发送上游消息,尽管我发送了确认【英文标题】:Firebase Cloud Messaging sends upstream message multiple times, although I send Acknowledge 【发布时间】:2016-11-24 16:25:01 【问题描述】:

我正在开发一个通过 FCM 将数据发送到我的服务器的应用程序。根据the Firebase Docs,我需要发送一条如下所示的 ACK 消息:

<message id="">
  <gcm xmlns="google:mobile:data">
  
      "to":"REGID",
      "message_id":"m-123"
      "message_type":"ack"
  
  </gcm>
</message>

我的服务器接收到我从我的 android 应用程序发送的消息,并发送此确认消息:

<message to="devices@gcm.googleapis.com" id="R88Ub-10">
    <gcm xmlns="google:mobile:data">
    
        "to":"dpDymtuUdEO-...-MRDQvLXMhfnEEUqEYZfs",
        "message_id":"64cc690-...-227a0b7eb61",
        "message_type":"ack"
    
    </gcm>
</message>

(“-...-”部分只是为了缩短/匿名化代码)

但是如果我重新启动我的服务器,我会收到一些我已经收到的消息,并且已经发送了一个 ACK​​……我在标签中没有“to”和“id”的情况下进行了测试,但似乎没有任何效果。

我在 ACK 消息中使用的“to”是我想要 ACK 的消息的“from”。

我做错了什么?我使用Smack 作为 XMPP 库。

【问题讨论】:

【参考方案1】:

在与 Firebase 团队联系后,我们发现将消息的 TTL(生存时间)设置为“0”会有所帮助。发送 FCM 消息的代码现在如下所示:

                 fcm.send(new RemoteMessage.Builder(FCMConstants.SENDER_ID + "@gcm.googleapis.com")
                  .setMessageId(msgid)
                  .setData(data)
                  .setTtl(0)
                  .build());

【讨论】:

以上是关于Firebase Cloud Messaging 多次发送上游消息,尽管我发送了确认的主要内容,如果未能解决你的问题,请参考以下文章

Flutter Firebase Cloud Messaging onMessage 被触发两次

Google Cloud Messaging与Firebase

Firebase Cloud Messaging:Firebase Admin SDK 中的设备组发送支持

如何使用 Firebase Cloud Messaging 在前台显示多个通知

Firebase Cloud Messaging 无法在带有 Flutter 应用程序的 Android 上运行

如何使用 Firebase Cloud Messaging 向所有设备发送通知