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错误?
-
好吧...如果您的通知没有折叠键,那么它们将不会折叠。
-
嗯,这就是我的想法,但是随后我读到了这篇文章:stackoverflow.com/questions/39655543/,其中指出通知具有隐式折叠键。
-
嗨MScott。只是好奇,设备可以离线运行多长时间?
-
为了进行测试,我只是关闭了1到2分钟的Wi-Fi。我仍然没有弄清楚,如果不指定折叠键,是否有一个隐式键?还是没有折叠键,这意味着所有通知都不会折叠而传递?
-
请检查我的问题的更新。
-
您可以尝试以不同的时间间隔(10分钟,30分钟,1小时)对其进行测试,看看其行为是否相同?如果是这样,则折叠键可能存在问题,如果没有,那么我的猜测是折叠键行为(如果消息超过四个,则为不合格)有特定的时间范围生效。
-
@MScott您可以共享您使用的推送通知格式吗,这些问题是否在不同的Android OS-N,M,L上?
-
这里一个重要的考虑因素是,如果您使用四个以上的折叠键,则该行为是不确定的。多数民众赞成在唯一的记录下来的行为似乎与您所描述的相似,并且可以解释未折叠的邮件。还要注意,只有通知类型的消息是折叠的。如果您使用其他消息类型,则不会折叠它们。
-
感谢您的评论,@ AL我测试了1个小时的间隔,但还是一样。 -Ashutosh Im通过Firebase控制台(Notifications编写器)发送通知,而不添加除默认密钥以外的任何其他密钥。 -Kato大约一周前,我进行了一些测试,我肯定使用了4个以上的合拢键,但是从那时起,我没有指定任何一个。会破坏通知吗?
-
嗯我可以尝试一下,看看是否可以复制它。同时,您是否还可以尝试从App Server发送notification消息,或者仅使用Postman或cURL来看看有什么不同?
-
我实际上还使用了Firebase云功能,该功能将通知发送给用户设备,而无需指定任何折叠键。它类似于Firebase追随者通知示例:github.com/firebase/functions-samples/blob/master/同样,相同的行为也是如此。我开始认为过去使用4个以上的折叠键可能会破坏通知。
-
发布您的云函数代码,其中显示对sendToDevice()的调用以及有效负载和选项对象。我尝试使用Firebase控制台复制您的结果,但根本无法崩溃。使用ARC(高级Rest客户端)可获得更好的结果。
-
我非常确定这不是云功能的问题,因为它与Firebase控制台中的Firebase通知编写器完全相同。因此,至少通知撰写者应该使用折叠键。顺便说一句,检查我的问题的第二次更新,我已经测试了如果扩展FirebaseMessagingService会发生什么
-
@Kato如果有时间,请检查我的问题的第二次更新。 TL; DR:当我在前台处理通知消息时,折叠键起作用。当Firebase处理后台的通知消息时,折叠键不起作用。
在阅读了帖子和评论之后,我还不清楚所有尝试过的事情,哪些成功或失败的尝试。如果有项目,我会讲一些数字,希望对您有所帮助。
您的帖子表明,对于某些测试,在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}] |
-
嗨,鲍勃,你绝对正确。我在自定义数据中指定了falling_key,现在您说出来了,这没有任何意义。因此,就像您说的那样,您不能在通知控制台上指定一个crash_key。但是,由于通知不会崩溃,因此这肯定是Firebase的错误。但是,我猜测这是Firebase Android SDK的错误(不确定是否使用Android或iOS),而不是Firebase控制台的问题。病态继续在下一条评论:
-
@MScott:我所有的测试都使用Android设备。鉴于从云功能发送消息时崩溃有效,因此我看不出客户端处理中的问题可能如何。
-
最初,我使用Firebase控制台以及Cloud Function发送通知。但是我没有扩展FirebaseMessagingService。我让SDK处理通知。好了,无论是来自控制台还是云功能,通知都不会崩溃。但是,当我实现MyFirebaseMessagingService时,折叠键现在既可以在控制台中使用,也可以从我的云功能中使用,但是仅在应用程序位于前台时才起作用,因为当应用程序位于后台时,通知消息不会调用onMessageReceived()。
-
您可以通过在设备Wi-Fi关闭时从控制台发送2条通知消息来进行测试。然后打开您的应用程序,并在应用程序处于前台时打开Wi-Fi。现在,折叠键应该可以使用,并且您应该只会收到1条通知(假设您在Firebase服务中处理了这些通知)。但是,如果应用程序在后台运行,则不会发生这种情况。因此,当我们通过扩展FirebaseMessagingService进行处理时,折叠键起作用,但是当Firebase进行处理时,折叠键不起作用。
-
@MScott:我看不到这种行为。将一些日志输出添加到onMessageReceived(),以获得对收到的消息数的清晰指示。如果在生成通知时使用相同的ID,则表示您无意中折叠了它们。 NotifcationManager将把具有相同ID的多个呼叫视为对现有通知的更新,而不是创建另一个。
-
你能帮我吗?
-
@BobSnyder这使我发疯,即使更改了Notificationmanager ID,我仍然收到崩溃的通知!怎么了!