FCM高优先级消息如何被降低优先级?在什么条件下会发生这种情况?如何从服务器获取缓存的FCM消息?

11
根据FCM文档,如果FCM服务器检测到高优先级消息没有导致用户交互的模式,则高优先级消息可能会变为低优先级。关于此机制的详细信息未明确说明。问题如下:
  • 这个机制的具体工作原理是什么?
  • 检测算法如何收集数据?
  • 消息被降低优先级的时间有多长?

其次,Android应用程序有一个方法来检查最近接收到的消息的年龄。如果具有普通优先级的消息尚未传递但仍存储在FCM服务器上,则此方法有时会报告错误结果。问题如下:

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

一些可选的背景信息:

我正在编写一个监控某些安全关键应用程序的应用程序。On-premise服务器可以处于两种互斥的状态之一:"空闲"或"警报"。该状态通过FCM发送到所有注册的客户端。为了确保服务器仍在运行,该状态定期广播为心跳。这些心跳消息以普通优先级发送。此外,每当状态从“空闲”更改为“警报”时,将立即发送具有高优先级的其他消息。例如,消息序列类似于

...  idle  idle  idle  *alarm*  alarm  alarm  alarm  idle  idle  ...

当一系列警报信息中的第一个触发通知时,所有其他信息仅具有普通优先级,因此(希望)不会被FCM降低优先级。

Android应用程序包含一个PeriodicWorkRequest,它充当看门狗并检查心跳是否仍在进行。如果最近接收到的消息太旧(超过30分钟),则向用户显示“连接已断开”的通知以警告用户。

问题在于:

通常的心跳消息具有普通优先级,并且在FCM服务器上缓存。看门狗会引发错误的“连接已断开”通知。设备被唤醒(由于通知),然后最新的心跳消息突然进入(它们在服务器上合并)。

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

  • 将所有消息设置为高优先级消息,以便立即传递它们并使看门狗始终看到最新消息。但是,我担心FCM降低优先级算法会启动。(99.95%是无聊的“空闲”消息)

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

附注:

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

所有电源管理机制似乎都没有考虑与安全相关的场景。用户没有意图使用该应用程序(这完全正常),在这种特殊情况下,没有新闻就是好新闻。即应用程序只停留在后台。不幸的是,该应用程序被归类为“罕见”应用程序的待机捆绑,并且该应用程序受到惩罚,这是不好的。


我在Android 11中遇到了优先级降低的问题,你解决了吗? - famfamfam
我认为谷歌的意图是保持细节不公开。一旦你找到了一种方法来保持你的服务的消息优先级,谷歌就会采取措施来打破这一点。这是他们在其他地方写的:“不要试图操纵系统将你的应用程序放入特定的桶中。系统设置优先级的方法可能会改变,每个设备制造商都可能选择编写自己的桶分配应用程序及其自己的算法。相反,确保你的应用程序无论在哪个桶中都能适当地运行。” - undefined
1个回答

0

只有在您用完高优先级消息配额时,它才会被降低优先级。更多信息可以在这里找到。


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