處理xmpp 離線信息,

轉: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時作下面設置便可:

 

[cpp]  view plain copy print ?
 
  1. //容許後臺模式(注意ios模擬器上是不支持後臺socket的)  
  2.  xmppStream.enableBackgroundingOnSocket = YES;  

 


下面作一下測試,看看效果如何。

 

先在- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message方法里加入下面代碼:

 

[cpp]  view plain copy print ?
 
  1. //程序運行在前臺,消息正常顯示  
  2. if ([[UIApplication sharedApplication] applicationState] == UIApplicationStateActive)  
  3. {  
  4.   
  5. }else{//若是程序在後臺運行,收到消息以通知類型來顯示  
  6.     UILocalNotification *localNotification = [[UILocalNotification alloc] init];  
  7.     localNotification.alertAction = @"Ok";  
  8.     localNotification.alertBody = [NSString stringWithFormat:@"From: %@\n\n%@",@"test",@"This is a test message"];//通知主體  
  9.     localNotification.soundName = @"crunch.wav";//通知聲音  
  10.     localNotification.applicationIconBadgeNumber = 1;//標記數  
  11.     [[UIApplication sharedApplication] presentLocalNotificationNow:localNotification];//發送通知  
  12. }  



 

真機測試,登陸後切換到後臺狀態,而後在電腦上用spark發一條消息到iphone上,狀態欄翻出通知消息,基本成功實現了。

 

-------------------------------------------------------------------------------------------------------------------------------------------------

補充說明

       網上查資料時,發現一個問題,若是你的應用沒有實現voip,若是按上面這種方法作,有被蘋果reject的危險;那麼替代方法就是當應用進入後臺或是已經退出後,服務器端會根據用戶狀態的變化,發送消息給用戶,同時使用蘋果apns來推送新的消息通知給用戶;但咱們知道,蘋果的apns在即時性和可靠性方面都是不作保證的,也就是說新消息的通知傳到蘋果那邊,蘋果不保證能成功幫你推送,也不保證即時推送,因此只能找一下看有沒有第三方的免費推送服務提供商。

      Google了一下,找到個叫極光推送的免費推送,正在研究中,有收穫在更新...

ps: 離線信息,須要一個長鏈接的,若是斷開鏈接,怎樣也 沒法接收到信息,

http://stackoverflow.com/questions/5257580/iphone-xmpp-app-run-background

相關文章
相關標籤/搜索