如何使GCM / FCM通知类型消息不可折叠

8
谷歌云消息传递(GCM)支持两种类型的推送消息:“通知”消息和“数据”消息。根据文档,通知消息默认是可折叠的,而数据消息默认是不可折叠的。
为了使数据消息可折叠,您需要指定一个collapseKey。我的问题是:如何使通知消息不可折叠?
注意:这个问题同样适用于Firebase云消息传递(FCM)。

你找到任何解决方案了吗? - user1517153
1
只需使用数据消息即可。 - Grodriguez
好的,'setBackgroundMessageHandler' 在 v6.0+ 上不起作用了。你有什么想法吗? 我想在应用程序被杀死时获取数据消息。 - user1517153
我正在使用数据有效载荷,但遇到了相同的问题,通知会更新先前的通知。如何在数据中使用collapse_key?它不起作用! - stefanosn
2个回答

2
消息概念和选项文档中说:

默认情况下,除了通知消息以外的所有消息都是不可折叠的,通知消息则始终可折叠。

但在同一页的后面,它又说:

除了通知消息以外,默认情况下所有消息都是不可折叠的。

这有些模糊不清。然而,在有效负载部分,它指出:

【通知消息】可能有可选数据有效负载。始终可折叠

因此,似乎不可能使通知消息不可折叠。
我建议这是有意设计的,因为在 Android 中创建通知时,它们会在另一个具有相同 ID 的通知发布时被自动替换(类似于折叠消息的工作方式)。如果我没记错的话,FCM/GCM 对所有通知消息都使用相同的 ID。
可能的解决方案是,如果您确实需要不可折叠的通知消息,建议发送仅包含数据的有效负载(没有通知或collapseKey),然后覆盖FirebaseMessagingService中的onMessageReceived()以创建自己的通知。
Android 快速入门示例中有一个示例。
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    // ...

    // Check if message contains a data payload.
    if (remoteMessage.getData().size() > 0) {
        Log.d(TAG, "Message data payload: " + remoteMessage.getData());

        // ...
    }

    // ...

    // Also if you intend on generating your own notifications as a result of a received FCM
    // message, here is where that should be initiated. See sendNotification method below.
}
最后一个评论指向了这个示例sendNotification() 方法
对于您的情况,您需要将唯一ID传递给notificationManager.notify()调用,以便Android创建新通知并不替换任何现有通知 - 因此使消息不可折叠。

是的,这已经是我正在使用的解决方法(发送“数据”有效负载并在应用程序中处理它),但我想知道是否可以使“通知”消息不可折叠。正如您所说,文档有点模糊不清。 - Grodriguez
@Grodriguez 这似乎是唯一可行的方法,而且从文档中我对 notification 负载的印象更多的是一个简单的辅助服务,用于快速轻松地发送通知,而不是首选方法。使用 FCM 的首选/高级方式是只发送 data-only 负载,在接收到消息后执行一些逻辑,如果需要则创建自己的通知。我敢打赌,我的回答中第3个引号是决定性的:notification 消息总是可以折叠的。 - Grimthorr
@Grodriguez,你找到解决方案了吗? - Grimthorr

1

首先,这里是FCM文档的参考

一个不可折叠的消息表示每个单独的消息都会传递到设备。与一个无内容的“ping”通知应用程序联系服务器以获取数据的可折叠消息不同,一个不可折叠的消息提供了一些有用的内容。

根据您的问题--"如何使通知消息不可折叠?"--你是否为发送的每个notification消息指定了不同的collapse_key

一个可折叠的消息的作用就像每个消息都有相同的collapse_key一样。但是,如果您为每条消息指定一个不同的collapse_key,那么它就不能替换上一条消息。这将使notification消息的行为类似于不可折叠的消息。

然而,由于您正在使用“collapse_key”,它在技术上仍被视为可折叠消息。这意味着它仍受到每次限制四个折叠键的限制:
FCM允许每个Android设备最多使用四个不同的折叠键,由应用服务器在任何给定时间使用。换句话说,FCM服务器可以同时存储每个设备的四个不同可折叠消息,每个消息都有一个不同的折叠键。如果超过此数字,FCM仅保留四个折叠键,并不保证哪些折叠键会被保留。
话虽如此,您为什么不只是使用“数据”消息负载呢?我们在我们的应用程序中使用它,我发现它比“通知”消息更灵活。

如果您为每条消息指定不同的(collapse_key),那么它将无法替换先前的消息。这将使通知消息的行为类似于不可折叠的消息。您是否尝试过这个,还是只是一个假设? - Grodriguez
我自己没有尝试过。但这应该是预期的行为。据我所知,FCM没有任何最佳实践。但我强烈建议您只使用“数据”消息负载。如果您仍然对行为有疑问,为什么不测试一下呢? - AL.
@AL. 如果IOS应用程序关闭,数据消息是否有效?根据我的阅读,如果应用程序被杀死,则无法在IOS设备上接收数据消息,这是真的吗? https://dev59.com/e1oT5IYBdhLWcg3wxx7g - Djai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接