2

我正在为 IOS 和 Android 使用 ejabberd 服务器开发一个聊天应用程序。我还为 ejabberd 编写了一个模块来获取发送到我自己的服务器 api 的离线消息。

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

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

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

为了进一步解释,whatsapp 可以正常使用相同的功能:

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

如何使用 ejabberd 实现此场景?

4

2 回答 2

2

如果有人遇到这个问题,这里是我在@Mickaël Rémond 的帮助下从他的回答中实施的解决方案。

  • 我将 ejabberd 配置为将离线消息发送到 http 服务(您自己的服务器),请参阅此链接以进一步了解如何操作
  • 在我的情况下,您的服务器应该捕获上述呼叫并生成通知消息(FCM)并将其发送到接收设备
  • 接收设备将捕获包含该消息的通知
  • 接收方设备将调用 http 服务(您自己的服务器后端),该服务负责将传递 ack 发送给原始发送方。你需要通过这个调用传递 from, to , stanzaId , vhost
  • 后端服务器将使用 ejabberd-api(一组暴露的 api,通过 rest api 调用来管理 ejabberd)使用这个 api发送传递消息

另请注意以下注意事项:

  • 将传递消息从您自己的服务器发送到 ejabberd 不会将它们从 ejabberd 数据库中删除
  • 如果用户重新连接到 ejabberd 服务器,那么收件人将再次收到来自 ejabberd 的消息。
于 2018-12-05T14:31:53.110 回答
0

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

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

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

如您所见,这不是简单的几十行代码,而是需要真正的设计和参与的工作。

于 2018-11-27T15:44:54.417 回答