【问题标题】:FCM notifications and collapse_keyFCM 通知和 collapse_key
【发布时间】:2017-06-14 18:39:16
【问题描述】:

我正在通过 Firebase 通知控制台向用户 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 错误?

【问题讨论】:

  • 嗯...如果您的通知没有折叠键,那么它们就不会折叠。
  • 嗯,这就是我的想法,但后来我读到了这个:stackoverflow.com/questions/39655543/… 声明通知具有隐式折叠键。
  • 出于测试目的,我只是将 Wi-Fi 关闭 1 或 2 分钟。我还没想通,如果我不指定折叠键,有隐含的吗?或者没有折叠键,意味着所有通知都在不折叠的情况下传递?
  • 感谢您的 cmets,@AL 我测试了 1 小时的间隔,但仍然相同。 -Ashutosh 我通过 Firebase 控制台(通知作曲家)发送通知,而不添加除默认键之外的任何其他键。 -Kato 大约一周前,我做了一些测试,我肯定使用了超过 4 个折叠键,但从那以后我没有指定一个。这会破坏通知吗?
  • 嗯。我可能会在最后尝试一下,看看是否可以复制它。与此同时,您是否也可以尝试从您的应用服务器发送notification 消息,或者只使用Postman or cURL 看看有什么不同?

标签: firebase firebase-cloud-messaging firebase-notifications


【解决方案1】:

在阅读了帖子和 cmets 之后,我对所有尝试过的事情并不完全清楚,哪些努力成功了,哪些失败了。如果有项目,我会介绍一些数字,希望对您有所帮助。

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

键不应是保留字(“from”或任何开头的字) 与“谷歌”或“gcm”)。不要使用本文中定义的任何词语 表(例如 collapse_key)。

正如您帖子中的 cmets 所述,控制台会自动分配一个作为包名称的折叠键,因此不需要用户输入折叠键。

也就是说,我对控制台的体验与您的一致。我通过仅输入 消息文本 和设备令牌来创建消息。我看不到崩溃处理;设备接收每条消息。根据我对下面描述的测试的经验,这似乎是控制台的问题,而不是一般的崩溃处理。这很奇怪,因为如果我在应用程序处于前台时发送消息,并且调用了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}]

【讨论】:

  • 嗨,鲍勃,你是绝对正确的。我在自定义数据中指定了 collapse_key,既然你这么说,它就没有意义了。所以就像你说的,你不能在通知控制台上指定一个 collapse_key。但是由于通知不会崩溃,这绝对是 Firebase 的一个错误。但是,我猜这是 Firebase Android SDK 的错误(不确定您使用的是 Android 还是 iOS),而不是 Firebase 控制台的问题。我将在下一条评论中继续:
  • @MScott:我所有的测试都使用了 Android 设备。考虑到从云功能发送消息时崩溃会起作用,我看不出问题可能出在客户端处理中。
  • 起初我使用 Firebase 控制台以及云函数来发送通知。但我没有扩展FirebaseMessagingService。我让 SDK 处理通知。好吧,通知并没有崩溃,无论它们来自控制台还是云功能。但是当我实现MyFirebaseMessagingService 时,折叠键现在可以在控制台和我的云功能中使用,但仅在应用程序处于前台时才有效,因为当应用程序处于后台时,通知消息不会调用onMessageReceived()。跨度>
  • 您可以通过在设备的 Wi-Fi 关闭时从控制台发送 2 条通知消息来测试这一点。然后打开您的应用程序并在应用程序处于前台时打开 Wi-Fi。折叠键现在应该可以工作了,您应该只会收到 1 条通知(假设您正在 Firebase 服务中处理通知)。但如果应用程序在后台,则不会发生这种情况。因此,当我们通过扩展 FirebaseMessagingService 进行处理时,折叠键可以工作,但是当 Firebase 进行处理时,它们不会。
  • @MScott:我看不到这种行为。将一些日志输出添加到onMessageReceived(),以清楚地指示收到的消息数量。如果您在生成通知时使用相同的 ID,则您无意中折叠了它们。 NotifcationManager 会将具有相同 ID 的多个呼叫视为对现有通知的更新,而不是创建另一个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-04
  • 2018-06-13
  • 2017-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多