Ejabberd应用程序终止时的消息传递



我正在为IOS和Android开发一个使用ejabberd服务器的聊天应用程序。我还为ejabberd编写了一个模块,用于将脱机消息发送到我自己的服务器api。

我自己的服务器api将使用FCM向IOS/Android平台发送通知。

在客户端,如果应用程序在前台或后台,它将保持与ejabberd的连接,如果客户端接收到消息,则ejabber将发送消息传递状态。

当应用程序终止(服务未运行(时,我面临一个问题,这意味着它未连接到ejabberd(离线(。如果我在该应用程序未终止的情况下向其发送消息,它将收到通知,但消息仍无法送达。在应用程序终止时,如何在收到通知时将消息标记为已送达。

更详细地解释一下,同样的功能在whatsapp:中运行良好

  • 设备A安装了whatsapp,并且whatsapp已关闭(终止(
  • 设备B运行了whatsapp
  • 设备B向设备a发送消息
  • 设备A收到whatsapp通知
  • 在设备A上不执行任何操作的情况下,设备B上的消息状态被标记为已送达

如何使用ejabberd实现此场景?

如果有人遇到这个问题,下面是我在@Mickaël Rémond的帮助下实现的解决方案。

  • 我配置ejabberd将脱机消息发送到http服务(您自己的服务器(请参阅此链接以了解如何执行此操作
  • 您的服务器应该捕捉到上述呼叫,并在我的情况下生成通知消息(FCM(,并将其发送到接收方设备
  • 接收方设备将捕获包含消息的通知
  • 接收方设备将调用http服务(您自己的服务器后端(,负责将传递ack发送给原始发送方。您需要通过此调用从、传递到、stanceId、vhost
  • 后端服务器将使用ejabberdApi(一组公开的api,通过rest api调用来管理ejabberd(来使用此api发送传递消息

请注意以下注意事项:

  • 从您自己的服务器向ejabord发送传递消息不会将它们从ejabord数据库中删除
  • 如果用户重新连接到ejabberd服务器,那么接收方将再次从ejabbert接收消息

对于一个简单的堆栈溢出问题来说,这可能太复杂了,因为您需要在客户端和服务器上集成几个移动部件:

  1. 在iOS上接收推送通知时,您需要在后台执行代码(您需要在应用程序配置文件中的应用程序上设置该属性,并有代码来处理该属性(。客户端将启动HTTPS查询,让服务器知道消息已送达
  2. 你需要有一个端点,它将获得传递的HTTPS调用,并代表用户生成一个消息ack或一个聊天标记,并在ejabberd中路由它

在现实世界中,如果您想考虑到APNS上的队列中只能有1个推送,那么这是不够的。如果您在设备不在网络上时发送了多条消息,则需要让设备在服务器脱机时检查所有收到的消息,否则您将丢失消息。您需要依赖XMPP消息归档管理(MAM(来处理该历史记录。

正如你所看到的,这不是简单的几十行代码,而是需要真正的设计和相关的工作。

最新更新