【问题标题】:How to make a GCM / FCM notification-type message non-collapsible如何使 GCM / FCM 通知类型消息不可折叠
【发布时间】:2018-10-21 14:56:50
【问题描述】:

Google Cloud Messaging (GCM) 支持两种类型的推送消息:“通知”消息和“数据”消息。根据the documentation,通知消息默认是可折叠的,而数据消息默认是不可折叠的。

为了使数据消息可折叠,您需要指定collapseKey。我的问题是:如何使通知消息不可折叠?

注意:该问题也适用于 Firebase 云消息传递 (FCM)。

【问题讨论】:

  • 你找到解决办法了吗?
  • 只是使用了数据消息
  • 好的.. 'setBackgroundMessageHandler' 也不适用于 v6.0+.. 有什么想法吗?当应用程序被杀死时,我想在应用程序内获取数据消息。
  • 我正在使用数据有效负载并且遇到相同的问题,通知会更新前一个。如何将 collapse_key 与数据一起使用?它不工作!

标签: android firebase push-notification google-cloud-messaging firebase-cloud-messaging


【解决方案1】:

message concepts and options documentation 声明:

默认情况下消息不可折叠,通知消息除外,通知消息始终可折叠

但后来在同一页上,它继续说:

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

这有点模棱两可。但是,在payload section 中,它指出:

[通知消息] 可能有可选的数据负载。 始终可折叠

因此,似乎不可能使通知消息不可折叠。

我建议这是设计使然,因为在 Android 中创建通知时,它们是 automatically replaced when another notification with the same ID is posted(类似于折叠消息的工作方式)。如果我没记错的话,FCM/GCM 对所有通知消息使用相同的 ID。

可能的解决方案

如果您确实需要不可折叠的通知消息,我建议发送仅数据负载(没有通知或collapseKey),然后覆盖onMessageReceived() from the FirebaseMessagingService 以创建您自己的通知。

Android quickstart sample 上有一个示例:

@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() method

对于您的场景,您需要将唯一 ID 传递给 notificationManager.notify() 调用,以便 Android 创建新通知并且不会替换任何现有通知 - 因此,使消息不可折叠。

【讨论】:

  • 是的,这是我已经在使用的解决方法(发送“数据”有效负载并在应用程序中处理它),但我想知道“通知”消息是否可以设为不可折叠.正如你所说,文档对此有点模棱两可。
  • @Grodriguez 这似乎是唯一可行的方法,我从文档中得到的印象是,notification 有效负载更像是一个简单的帮助服务,可以快速轻松地发送通知,而不是比首选方法。使用 FCM 的首选/高级方法是发送 data-only 有效负载,对收到的消息执行一些逻辑,然后在需要时创建自己的通知。我敢打赌,我的答案中的第三句话是确定的:notification 消息总是可折叠的。
  • @Grodriguez 你找到解决办法了吗?
【解决方案2】:

首先,将FCM docs reference here

不可折叠消息表示每个单独的消息都被传递到设备。不可折叠消息会传递一些有用的内容,而不是像无内容“ping”这样的可折叠消息,向移动应用程序联系服务器以获取数据。

根据您的问题——“如何使通知消息不可折叠?”——您是否为发送的每条 notification 消息指定了不同的 collapse_key? p>

可折叠消息的工作方式就像每条消息都具有相同 collapse_key。但是,如果您为每条消息指定不同的消息,那么它将无法替换前一条消息。这将使notification 消息表现类似于不可折叠消息。

但是,由于您使用的是collapse_key,因此从技术上讲,它仍被视为可折叠消息。这意味着它仍然受到一次四个折叠键的限制:

FCM 允许应用服务器在任何给定时间最多使用四个不同的折叠键。换句话说,FCM 服务器可以同时存储每个设备的四个不同的可折叠消息,每个具有不同的折叠键。如果超过此数量,FCM 仅保留四个折叠键,不保证保留哪些。

说了这么多,有什么理由不只是使用data 消息负载?我们在我们的应用中使用它,我发现它比notification 消息更灵活。

【讨论】:

  • "如果您为每条消息指定不同的 (collapse_key),那么它将无法替换之前的消息。这会使通知消息的行为类似于不可折叠消息。"你真的尝试过这个,还是只是一个假设?
  • 我自己没试过。但这应该是预期的行为。 FCM 没有任何最佳实践,AFAIK。但我强烈建议您只使用data 消息有效负载。如果您仍然怀疑这种行为,为什么不直接测试一下呢?
猜你喜欢
  • 2017-04-10
  • 2021-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多