【问题标题】:Ejabberd Message delivery while application is terminated应用程序终止时的 Ejabberd 消息传递
【发布时间】:2019-04-27 09:41:12
【问题描述】:

我正在使用 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 实现这个场景?

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢@Mickael Remond 的澄清。我能够实现该解决方案,但仍然需要问一些问题:从我的服务器通过 ejabberd api 发送确认传递消息不会删除来自 ejabberd 的消息,并且当收件人重新连接到 ejabberd 时它将再次传递。有没有办法告诉 ejabberd 在收到传递确认消息时删除该消息?似乎 ejabberd 的归档系统在将消息传递给未收到确认传递消息的收件人时从假脱机中删除消息
    • @TareqAssi 不,在 XMPP 中(以及在 ejabberd 中)没有办法做到这一点。
    【解决方案2】:

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

    • 我将 ejabberd 配置为将离线消息发送到 http 服务(您自己的服务器),请参阅this link 了解更多信息
    • 您的服务器应捕获上述呼叫并在我的情况下生成通知消息 (FCM) 并将其发送到接收设备
    • 接收设备将捕获包含消息的通知
    • 接收方设备会调用http服务(你自己的服务器后端)负责将deliver ack发送给原始发送方。您需要通过此调用传递 from、to、stanzaId、vhost
    • 后端服务器将使用ejabberd-api(通过rest apis调用管理ejabberd的一组公开的apis)使用this api发送传递消息

    还请注意以下注意事项:

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

    【讨论】:

    • 很好的解释。 1 主要的事情,默认情况下,ejabberd 会在用户上线时删除离线消息。您是否处理过这个问题,您能解释一下如何处理吗?
    • @LingasamySakthivel ejabberd 将离线消息传递给收件人,然后在用户上线后将其删除。就我而言,这就是我想要的。这种行为你到底面临什么问题?
    • 我们面临的问题正是这个。 “ejabberd 将离线消息传递给收件人”这很好。之后,我们将丢失这些消息。所以可能我们必须同步这些消息。
    猜你喜欢
    • 2016-09-16
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    • 2016-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多