数据消息与通知消息(可折叠和不可折叠的混淆)

iDe*_*ode 7 android firebase flutter firebase-cloud-messaging

数据消息:

文件说:

不可折叠:每条消息对客户端应用程序都很重要并且需要传递。除通知消息外,所有消息默认都是不可折叠的。

这意味着数据消息是不可折叠的并且被认为是重要的。然而,文档还说:

当您的应用程序处于后台或终止时,设备会将纯数据消息视为低优先级,并将被忽略。

那么,它们实际上是否重要?如果重要,那么例如,如果应用程序在后台,它们为什么会被忽略。


通知消息:

文件说:

除通知消息外,所有消息默认都是不可折叠的。

我通过 Firebase 通知编辑器发送两条通知消息,并且是可折叠的,旧消息应该折叠(或被最新消息替换),但我可以看到这两条通知都显示在 Android 和 iOS 上。

那么,为什么通知消息被认为是“可折叠的”呢?

Mau*_*ani 8

非常有趣的问题!

看起来这些文档令人困惑,并且在某些地方有些矛盾。

我做了一些挖掘,以下要点应该可以消除您的一些疑虑:

可折叠消息是什么意思?

文档中的官方定义:

可折叠消息是如果尚未传送到设备则可以被新消息替换的消息。

让我们用一些细节来扩展上面的定义:

可折叠消息概念仅适用于消息已排队尚未传递给接收方的情况。(消息排队的原因可能是因为接收者可能无法访问互联网,或者他们的手机已关闭等。) 这意味着在消息排队的情况下,如果消息折叠,您可能只会收到接收方重新上线后收到的最新消息。

让我们举个例子:接收者的互联网连接关闭,我们发送了三条消息,A,B和C。现在,当接收者打开他的互联网时,他只会收到一条消息,C,如果消息是可折叠的。

但是,需要注意的是,如果接收方已经收到一条消息,比如说消息 A,那么当您发送 B 时,它不会替换已经发送给接收方的消息 A。


通知消息总是可折叠的?

不完全正确。

当我们从文档中阅读这一行时,我们相信通知消息始终是可折叠的。

除通知消息外,所有消息默认都是不可折叠的。

但是,当我尝试从 Firebase 控制台通过通知编辑器发送多条通知消息(在发送之前关闭接收器设备上的互联网)时,我发现当重新上线时,我会收到我发送的所有消息。这让我们相信通知消息是不可折叠的!

但这只是故事的一半!

当您通过其他方式(例如使用 FCM Post API)发送通知消息时,您只能从队列中获取最新消息。这意味着通知消息是可折叠的!

结论:通知消息在通过通知编辑器发送时是不可折叠的,其余情况下,它们是可折叠的。(文档没有在任何地方明确说明这一点)


数据消息是不可折叠的,这意味着它们很重要,对吗?

显而易见的答案似乎是肯定的!但这不是正确的答案。

重要消息应作为不可折叠消息发送。但是,不可折叠并不等于重要的消息!

原因?

这个解释有两个方面,

  1. 可折叠/不可折叠消息隔离仅定义为决定是否仅最新消息对用户重要,或者到目前为止发送的所有消息对用户重要。
  2. 这并不意味着不可折叠消息将作为重要消息以高优先级传递。您仍然需要考虑取决于平台特定规则的消息优先级。

因此,如果消息可以传递给接收者,那么可折叠/不可折叠的概念就出现了。消息能否按时送达与消息优先级、操作系统限制等完全是不同的领域。