iOS:无法获取 XMPP 聊天的离线消息
iOS: Unable to fetch Offline messages for XMPP Chat
根据文档和 XMPPframework 示例代码,我遇到了存在状态问题。我写了一个聊天应用。
问题:当用户 1 和 2 在线时,我成功获取状态并且他们可以互相聊天。但是,当用户 2 通过(Wifi OFF / 3G 关闭)物理离线时,用户 1 没有从 XMPP 获得离线状态,因此当用户 2 上线时,从那一刻发送的所有消息都丢失了。
似乎是因为用户 2 在 XMPP 中没有被通知或存储为离线,因此它没有存储离线消息以在用户 2 上线时推送回用户 2。
我试图通过显式编写对 XMPP 的 [goOffline] 调用来解决此问题,但是该调用显示在 'SEND log' 中 'user 2' 但未在 [= 中收到47=] 在来自 XMPP 的用户 1 中,因此消息在两者之间丢失。
也尝试了其他来源的回复。
- 设置在线状态并发送 XMPP
- 优先级已更改为非负值
- XMPPArchiving 工作,但这不是我想要的。
- 服务器端Mod_zero推送启用但有时只收到第一条消息推送通知。
- 设置 ejabberd.cfg 用户文件限制和离线消息限制。
- 请求离线消息拉取。
谁能帮我解决这个问题?
听起来您的问题出在服务器级别。服务器认为用户在线所以它发送消息但没有人收到。这并没有一个简单的解决方案。
1。
最好的解决方案是送货收据。基本上当消息发送给您的客户时,您的客户 returns 确认送达回执。如果服务器没有收到该回执,它将每隔 n 次重新发送消息。根据您的 XMPP 服务器,您可能会找到一个已经制定的解决方案,而不是您必须推出自己的解决方案。
2。
一种可能的破解方法是让您的服务器始终存储和传递最后 10 条消息,然后在客户端重复丢弃……这也取决于您的服务器实现。 XMPP MUC 和 PubSub 有这方面的资源。
对于长期可扩展的解决方案,您需要在服务器和客户端级别处理此问题。
这是非常典型的客户端断网但服务器无法检测到离线的情况。
为了检测每个客户端的状态,服务器需要向每个客户端发送PING包并等待响应。
如果客户端响应则正常,否则服务器将将该客户端标记为 离线 并且将自动通知所有其他在线客户端。
这是 PING 模块 ejabberd XMPP 服务器的实现(希望您使用的是 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。
根据文档和 XMPPframework 示例代码,我遇到了存在状态问题。我写了一个聊天应用。
问题:当用户 1 和 2 在线时,我成功获取状态并且他们可以互相聊天。但是,当用户 2 通过(Wifi OFF / 3G 关闭)物理离线时,用户 1 没有从 XMPP 获得离线状态,因此当用户 2 上线时,从那一刻发送的所有消息都丢失了。
似乎是因为用户 2 在 XMPP 中没有被通知或存储为离线,因此它没有存储离线消息以在用户 2 上线时推送回用户 2。
我试图通过显式编写对 XMPP 的 [goOffline] 调用来解决此问题,但是该调用显示在 'SEND log' 中 'user 2' 但未在 [= 中收到47=] 在来自 XMPP 的用户 1 中,因此消息在两者之间丢失。
也尝试了其他来源的回复。
- 设置在线状态并发送 XMPP
- 优先级已更改为非负值
- XMPPArchiving 工作,但这不是我想要的。
- 服务器端Mod_zero推送启用但有时只收到第一条消息推送通知。
- 设置 ejabberd.cfg 用户文件限制和离线消息限制。
- 请求离线消息拉取。
谁能帮我解决这个问题?
听起来您的问题出在服务器级别。服务器认为用户在线所以它发送消息但没有人收到。这并没有一个简单的解决方案。
1。 最好的解决方案是送货收据。基本上当消息发送给您的客户时,您的客户 returns 确认送达回执。如果服务器没有收到该回执,它将每隔 n 次重新发送消息。根据您的 XMPP 服务器,您可能会找到一个已经制定的解决方案,而不是您必须推出自己的解决方案。
2。 一种可能的破解方法是让您的服务器始终存储和传递最后 10 条消息,然后在客户端重复丢弃……这也取决于您的服务器实现。 XMPP MUC 和 PubSub 有这方面的资源。
对于长期可扩展的解决方案,您需要在服务器和客户端级别处理此问题。
这是非常典型的客户端断网但服务器无法检测到离线的情况。
为了检测每个客户端的状态,服务器需要向每个客户端发送PING包并等待响应。
如果客户端响应则正常,否则服务器将将该客户端标记为 离线 并且将自动通知所有其他在线客户端。
这是 PING 模块 ejabberd XMPP 服务器的实现(希望您使用的是 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。