【问题标题】:iOS: Unable to fetch Offline messages for XMPP ChatiOS:无法获取 XMPP 聊天的离线消息
【发布时间】:2015-06-07 02:09:09
【问题描述】:

按照文档和 XMPPframework 示例代码,我遇到了存在状态问题。我写了一个聊天应用程序。

问题:当用户 1 和 2 在线时,我成功获取状态,他们可以互相聊天。但是,当用户 2 通过(Wifi 关闭 / 3G 关闭)物理离线时,用户 1 没有从 XMPP 获得离线状态,因此当用户 2 上线时,从该时刻发送的任何消息都会丢失。

  1. 似乎因为用户 2 没有收到通知或在 XMPP 中存储为离线,因此它没有存储离线消息以在用户 2 上线时推送回用户 2。

  2. 我已尝试通过显式编写对 XMPP 的 [goOffline] 调用来解决此问题,但是该调用显示在“用户 2”的“发送日志”中,但未在用户 1 的“RECV 日志”中收到来自XMPP,因此消息在两者之间丢失。

  3. 还尝试了其他来源的回复。

    • 设置在线状态并发送 XMPP
    • 使用非负值更改优先级
    • XMPPArchiving 工作,但这不是我想要的。
    • 服务器端 Mod_zero 推送启用,但有时仅收到第一条消息推送通知。
    • 为用户设置 ejabberd.cfg 文件限制和离线消息限制。
    • 请求离线消息拉取。

谁能帮我解决这个问题?

【问题讨论】:

    标签: ios xmpp offline messages xmppframework


    【解决方案1】:

    这是一种很典型的情况,客户端断网,但服务器检测不到离线。

    为了检测每个客户端的状态,服务器需要向每个客户端发送 PING 数据包并等待响应。
    如果客户端响应则很好,否则服务器会将该客户端标记为离线,并且将自动通知所有其他在线客户端。

    这是 ejabberd XMPP 服务器的 PING 模块 实现(希望您使用的是 ejabberd 服务器):

    mod_ping: 
    send_pings: true
    ping_interval: 10
    timeout_action: kill
    ping_ack_timeout: 10
    

    这必须写在ejabberd.yml配置文件中。

    在客户端,我们还需要启用 ping 模块来响应服务器 ping:

    private var xmppPing: XMPPPing?
    xmppPing = XMPPPing()
    xmppPing!.activate(xmppStream!)
    

    此代码必须在我们 setupStream() 用于 iOS 时编写。

    详情请至mod_ping documentations

    【讨论】:

      【解决方案2】:

      听起来您的问题出在服务器级别。服务器认为用户在线所以它发送消息但没有人得到它。这并没有一个简单的解决方案。

      1。 最好的解决方案是交货收据。基本上,当消息发送给您的客户时,您的客户会返回确认收据。如果服务器没有收到该收据,它将每 n 次重新发送消息。根据您的 XMPP 服务器,您可能会找到一个已经制定的解决方案,而不是您必须推出自己的解决方案。

      2。 一个可能的技巧是让您的服务器始终存储和传递最后 10 条消息,然后在客户端重复丢弃......这也取决于您的服务器实现。 XMPP MUC 和 PubSub 拥有这些方面的资源。

      对于长期可扩展的解决方案,您需要在服务器和客户端级别处理此问题。

      【讨论】:

      • 感谢 Andres,我们纠正了服务器端的问题以处理归档和碳实施。
      • 你在 iOS 端做了哪些改变?
      • 有更好的解决方案来处理这种情况,称为 PING 模块
      • 不,使用 XMPP ping 不是任何方向的 100% 解决方案。虽然您可以在发送消息之前草率地 ping 以了解您是否已连接,但这并不能保证下一条消息会成功。特别是如果您使用的是移动连接。另外,这只会考虑客户端到服务器,而不是服务器到客户端。如前所述,服务器可以认为用户在线并发送丢失的消息。发送消息和使用消息回执是行业标准,我们使用它为超过 30 万移动用户提供 99.9% 的服务。
      猜你喜欢
      • 1970-01-01
      • 2017-03-21
      • 2013-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-05
      • 2015-03-18
      相关资源
      最近更新 更多