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

时间:2018-11-25 16:10:09

标签: xmpp ejabberd whatsapp ejabberd-module ejabberd-hooks

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

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

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

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

进一步说明,whatsapp可以正常使用相同功能:

  • 设备A已安装whatsapp,并且whatsapp已关闭(已终止)
  • 设备B正在运行whatsapp
  • 设备B向设备A发送消息
  • 设备A收到whatsapp通知
  • 在设备A上不执行任何操作,设备B上的消息状态被标记为已传递。

如何使用ejabberd实施此方案?

2 个答案:

答案 0 :(得分:0)

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

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

在现实世界中,如果要考虑到APNS队列中只能进行1次推送的事实,这还不够。如果在设备不在网络上时发送了多个消息,则需要使设备在服务器处于脱机状态时检查所有收到的消息,否则将丢失消息。 您需要依靠XMPP邮件存档管理(MAM)来处理该历史记录。

如您所见,这不是几十行代码,而是需要真实的设计和相关工作。

答案 1 :(得分:0)

万一有人遇到这个问题,这是我在@MickaëlRémond的帮助下实现的解决方案。

  • 我已将ejabberd配置为将脱机消息发送到http服务(您自己的服务器),请参阅this link,以了解有关操作方法的更多信息
  • 您的服务器应在我的情况下接到上述电话并生成通知消息(FCM),然后将其发送给收件人设备
  • 收件人设备将捕获包含消息的通知
  • 收件人设备将调用http服务(您自己的服务器后端),该服务负责将送达确认发送到原始发件人。您需要通过此调用从传递到stanzaId虚拟主机
  • 后端服务器将使用ejabberd-api(一组公开的api来通过其余api调用来管理ejabberd)使用this api
  • 发送传递消息

请同时注意以下注意事项:

  • 将传递消息从您自己的服务器发送到ejabberd不会将其从ejabberd数据库中删除
  • 如果用户重新连接到ejabberd服务器,则收件人将再次从ejabberd接收消息。