应用程序终止时的 Ejabberd 消息传递
Ejabberd Message delivery while application is terminated
我正在为 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 实现这个场景?
对于一个简单的 Stack Overflow 问题来说可能太复杂了,因为您需要在客户端和服务器上集成多个移动部分:
- 您需要在 iOS 上接收推送通知时在后台执行代码(您需要在您的应用配置文件中为您的应用设置 属性 并有代码来处理它)。客户端将启动 HTTPS 查询,让服务器知道消息已送达。
- 您需要有一个端点,它可以接收传递的 HTTPS 调用并代表用户生成消息确认或聊天标记,并将其路由到 ejabberd。
在现实世界中,如果您想考虑在 APNS 上队列中只能有 1 个推送这一事实,这还不够。如果您在设备不在网络上时发送了多条消息,您需要让设备在服务器离线时检查所有收到的消息,否则您将丢失消息。
您需要依靠 XMPP 消息存档管理 (MAM) 来处理该历史记录。
如您所见,这不是简单的几十行代码,而是需要真正的设计和参与工作。
如果有人遇到这个问题,这是我在@Mickaël Rémond 的帮助下根据他的回答实施的解决方案。
- 我将 ejabberd 配置为将离线消息发送到一个 http 服务(您自己的服务器),请参阅 this link 以了解更多操作方法
- 你的服务器应该捕捉到上面的调用并在我的例子中生成一个通知消息 (FCM) 并将它发送到接收方设备
- 收件人设备将捕获包含消息的通知
- 收件人设备将调用负责将交付确认发送给原始发件人的 http 服务(您自己的服务器后端)。您需要通过此调用传递 from、to、stanzaId、vhost
- 后端服务器将使用 ejabberd-api(公开的 apis 集通过其余 apis 调用管理 ejabberd)使用 this api[发送传递消息=25=]
还请注意以下注意事项:
- 从您自己的服务器向 ejabberd 发送传递消息不会将它们从 ejabberd 数据库中删除
- 如果用户重新连接到 ejabberd 服务器,那么收件人将再次收到来自 ejabberd 的消息。
我正在为 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 实现这个场景?
对于一个简单的 Stack Overflow 问题来说可能太复杂了,因为您需要在客户端和服务器上集成多个移动部分:
- 您需要在 iOS 上接收推送通知时在后台执行代码(您需要在您的应用配置文件中为您的应用设置 属性 并有代码来处理它)。客户端将启动 HTTPS 查询,让服务器知道消息已送达。
- 您需要有一个端点,它可以接收传递的 HTTPS 调用并代表用户生成消息确认或聊天标记,并将其路由到 ejabberd。
在现实世界中,如果您想考虑在 APNS 上队列中只能有 1 个推送这一事实,这还不够。如果您在设备不在网络上时发送了多条消息,您需要让设备在服务器离线时检查所有收到的消息,否则您将丢失消息。 您需要依靠 XMPP 消息存档管理 (MAM) 来处理该历史记录。
如您所见,这不是简单的几十行代码,而是需要真正的设计和参与工作。
如果有人遇到这个问题,这是我在@Mickaël Rémond 的帮助下根据他的回答实施的解决方案。
- 我将 ejabberd 配置为将离线消息发送到一个 http 服务(您自己的服务器),请参阅 this link 以了解更多操作方法
- 你的服务器应该捕捉到上面的调用并在我的例子中生成一个通知消息 (FCM) 并将它发送到接收方设备
- 收件人设备将捕获包含消息的通知
- 收件人设备将调用负责将交付确认发送给原始发件人的 http 服务(您自己的服务器后端)。您需要通过此调用传递 from、to、stanzaId、vhost
- 后端服务器将使用 ejabberd-api(公开的 apis 集通过其余 apis 调用管理 ejabberd)使用 this api[发送传递消息=25=]
还请注意以下注意事项:
- 从您自己的服务器向 ejabberd 发送传递消息不会将它们从 ejabberd 数据库中删除
- 如果用户重新连接到 ejabberd 服务器,那么收件人将再次收到来自 ejabberd 的消息。