我通过Firebase Notification控制台向用户Android设备发送通知,我注意到即使我在用户设备离线时发送10个不同的通知,一旦用户上线,她/他将收到所有10个。
但是在Firebase文档中声明:
FCM允许应用服务器在任何给定时间使用每个设备最多四个不同的折叠键。换句话说,FCM连接服务器可以同时为每个设备存储四个不同的可折叠发送到同步消息,每个消息具有不同的折叠密钥。如果超过此数字,FCM仅保留四个折叠键,不保证保留哪些键。
那么用户不应该只收到4个通知吗?我错过了什么吗? (我没有扩展FirebaseMessagingService
,我将通知处理留给SDK)
更新:如果您未在Firebase通知控制台中指定折叠键,则似乎会为通知指定隐式折叠键,即包名称的应用。我通过点击通知启动应用,检查了getIntent().getExtras()
密钥集的所有键/值对,然后对其进行了测试。事实上,即使我没有指定包名,我也会得到一个collapse_key
密钥和包名的值。
更新2 :我尝试通过扩展FirebaseMessagingService
来处理通知,以便在应用处于前台时从通知控制台接收消息。我收到通知消息,并手动向用户显示通知。你猜怎么着。折叠键很棒!即使我使用相同的折叠键发送多个通知,我也会收到一条通知。 但是这种情况显然只有在应用程序位于前台时才会发生,因为Firebase SDK在应用程序处于后台时不会调用onMessageReceived()
,而是处理通知本身。这是否意味着这是Firebase SDK的错误? (因为问题仅在SDK显示通知时发生)
所以问题仍然存在,为什么我会收到所有10个通知,因为每个通知都有相同的折叠键?也许是一个FCM错误?
答案 0 :(得分:5)
在阅读了帖子和评论之后,我并未完全清楚已经尝试过的所有内容,哪些内容是成功的,哪些内容都失败了。如果是项目,我会覆盖一个数字并希望有所帮助。
您的帖子表明,对于某些测试,您在Firebase控制台中编写邮件时指定了折叠键。这是不可能的。如果您打开高级选项并在自定义数据下输入了一个键/值对,则无效。这些值存储在data
键下的消息中,而不是在必须出现collapse_key
的消息的顶层。此外,Table 1 in the documentation还包含一条警告,指出data
个键不应该是表格中的任何保留字,特别是引用collapse_key
:
密钥不应该是保留字("来自"或任何单词起始 用" 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}]