iOS后臺(tái)如何保持socket長(zhǎng)連接和數(shù)據(jù)傳輸

工程中使用tcp長(zhǎng)連接來(lái)和服務(wù)端進(jìn)行數(shù)據(jù)傳輸,在IOS平臺(tái)上,由于蘋(píng)果的后臺(tái)機(jī)制,會(huì)有以下問(wèn)題:

當(dāng)程序退到后臺(tái)的時(shí)候,所有線(xiàn)程被掛起,系統(tǒng)會(huì)回收所有的socket資源,那么socket連接就會(huì)被關(guān)閉,因此無(wú)法再進(jìn)行數(shù)據(jù)的傳輸:

解決方法:

通過(guò)設(shè)置以下屬性可以保持socket連接和數(shù)據(jù)的繼續(xù)傳輸

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

2.設(shè)置流屬性

CFReadStreamRef和CFWriteStreamRef通過(guò)如下方法設(shè)置kCFStreamNetworkServiceType屬性為kCFStreamNetworkServiceTypeVoIP;

CFReadStreamSetProperty(theReadStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);

CFWriteStreamSetProperty(theWriteStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);

NSInputStream 和NSOutputStream通過(guò)如下方法設(shè)置NSStreamNetworkServiceType屬性為NSStreamNetworkServiceTypeVoIP;

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

3.這里有一個(gè)問(wèn)題,就是客戶(hù)端是通過(guò)心跳來(lái)和服務(wù)端保持連接,心跳是由定時(shí)器觸發(fā)的,當(dāng)我退到后臺(tái)以后,定時(shí)器方法被掛起,那么通過(guò)如下設(shè)置來(lái)在后臺(tái)運(yùn)行定時(shí)器

- (void)applicationDidEnterBackground:(UIApplication *)application{

UIApplication*?? app = [UIApplication sharedApplication];

__block??? UIBackgroundTaskIdentifier bgTask;

bgTask = [app beginBackgroundTaskWithExpirationHandler:^{

dispatch_async(dispatch_get_main_queue(), ^{

if(bgTask != UIBackgroundTaskInvalid)

{

bgTask = UIBackgroundTaskInvalid;

}

});

}];

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{

dispatch_async(dispatch_get_main_queue(), ^{

if(bgTask != UIBackgroundTaskInvalid)

{

bgTask = UIBackgroundTaskInvalid;

}

});

});

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載:一根火柴的博客工程中使用tcp長(zhǎng)連接來(lái)和服務(wù)端進(jìn)行數(shù)據(jù)傳輸,在IOS平臺(tái)上,由于蘋(píng)果的后臺(tái)機(jī)制,會(huì)有以下問(wèn)題...
    CoderJohnhao閱讀 3,244評(píng)論 0 9
  • 1、OC中創(chuàng)建線(xiàn)程的方法是什么?如果指定在主線(xiàn)程中執(zhí)行代碼?如何延時(shí)執(zhí)行代碼?!倦y度系數(shù)★★】 1)創(chuàng)建線(xiàn)程的方法...
    木旁_G閱讀 2,085評(píng)論 2 16
  • 史上最全的iOS面試題及答案 iOS面試小貼士———————————————回答好下面的足夠了----------...
    Style_偉閱讀 2,575評(píng)論 0 35
  • iOS面試小貼士 ———————————————回答好下面的足夠了------------------------...
    不言不愛(ài)閱讀 2,251評(píng)論 0 7
  • 多線(xiàn)程、特別是NSOperation 和 GCD 的內(nèi)部原理。運(yùn)行時(shí)機(jī)制的原理和運(yùn)用場(chǎng)景。SDWebImage的原...
    LZM輪回閱讀 2,120評(píng)論 0 12

友情鏈接更多精彩內(nèi)容