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



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

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

  1. 这似乎是因为用户2在XMPP中没有被通知或存储为离线,因此它没有存储离线消息以在用户2联机时推送给用户2。

  2. 我试图通过显式地编写对XMPP的[goOffline]调用来解决此问题,但该调用显示在"用户2"的"SEND日志"中,但未在用户1的"RECV日志"中从XMPP接收到,因此消息在其间丢失。

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

    • 设置可用状态并发送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具有沿着这些路线的资源。

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

最新更新