FCM通知和折叠键

16

我通过Firebase通知控制台向用户的Android设备发送通知,即使当用户设备处于离线状态时我发送了10个不同的通知,一旦用户上线,她/他将会收到所有10个通知。

然而,在Firebase文档中指出:

FCM允许应用服务器在任何给定时间使用最多四个不同的折叠键(collapse key)来向每个设备发送同步消息。换句话说,FCM连接服务器可以同时存储每个设备的四个不同可折叠的发送-同步消息,每个消息都有一个不同的折叠键。如果超过此数量,则FCM仅保留四个折叠键,无法保证保留哪些折叠键。

所以用户只应该收到4条通知,我错过了什么吗?(我没有扩展FirebaseMessagingService,我将通知处理留给SDK)

更新:如果你在Firebase通知控制台中没有指定折叠键,则似乎会分配一个隐式的折叠键给通知,这是应用程序的包名。我通过检查getIntent().getExtras()关键字集合中的所有键/值对来测试它,一旦我点击通知启动应用程序。确实,我得到了一个带有包名值的collapse_key键,即使我没有指定它。

更新2:我尝试通过扩展FirebaseMessagingService来处理通知,这样当应用程序在前台时,我就能从通知控制台接收消息了。我收到了通知消息并手动向用户显示了通知。你猜怎么着。折叠键很好用!即使我发送了具有相同折叠键的多个通知,我也只会收到一个通知。但是,显然,只有当应用程序在前台时才会发生这种情况,因为Firebase SDK在应用程序处于后台时不会调用onMessageReceived(),而是自己处理通知。这是否意味着这是Firebase SDK的一个漏洞?(因为问题只发生在SDK显示通知时)

问题仍然存在,由于每个通知都具有相同的折叠密钥,为什么我会收到全部10个通知?可能是FCM的错误?


1
好的...如果你的通知没有折叠键,那么它们就不会被折叠。 - Uli
1
那是我之前的想法,但后来我读到了这篇文章:https://stackoverflow.com/questions/39655543/does-a-notification-message-count-towards-the-collapse-key-limit,其中提到通知具有隐式折叠键。 - steliosf
1
为了测试目的,我只是关闭Wi-Fi 1或2分钟。我仍然没有弄清楚,如果我不指定折叠键,是否有隐含的折叠键?或者没有折叠键,意味着所有通知都会被传递而不折叠? - steliosf
1
感谢您的评论,@AL。我测试了1小时间隔,但仍然是一样的。-Ashutosh 我通过Firebase控制台(通知合成器)发送通知,没有添加除默认密钥以外的任何其他密钥。-Kato 大约一周前,我进行了一些测试,我肯定使用了超过4个折叠键,但自那时以来我没有指定一个。这可能会破坏通知吗? - steliosf
1
嗯,我可能会在我的端上尝试并看看是否能够复制它。同时,您也可以尝试从您的应用服务器发送“通知”消息,或者只需使用Postman或cURL来查看是否有所不同。 - AL.
显示剩余9条评论
1个回答

10

阅读了帖子和评论后,我对已尝试的一切、哪些努力成功了以及哪些失败了还不是完全清楚。我将涵盖一些项目,并希望有所帮助。

您的帖子表明,在某些测试中,您在Firebase控制台中撰写消息时指定了折叠密钥。这是不可能的。如果您打开了高级选项并在自定义数据下输入了一个键/值对,那是行不通的。这些值存储在消息的data键下,而不是必须出现collapse_key的消息顶层。此外,文档中的表1包括一个警告,即data键不应是表格中保留字之一,特别是引用collapse_key

该键不应是保留字(“from”或任何以“google”或“gcm”开头的单词)。不要使用此表中定义的任何单词(例如collapse_key)。

正如您在帖子的评论中所指出的,控制台会自动分配折叠键,该键是包名,因此不需要用户输入折叠键。
尽管如此,我的经验与您相似。我只需输入“消息文本”和设备令牌即可创建消息。我看不到任何折叠处理;每条消息都被设备接收。根据我下面描述的测试的经验,这似乎是控制台的问题,而不是折叠处理的问题。这很奇怪,因为如果我在应用程序处于前台时发送消息,并调用onMessageReceived(),我有一个调试日志,使用getCollapseKey()输出消息中的折叠键。该输出证实了键存在并且是我的应用程序包名称。
您提到您进行了一些从云函数发送通知的测试。我使用此云函数进行了自己的测试并观察到了预期的消息折叠。
exports.test = functions.database.ref('/test').onWrite(event => {
  const token = 'dK1FjGbNr6k:APA91bH7Vz3x...icGO56sJ7rAqOXRI';

  console.log('Sending notification...');

  const payload = {
    notification: {
      title: 'Message',
      body: 'Just one please!'
    }
  };

  const options = {
    collapseKey: 'green'
  };

  return admin.messaging().sendToDevice(token, payload, options).then(response => {
    console.log('Done');
  });
});

我也使用浏览器应用程序Advanced Rest Client发送了这条消息,并且也看到了正确的消息折叠:

{
  "to": "dK1FjGbNr6k:APA91bH7Vz3x...O56sJ7rAqOXRI",
  "collapse_key": "green",
  "notification": {
    "title": "Message",
    "body": "Just one please!"
  }
}

我还要分享一点,就是Firebase在接收到通知消息时会发出一条分析日志信息。这对于测试非常有用,当你想获得接收到消息的计数时:

D/FA: Logging event (FE): notification_receive(_nr), Bundle[{firebase_event_origin(_o)=fcm, message_device_time(_ndt)=0, message_time(_nmt)=1498227476, message_id(_nmid)=6447126672094369335}]

嗨Bob,你说得完全正确。我在自定义数据中指定了collapse_key,现在你这么说,这没有意义。所以像你说的那样,在通知控制台上不能指定collapse_key。但由于通知不会折叠,这绝对是Firebase的一个bug。然而,我的猜测是这是Firebase Android SDK的一个bug(不确定你是否使用Android或iOS),而不是Firebase控制台的问题。我将在下一条评论中继续。 - steliosf
@MScott:我所有的测试都使用了安卓设备。鉴于当消息来自云函数时折叠功能是正常的,我不认为问题可能出在客户端处理上。 - Bob Snyder
1
起初,我使用Firebase控制台和Cloud Function发送通知。但是我没有扩展FirebaseMessagingService。我让SDK处理通知。好吧,无论通知来自控制台还是云功能,通知都不会折叠。但是当我实现了MyFirebaseMessagingService时,折叠键现在可以在控制台和我的云功能中工作,但只有当应用程序在前台时,因为当应用程序在后台时,通知消息不会调用onMessageReceived() - steliosf
@MScott:我没有看到那种行为。在onMessageReceived()中添加一些日志输出,以清楚地指示接收到的消息数量。如果您在生成通知时使用相同的ID,则会无意中将它们折叠起来。NotifcationManager将把具有相同ID的多个调用视为对现有通知的更新,而不是创建另一个通知。 - Bob Snyder
你能帮我解决这个问题吗?链接在这里 - Joan P.
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接