ste*_*osf 9 firebase firebase-cloud-messaging firebase-notifications
我通过Firebase Notification控制台向用户Android设备发送通知,我注意到即使我在用户设备离线时发送10个不同的通知,一旦用户上线,她/他将收到所有10个.
但是,在Firebase文档中,声明:
FCM允许应用服务器在任何给定时间使用每个设备最多四个不同的折叠键.换句话说,FCM连接服务器可以同时为每个设备存储四个不同的可折叠发送到同步消息,每个消息具有不同的折叠密钥.如果超过此数字,FCM仅保留四个折叠键,不保证保留哪些键.
那么用户不应该只收到4个通知吗?我错过了什么吗?(我没有扩展FirebaseMessagingService
,我将通知处理留给SDK)
更新:如果您未在Firebase通知控制台中指定折叠键,则似乎会为通知分配隐式折叠键,即应用程序的包名称.getIntent().getExtras()
一旦我通过点击通知启动应用程序,我已经通过检查密钥集的所有键/值对来测试了这一点.事实上,collapse_key
即使我没有指定一个密钥,我也会得到一个包名称值的密钥.
更新2:我尝试通过扩展来处理通知FirebaseMessagingService
,以便在应用程序位于前台时从通知控制台接收消息.我收到通知消息,并手动向用户显示通知.你猜怎么着.折叠键很棒!即使我使用相同的折叠键发送多个通知,我也会收到一条通知.但只有当应用程序在前台,因为火力地堡SDK不会调用这种情况显然onMessageReceived()
当应用程序在后台,而是它处理通知本身.这是否意味着这是Firebase SDK的错误?(因为问题仅在SDK显示通知时发生)
所以问题仍然存在,为什么我收到所有10个通知,因为每个通知都有相同的折叠键?也许FCM错误?
在阅读了帖子和评论之后,我并没有完全清楚已经尝试过的所有事情,哪些努力是成功的,哪些是失败的.我将覆盖一个数字,如果项目,并希望有用的东西.
您的帖子表明,对于某些测试,您在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');
});
});
Run Code Online (Sandbox Code Playgroud)
我还使用浏览器应用程序Advanced Rest Client发送此消息,并且还看到了正确的消息折叠:
{
"to": "dK1FjGbNr6k:APA91bH7Vz3x...O56sJ7rAqOXRI",
"collapse_key": "green",
"notification": {
"title": "Message",
"body": "Just one please!"
}
}
Run Code Online (Sandbox Code Playgroud)
我还将分享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}]
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
13297 次 |
最近记录: |