轉:http://blog.csdn.net/kylinbl/article/details/8965074(KylinBL的專欄html
)ios
最近在使用xmppframwork來實現一個聊天應用,碰到了一個問題,應用進入後臺之後,就接收不到消息了;服務器
怎麼樣才能使應用被切到後臺時,應用中的網絡鏈接仍然接收數據並維持存活(像QQ iphone 同樣),下面一步一步來分析。網絡
針對iOS應用的狀態,存在如下三種狀況:app
1)若iOS應用爲活動狀態,剛與服務器保持一個長鏈接,客戶端與服務器經過此鏈接收發消息。
2)若iOS應用爲退出狀態,長鏈接被斷開,服務器向客戶端發消息則經過APNS推送消息實現。
3)若iOS應用剛剛切至後臺,尚未關閉,發現長鏈接並無斷開,服務器經過長鏈接向客戶端發送消息仍是能發出去,可是iOS應用只有從新切至前臺時才能收到消息。iphone
針對第三種狀況,有下面的疑問:socket
iOS應用剛切至後臺時,鏈接還保持着,此時客戶端在後臺是否能夠收服務器來的消息,而後用本地通知來通知用戶?若是能夠的話應該怎麼作?仍是說一旦切至後臺,就必須經過APNS來通知用戶?ide
結合蘋果官方文檔App Programming Guide裏有關Background Execution and Multitasking的章節和satckoverflow對xmpp支持後臺socket問題的解答,得出如下解決方法:測試
1.由於蘋果只支持少數幾咱類型的應用的代碼能夠在後臺運行(例如:audio、location、voip等),因此須要在應用的(appname)-info.plist文件裏,增長一個"Required background modes"的key,值設置爲voip,來指定類型。ui
2.ios xmppframwork裏已經有這方面的支持,只要初始化xmppstream時作下面設置便可:
下面作一下測試,看看效果如何。
先在- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message方法里加入下面代碼:
真機測試,登陸後切換到後臺狀態,而後在電腦上用spark發一條消息到iphone上,狀態欄翻出通知消息,基本成功實現了。
-------------------------------------------------------------------------------------------------------------------------------------------------
補充說明:
網上查資料時,發現一個問題,若是你的應用沒有實現voip,若是按上面這種方法作,有被蘋果reject的危險;那麼替代方法就是當應用進入後臺或是已經退出後,服務器端會根據用戶狀態的變化,發送消息給用戶,同時使用蘋果apns來推送新的消息通知給用戶;但咱們知道,蘋果的apns在即時性和可靠性方面都是不作保證的,也就是說新消息的通知傳到蘋果那邊,蘋果不保證能成功幫你推送,也不保證即時推送,因此只能找一下看有沒有第三方的免費推送服務提供商。
Google了一下,找到個叫極光推送的免費推送,正在研究中,有收穫在更新...
ps: 離線信息,須要一個長鏈接的,若是斷開鏈接,怎樣也 沒法接收到信息,
http://stackoverflow.com/questions/5257580/iphone-xmpp-app-run-background