iOS:无法为XMPP聊天获取脱机消息

时间:2015-04-02 07:40:50

标签: ios xmpp offline messages xmppframework

我在文档和XMPPframework示例代码之后面临状态问题。我写了一个聊天应用程序。

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

  1. 似乎由于用户2未在XMPP中被通知或存储为离线,因此它不会存储离线消息以在用户2联机时将其推回。

  2. 我试图通过明确地将一个[goOffline]调用写入XMPP来解决此问题,但该调用显示在' SEND log'对于用户2'但没有收到' RECV日志'在XMPP的用户1中,由于消息在两者之间丢失。

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

    • 设置可用状态的状态并发送XMPP
    • 优先级已更改为非负值
    • XMPPArchiving工作,但这不是我想要的。
    • 服务器端Mod_zero push启用但有时只获得第一个消息推送通知。
    • 为用户设置ejabberd.cfg文件限制和离线消息限制。
    • 请求离线留言。
  4. 任何人都可以帮我吗?

2 个答案:

答案 0 :(得分:0)

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

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

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

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

答案 1 :(得分:0)

这是一种非常典型的情况,客户端会丢失网络,但服务器无法检测到它处于脱机状态。

要检测每个客户端的状态,服务器需要向每个客户端发送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() for iOS时编写。

有关详细信息,请浏览mod_ping documentations