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

时间:2018-11-23 15:55:14

标签: android push-notification firebase-cloud-messaging watchdog android-background

根据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来做疯狂的事情,这样做更好(电池友好)解决方案将存在。但是,所有这些限制使得实施受法律法规约束的安全关键型应用程序非常困难,该应用程序必须提供可靠性保证,因此需要对不可靠的网络进行线路监控。

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

0 个答案:

没有答案