ios xmpp開發應用後臺模式接收聊天信息

        最近在使用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時做下面設置即可:

  1. //允許後臺模式(注意ios模擬器上是不支持後臺socket的)  
  2.  xmppStream.enableBackgroundingOnSocket = YES;  


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

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

  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了一下,找到個叫極光推送的免費推送,正在研究中,有收穫在更新...

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章