【问题标题】:Firebase Data message not handled by FirebaseMessagingService when app is in Doze mode当应用程序处于打盹模式时,FirebaseMessagingService 未处理 Firebase 数据消息
【发布时间】:2019-02-06 16:47:49
【问题描述】:

我正在使用 Firebase 向我的应用发送“数据”消息,但是当应用处于打盹模式时,FirebaseMessagingService 不会处理这些消息,即使我的应用被列入白名单以进行电池优化并且我的消息被标记为优先级。

Firebase docs 为什么我选择“数据”消息而不是通知。

Android mechanism 将应用添加到白名单并跳过电池优化。

Firebase priority messages 根据文档。

我遵循所有这些步骤,即使在此之后,消息也不会传递给我的 FirebaseMessagingService 实现。

知道如何强制 FirebaseMessagingService 处理消息,即使在打盹模式下?

注意:我正在开发一个 VoIP 应用程序,如果消息没有立即传递,它就不再有效并且失去了它的目的。

【问题讨论】:

  • 一段时间后我们发现了问题。在服务器端,不是实现最新的 API,而是实现了旧的 API。他们有一个不同的有效载荷,可以在这里看到:firebase.google.com/docs/cloud-messaging/… 基本上而不是:"android":{ "ttl": "0s", "priority": "high" } 我们必须使用:"priority": 10, "time_to_live": 0
  • 如阅读文档,time_to_leave 表示接收 fcm 通知的最长时间,为什么将其设置为 0?
  • 嗨,根据文档Firebase TTL 指定消息的生命周期的另一个优点是 FCM 从不限制生存时间值为 0 秒的消息。换句话说,FCM 保证“现在或永远”必须传递的消息尽最大努力。请记住,time_to_live 值为 0 意味着无法立即传递的消息将被丢弃。但是,由于此类消息从不存储,因此这为发送通知消息提供了最佳延迟。

标签: android firebase firebase-cloud-messaging


【解决方案1】:

如果您遵循所有文档,则 FCM 可能仍会降低您的消息的优先级,如 documentation 中所述:

高优先级消息通常会导致用户交互 与您的应用程序或其通知。如果 FCM 检测到一种模式,其中 他们没有,您的消息可能会被取消优先级。 Android P 介绍 限制 FCM 高优先级数量的应用备用存储桶 您可以发送到您的应用但不会导致用户使用的消息 您的应用程序或查看通知。如果,响应高优先级 消息,通知以一种对用户可见的方式显示 用户,那么您的应用备用存储桶配额将不会被该用户消耗 消息。

没有“强制”模式可以让您在文档中规定的规则之上进行操作。如果任何人都可以简单地绕过规则,那么每个人都会这样做,而这些规则对于最终用户来说将变得毫无用处,他们只是试图从不遵循最佳实践的应用程序中节省电池电量。

【讨论】:

  • 嗨,谢谢反馈。我明白你的意思,必须遵守规则,我认为我在这种情况下正在做什么。作为 VoIP 应用程序,它符合添加到白名单的要求。此外,我们没有消耗额外的电池,因为应用程序没有在后台运行,我们使用 firebase 在必要时触发应用程序。我也可以假设消息没有被降低优先级,因为在后台,没有打盹模式时,它们会立即被接收。当我运行时:“adb shell dumpsys deviceidle unforce”消息会立即传递。看起来像一个错误或过度控制。
【解决方案2】:

一段时间后我们发现了问题。

在服务器端,没有实现最新的 API,而是实现了旧的 API。

他们有不同的有效载荷,可以在这里看到:Firebase Payload

基本上不是:

"android":{
    "ttl": "0s", 
    "priority": "high"
} 

我们不得不使用:

"priority": 10,
"time_to_live": 0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-20
    • 2019-08-27
    • 1970-01-01
    • 1970-01-01
    • 2020-09-24
    • 2016-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多