2015-04-02 51 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