【发布时间】:2018-11-23 15:55:14
【问题描述】:
根据FCM documentation,如果 FCM 服务器检测到高优先级消息不会导致用户交互的模式,则高优先级消息可能会被取消优先级。该机制的细节未指定。问题:
- 具体是如何工作的?
- 检测算法如何收集数据?
- 消息的优先级降低了多长时间?
其次,Android 应用有一个方法可以检查最近收到的消息的年龄。如果具有正常优先级的消息尚未传递但仍缓存在 FCM 服务器上,则此方法有时会报告错误的结果。问题:
- 如何让 Android 应用先获取所有消息?
一些可选的背景信息:
我正在为一些安全关键应用程序编写监控应用程序。本地服务器可以处于两种互斥状态中的一种:“空闲”或“警报”。状态通过 FCM 发送给所有注册的客户端。为确保服务器仍在运行,该状态会定期作为心跳广播。这些心跳消息以正常优先级发送。此外,只要状态从“空闲”变为“警报”,就会立即发送一条额外的、具有高优先级的另类消息。例如。消息的顺序类似于
... idle idle idle *alarm* alarm alarm alarm idle idle ...
由于连续第一条警报消息触发通知,而所有其他消息只有正常优先级,因此(希望)没有被 FCM 降低优先级的风险。
Android 应用包含一个PeriodicWorkRequest,用作看门狗并检查心跳是否仍在输入。如果最近收到的消息太旧(超过 30 分钟),则会显示“连接丢失”通知以用户警告他。
问题来了:
通常的心跳消息具有正常的优先级,并缓存在 FCM 服务器上。看门狗发出错误的“连接丢失”通知。设备被唤醒(由于通知),突然收到最新的心跳消息(它们在服务器上折叠)。
我看到了两种解决方案(或变通方法):
将所有消息设为高优先级消息,以便立即传送它们,并且看门狗始终看到最新消息。但是,我担心 FCM 去优先级算法会起作用。(99,95% 是无聊的“空闲”消息)
在看门狗检查最新消息的时间并最终发出警告之前,我必须以编程方式确保已获取所有消息。
旁注:
我完全理解为什么 Google 对后台执行和异步任务实施越来越多的限制。 (广播接收器或多或少变得无用,AlarmManager 受到限制,JobScheduler 可以延迟,Android 9 引入了“备用桶”的概念。)许多开发人员滥用这些 API 来做一些疯狂的事情,而更好的(电池友好型) ) 解决方案本来就存在。然而,所有这些限制使得实施受法律法规约束的安全关键型应用程序变得非常困难,该应用程序必须提供可靠性保证,因此需要对不可靠的网络进行线路监控。
所有电源管理机制似乎都没有考虑安全相关的场景。用户无意使用该应用程序(这很好),在这种特殊情况下,没有消息是好消息。 IE。该应用程序只是停留在后台。不幸的是,该应用程序被归类为“稀有”应用程序的备用存储桶,并且该应用程序会受到惩罚,这并不好。
【问题讨论】:
-
我在 android 11 中遇到了去优先级问题,你解决了吗?
标签: android push-notification firebase-cloud-messaging watchdog android-background