Firebase FCM通知和折叠密钥

Firebase FCM通知和折叠密钥,firebase,firebase-cloud-messaging,firebase-notifications,Firebase,Firebase Cloud Messaging,Firebase Notifications,我通过Firebase通知控制台向用户Android设备发送通知,我注意到即使在用户设备离线时我发送10个不同的通知,一旦用户上线,她/他将收到所有10个通知 然而,Firebase文件中指出: FCM允许每个设备在任何给定时间最多使用四个不同的折叠密钥。换句话说,FCM连接服务器可以在每个设备上同时存储四个不同的可折叠发送到同步消息,每个消息具有不同的折叠密钥。如果超过此数字,FCM只保留四个折叠键,不保证保留哪一个键 那么,用户不应该只收到4个通知吗?我错过什么了吗?(我没有扩展Fireba

我通过Firebase通知控制台向用户Android设备发送通知,我注意到即使在用户设备离线时我发送10个不同的通知,一旦用户上线,她/他将收到所有10个通知

然而,Firebase文件中指出:

FCM允许每个设备在任何给定时间最多使用四个不同的折叠密钥。换句话说,FCM连接服务器可以在每个设备上同时存储四个不同的可折叠发送到同步消息,每个消息具有不同的折叠密钥。如果超过此数字,FCM只保留四个折叠键,不保证保留哪一个键

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

更新:如果您没有在Firebase通知控制台中指定折叠键,则似乎为通知分配了一个隐式折叠键,这就是应用程序的包名。我通过检查
getIntent().getExtras()
键集的所有键/值对测试了这一点,一旦我通过点击通知启动应用程序。实际上,我得到了一个带有包名值的
collapse\u键
键,即使我没有指定一个

更新2:我尝试通过扩展
FirebaseMessagingService
来处理通知,以便在应用程序位于前台时从通知控制台接收消息。我收到通知消息并手动向用户显示通知。猜猜看。折叠键工作得很好!即使使用同一折叠键发送多个通知,我也会收到一个通知这显然只在应用程序位于前台时发生,因为Firebase SDK在应用程序位于后台时不调用
onMessageReceived()
,而是自己处理通知。这是否意味着这是Firebase SDK的一个bug?(因为只有SDK显示通知时才会发生问题)


所以问题仍然存在,为什么我会收到所有10个通知,因为每个通知都有相同的折叠键?可能是FCM的错误?

在阅读了帖子和评论之后,我并不完全清楚已经尝试过的每件事,哪些努力成功了,哪些失败了。我会涵盖一些项目,如果项目和希望有什么是有益的

您的帖子表明,对于某些测试,您在Firebase控制台中编写消息时指定了折叠键。这是不可能的。如果打开“高级选项”并在“自定义数据”下输入密钥/值对,则该操作将不起作用。这些值存储在消息的
数据
键下,而不是必须出现
折叠键
的消息顶层。此外,还包括一条警告,即
数据
键不应是表中的任何保留字,特别是引用
折叠键

键不应该是保留字(“from”或任何以 使用“谷歌”或“gcm”)。请勿使用本手册中定义的任何词语 表(例如折叠\u键

正如您文章的注释中所述,控制台会自动分配一个作为包名的折叠键,因此不需要用户输入折叠键

也就是说,我对控制台的体验与你的相符。我通过只输入消息文本和设备令牌来创建消息。我看不到折叠处理;每个消息都由设备接收。根据我在下面描述的测试中的经验,这似乎是控制台的问题,而不是一般的崩溃处理。这很奇怪,因为如果我在应用程序位于前台时发送消息,并且调用了
onMessageReceived()
,那么我就有调试日志记录,可以使用输出消息中的折叠键。该输出确认密钥存在,并且是我的应用程序包名称

您指出您做了一些从云函数发送通知的测试。我自己对这个云函数进行了测试,并观察到预期的消息崩溃:

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');
  });
});
我还使用浏览器应用程序高级Rest客户端发送了此消息,并看到正确的消息正在崩溃:

{
  "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}]

好。。。如果你的通知没有折叠键,那么它们就不会折叠。我是这么想的,但后来我读到了:这说明通知有一个隐式折叠键。出于测试目的,我只是关闭Wi-Fi 1或2分钟。我仍然没有弄清楚,如果我没有指定折叠键,是否有一个隐式键?或者没有折叠键,意味着所有通知都不会折叠?谢谢你的评论,@AL我测试了1小时的间隔,但仍然没有改变-Ashutosh我通过Firebase控制台(notifications composer)发送通知,而不添加除默认键以外的任何其他键-大约一周前,我做了一些测试,我肯定使用了4个以上的折叠键,但从那以后我没有指定一个。这会破坏通知吗?嗯。我可能会在我这边试试,看看是否可以复制它。同时,您是否可以尝试从您的应用程序服务器发送
通知
消息,或者直接使用并了解这会带来什么不同?嗨,鲍勃,您完全正确。我在自定义数据中指定了collapse_键,现在您这么说了,它没有意义。因此,正如您所说,您不能在通知控制台指定折叠密钥。但由于通知不会崩溃,这肯定是Fi的一个缺陷