接收来自 emqx 推送消息的长时间运行服务

Posted

技术标签:

【中文标题】接收来自 emqx 推送消息的长时间运行服务【英文标题】:Long running service to receive push messages from emqx 【发布时间】:2021-12-02 12:33:22 【问题描述】:

我想实现一个长时间运行的服务来接收来自emqx 服务器的推送消息(即使程序没有运行)。如果我使用 android Service 或 JobIntentService,则有必要显示一个非预期的通知。如果我使用 WorkManager,可以定义的最小重复间隔为 15 分钟。出于某种原因,我们不想使用 Firebase。这个问题有解决办法吗?

【问题讨论】:

【参考方案1】:

“Push Notification”的意思是“服务器触发你的App”,所以主要有两种方法:

    使用原生 Android Firebase 消息创建 所有客户端和您的服务器之间的持久连接

第一个选项使用由 Android 为所有(或大部分)应用程序管理的单个连接,因此能耗非常低,连接/网络事件由 Android 本身管理。

Second 选项需要有关连接/网络重新连接的繁重工作以及服务器端的一些工作。您的服务器应保存并管理许多客户端连接,以了解所需的日志记录。此外,服务器应该知道客户端的 TCP/UDP 处理程序以知道要向哪个客户端发送消息。 这种方式比第一种方式消耗更多的电池能量。

如果您打算将“推送通知”作为“轮询服务器以了解某些通知是否准备就绪”,那么您误解了“推送”一词,您可以仅创建带有通知图标的持久服务(从 SDK 26 开始,此行为是强制性的)。

【讨论】:

感谢您的回复,服务器端没有问题。我们只打算在从服务器发布消息时在客户端接收消息。为此,有必要实现始终处于活动状态的服务。我想知道通过什么机制可以实现这样的事情。 请看这个:emqx.com/en/blog/android-connects-mqtt-using-kotlin 好的,但我已回答您:如果您不使用 Firebase,那么唯一的解决方案是使用需要在状态栏中显示其通知图标的长时间运行的服务。没有其他解决方案。【参考方案2】:

正如你所说,在新版本的android中,使用后台服务有很多限制。因此,如果可以,我建议您使用混合方法。您的服务器使用 google-fcm 服务通知客户端新消息,并且每当客户端收到它时,在 WorkManager 上建立与 emqx 代理的连接以获取实际消息。在这种方法中,您可以在应用程序处于前台时连接到您的代理,并且您不通过 fcm 发送消息,而是将其用作向客户端发出新消息的警报。

【讨论】:

以上是关于接收来自 emqx 推送消息的长时间运行服务的主要内容,如果未能解决你的问题,请参考以下文章

WebSocket与消息推送

不活动后出现错误的 WCF 双工回调 - 保持活动长时间运行的推送通知

接收时执行 iOS 推送通知代码

消息推送学习一原生Socket的使用

如何注册用户的 ios 设备以接收来自 AppDelegate 以外的地方的推送消息?

关于 java socket的消息推送问题