关于firebase:FCM通知和collapse_key

FCM notifications and collapse_key

我正在通过Firebase通知控制台向用户Android设备发送通知,我注意到即使用户设备离线时发送10条不同的通知,一旦用户上线,他/他也将收到全部10条通知。

但是,在Firebase文档中指出:

FCM allows a maximum of four different collapse keys per device to be used by the app server at any given time. In other words, the FCM connection server can simultaneously store four different collapsible send-to-sync messages per device, each with a different collapse key. If you exceed this number, FCM only keeps four collapse keys, with no guarantees about which ones are kept.

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

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

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

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


在阅读了帖子和评论之后,我还不清楚所有尝试过的事情,哪些成功或失败的尝试。如果有项目,我会讲一些数字,希望对您有所帮助。

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

The key should not be a reserved word ("from" or any word starting
with"google" or"gcm"). Do not use any of the words defined in this
table (such as collapse_key).

如帖子评论中所述,控制台会自动分配一个折叠键(即程序包名称),因此不需要用户输入折叠键。

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

您指示您进行了一些测试,以从云功能发送通知。我使用此云功能进行了自己的测试,并观察到预期的消息崩溃:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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发送了此消息,还看到了正确的消息崩溃:

1
2
3
4
5
6
7
8
{
 "to":"dK1FjGbNr6k:APA91bH7Vz3x...O56sJ7rAqOXRI",
 "collapse_key":"green",
 "notification": {
   "title":"Message",
   "body":"Just one please!"
  }
}

我还将分享Firebase在收到通知消息时发出分析日志消息的情况。当您希望获得接收到的消息计数时,这对于测试非常有用:

1
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}]