2015-04-02 52 views
1

我正在面对与文档和XMPPframework示例代码相关的状态问题。我写了一个聊天应用程序。iOS:无法为XMPP聊天提取离线消息

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

  1. 似乎因为用户2不通知或存储为脱机XMPP,因此其不保存离线消息推回给用户2,当谈到网上。

  2. 我试图通过明确地写一个[goOffline]呼叫到XMPP来解决这个问题,但是呼叫显示在'用户2'的'发送日志'中,但是没有在用户1的'RECV日志'中从XMPP ,由此消息在两者之间丢失。

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

    • 可用的存在,并发送XMPP
    • 优先级设置状态改变其值非负
    • XMPPArchiving工作,但是这不是我想要的。
    • 服务器端Mod_zero推动,但有时只获得第一个消息推送通知。
    • 为用户设置ejabberd.cfg文件的限制和脱机消息限制。
    • 请求离线消息提取。

任何人都可以帮助我吗?

回答

0

听起来像你的问题是在服务器级别。服务器认为用户在线,所以它发送消息,但没有人得到它。这并不是一个简单的解决方案。

1. 最好的解决办法是发货收据。基本上当邮件发送给您的客户时,您的客户将返回送货收据确认。如果服务器没有收到该收据,则会每隔n次重新发送一次该消息。根据您的XMPP服务器,您可能会发现已经制定的解决方案,而不是您必须推出自己的解决方案。

2. 一个可能的破解是让你的服务器总是存储并提供最后10条消息,然后在客户端丢弃重复......这也取决于你的服务器实现。 XMPP MUC和PubSub拥有这些方面的资源。

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

+1

谢谢Andres,我们在服务器端纠正了这个问题,以处理归档和碳实施。 – 2015-05-22 20:22:26

+0

你在iOS端做了哪些改变? – 2016-08-17 09:50:45

+0

有更好的解决方案来处理这种情况,称为** PING **模块 – D4ttatraya 2017-01-12 08:35:25

0

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

要检测每个客户端的状态,服务器需要向每个客户端发送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