天天看點

iOS背景如何保持socket長連接配接和資料傳輸 iOS背景如何保持socket長連接配接和資料傳輸

工程中使用tcp長連接配接來和服務端進行資料傳輸,在IOS平台上,由于蘋果的背景機制,會有以下問題:

當程式退到背景的時候,所有線程被挂起,系統會回收所有的socket資源,那麼socket連接配接就會被關閉,是以無法再進行資料的傳輸:

解決方法:

通過設定以下屬性可以保持socket連接配接和資料的繼續傳輸

1.需要在Info.plist檔案中添加UIBackgroundModes中的VOIP鍵值;

2.設定流屬性

CFReadStreamRef和CFWriteStreamRef通過如下方法設定kCFStreamNetworkServiceType屬性為kCFStreamNetworkServiceTypeVoIP;

CFReadStreamSetProperty(theReadStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);

CFWriteStreamSetProperty(theWriteStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);

NSInputStream 和NSOutputStream通過如下方法設定NSStreamNetworkServiceType屬性為NSStreamNetworkServiceTypeVoIP;

[self.stream setProperty: NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType];

3.這裡有一個問題,就是用戶端是通過心跳來和服務端保持連接配接,心跳是由定時器觸發的,當我退到背景以後,定時器方法被挂起,那麼通過如下設定來在背景運作定時器