我在文档和XMPPframework示例代码之后面临状态问题。我写了一个聊天应用程序。
问题:当用户1& 2在线我成功获得状态,他们可以互相聊天。然而,当用户2通过(Wifi OFF / 3G关闭)物理离线时,用户1没有从XMPP获得离线状态,因此当用户2上线时,从该时刻发送的消息将丢失。
似乎由于用户2未在XMPP中被通知或存储为离线,因此它不会存储离线消息以在用户2联机时将其推回。
我试图通过明确地将一个[goOffline]调用写入XMPP来解决此问题,但该调用显示在' SEND log'对于用户2'但没有收到' RECV日志'在XMPP的用户1中,由于消息在两者之间丢失。
还尝试了其他来源的回复。
任何人都可以帮我吗?
答案 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。