FCM 高优先级消息如何以及在什么条件下被取消优先级?如何从服务器获取缓存的 FCM 消息?

use*_*527 9 android watchdog push-notification android-background firebase-cloud-messaging

根据FCM 文档,如果 FCM 服务器检测到高优先级消息不会导致用户交互的模式,则高优先级消息可能会被取消优先级。这种机制的细节没有具体说明。问题:

  • 这是如何工作的?
  • 检测算法如何收集数据?
  • 消息被取消优先级多长时间?

其次,Android 应用程序有一个方法可以检查最近收到的消息的时间。如果具有正常优先级的消息尚未传递但仍缓存在 FCM 服务器上,则此方法有时会报告错误的结果。题:

  • 如何让 Android 应用程序首先获取所有消息?

一些可选的背景信息:

我正在为某些安全关键应用程序编写监控应用程序。本地服务器可以处于两种互斥状态中的一种:“空闲”或“警报”。状态通过 FCM 发送到所有注册的客户端。为确保服务器仍在运行,状态会作为心跳定期广播。这些心跳消息以正常优先级发送。此外,每当状态从“空闲”变为“警报”时,都会立即发送具有高优先级的附加异常消息。例如,消息序列类似于

...  idle  idle  idle  *alarm*  alarm  alarm  alarm  idle  idle  ...
Run Code Online (Sandbox Code Playgroud)

由于连续第一条警报消息触发通知,而所有其他消息仅具有正常优先级,因此(希望)没有被 FCM 取消优先级的风险。

Android 应用程序包含一个PeriodicWorkRequest用作看门狗并检查心跳是否仍在传入的 。如果最近收到的消息太旧(超过 30 分钟),则会向用户显示“连接丢失”通知以警告他。

这是问题所在:

通常的心跳消息具有正常的优先级并缓存在 FCM 服务器上。看门狗发出错误的“连接丢失”通知。设备被唤醒(由于通知),突然收到最新的心跳消息(它们在服务器上折叠)。

我看到两个解决方案(或解决方法):

  • 将所有消息设为高优先级消息,以便立即传送它们并且看门狗始终看到最新的消息。但是,我担心 FCM 去优先级算法会起作用。(99,95% 是无聊的“空闲”消息)

  • 在看门狗检查最新消息的时间并最终发出警告之前,我必须以编程方式确保已获取所有消息。

边注:

我完全理解为什么谷歌对后台执行和异步任务实施越来越多的限制。(广播接收器或多或少变得无用,AlarmManager 受到限制,JobScheduler 可以推迟,Android 9 引入了“备用桶”的概念。)许多开发人员滥用这些 API 来做疯狂的事情) 解决方案本来就存在。然而,所有这些限制使得实施受法律法规约束的安全关键应用程序变得非常困难,该应用程序必须提供可靠性保证,因此需要对不可靠的网络进行线路监控。

所有的电源管理机制似乎都没有考虑与安全相关的场景。用户无意使用该应用程序(这很好),并且在这种特殊情况下没有消息是好消息。即应用程序只是停留在后台。不幸的是,该应用程序被归类为“稀有”应用程序的备用存储区,并且该应用程序受到惩罚,这并不好。

小智 0

仅当您用完高优先级消息配额时,才会取消优先级。更多信息可以在这里找到。