根据文档和XMPPframework示例代码,我面临存在状态问题。我写了一个聊天应用程序。
问题:当用户1&2人在线,我成功获得状态,他们可以互相聊天。然而,当用户2通过(Wifi OFF/3G OFF)物理离线时,用户1没有从XMPP获得离线状态,因此当用户2在线时,从该时刻发送的消息丢失。
-
这似乎是因为用户2在XMPP中没有被通知或存储为离线,因此它没有存储离线消息以在用户2联机时推送给用户2。
-
我试图通过显式地编写对XMPP的[goOffline]调用来解决此问题,但该调用显示在"用户2"的"SEND日志"中,但未在用户1的"RECV日志"中从XMPP接收到,因此消息在其间丢失。
-
也尝试了其他来源的回复。
- 设置可用状态并发送XMPP
- 优先级已更改,值为非负数
- XMPP存档工作,但这不是我想要的
- 服务器端Mod_zero推送有时启用但仅获得第一条消息推送通知
- 正在为用户设置ejabberd.cfg文件的限制和脱机消息限制
- 请求脱机消息拉取
有人能帮我吗?
这是一种非常典型的情况,客户端失去网络,但服务器无法检测到它处于脱机状态。
为了检测每个客户端的状态,服务器需要向每个客户端发送PING数据包并等待响应
如果客户端响应,则罚款,否则服务器将该客户端标记为脱机,并自动通知其他所有联机客户端。
以下是ejabberdXMPP服务器的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!)
此代码必须在iOS版setupStream()
时编写。
有关详细信息,请查看改装文档。
听起来问题出在服务器级别。服务器认为用户在线,所以它发送消息,但没有人收到。这并不是一个简单的解决方案。
1。最好的解决方案是收货。基本上,当邮件发送给您的客户时,您的客户会返回一份收货确认书。如果服务器没有收到该回执,它将每n次重新发送一次消息。根据您的XMPP服务器,您可能会找到一个已经制作好的解决方案,当然,您必须推出自己的解决方案。
2。一个可能的黑客攻击是让你的服务器总是存储和发送最后10条消息,然后在客户端丢弃重复的。。。这也取决于您的服务器实现。XMPP MUC和PubSub具有沿着这些路线的资源。
对于一个长期可扩展的解决方案,您需要在服务器和客户端级别处理这两个问题。