处理xmpp 离线信息,
轉:http://blog.csdn.net/kylinbl/article/details/8965074(KylinBL的專欄
)
最近在使用xmppframwork來實現一個聊天應用,碰到了一個問題,應用進入后臺以后,就接收不到消息了;
怎么樣才能使應用被切到后臺時,應用中的網絡連接仍然接收數據并維持存活(像QQ iphone 一樣),下面一步一步來分析。
針對iOS應用的狀態,存在以下三種情況:
1)若iOS應用為活動狀態,剛與服務器保持一個長連接,客戶端與服務器通過此連接收發消息。
2)若iOS應用為退出狀態,長連接被斷開,服務器向客戶端發消息則通過APNS推送消息實現。
3)若iOS應用剛剛切至后臺,還沒有關閉,發現長連接并沒有斷開,服務器通過長連接向客戶端發送消息還是能發出去,但是iOS應用只有重新切至前臺時才能收到消息。
?
針對第三種情況,有下面的疑問:
iOS應用剛切至后臺時,連接還保持著,此時客戶端在后臺是否可以收服務器來的消息,然后用本地通知來通知用戶?如果可以的話應該怎么做?還是說一旦切至后臺,就必須通過APNS來通知用戶?
?
結合蘋果官方文檔App Programming Guide里有關Background Execution and Multitasking的章節和satckoverflow對xmpp支持后臺socket問題的解答,得出以下解決方法:
1.因為蘋果只支持少數幾咱類型的應用的代碼可以在后臺運行(例如:audio、location、voip等),所以需要在應用的(appname)-info.plist文件里,增加一個"Required background modes"的key,值設置為voip,來指定類型。
2.ios xmppframwork里已經有這方面的支持,只要初始化xmppstream時做下面設置即可:
?
[cpp]?view plaincopyprint??
下面做一下測試,看看效果如何。
?
先在- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message方法里加入下面代碼:
?
[cpp]?view plaincopyprint?
?
真機測試,登錄后切換到后臺狀態,然后在電腦上用spark發一條消息到iphone上,狀態欄翻出通知消息,基本成功實現了。
?
-------------------------------------------------------------------------------------------------------------------------------------------------
補充說明:
? ? ? ?網上查資料時,發現一個問題,如果你的應用沒有實現voip,如果按上面這種方法做,有被蘋果reject的危險;那么替代方法就是當應用進入后臺或是已經退出后,服務器端會根據用戶狀態的變化,發送消息給用戶,同時使用蘋果apns來推送新的消息通知給用戶;但我們知道,蘋果的apns在即時性和可靠性方面都是不做保證的,也就是說新消息的通知傳到蘋果那邊,蘋果不保證能成功幫你推送,也不保證即時推送,所以只能找一下看有沒有第三方的免費推送服務提供商。
? ? ? Google了一下,找到個叫極光推送的免費推送,正在研究中,有收獲在更新...
ps: 離線信息,需要一個長連接的,如果斷開連接,怎樣也 無法接收到信息,
http://stackoverflow.com/questions/5257580/iphone-xmpp-app-run-background
轉載于:https://www.cnblogs.com/guligei/p/3517420.html
總結
以上是生活随笔為你收集整理的处理xmpp 离线信息,的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Epoll在LT和ET模式下的读写方式
- 下一篇: readonly 和 disable的区