當(dāng)iphone應(yīng)用程序進(jìn)行網(wǎng)絡(luò)編程時(shí),切到后臺(tái)后,socket連接會(huì)斷掉,ios的設(shè)計(jì)就是這樣。
但是好在apple公司也沒(méi)有那么絕,還是有一些東西可以在后臺(tái)運(yùn)行的(backgroundmodes),

比如:音樂(lè)?GPS ?Voip Locationupdates等
我們以voip為例:
這里我們可以將NSStream指定voip的屬性,從而可以避免程序切到后臺(tái)的時(shí)候socket連接中斷。
可以分為兩步:
1.在info.plist文件中,增加voip選項(xiàng),如

2. 設(shè)置NSStream的屬性,如
在IOS中,sockets是用流或者更高級(jí)的結(jié)構(gòu),設(shè)置一個(gè)VOIP的socket,你只需要在通常的設(shè)置中添加一個(gè)特殊的key來(lái)標(biāo)明這個(gè)接口是用于連接VOIP服務(wù)的,下表列出了流的接口和設(shè)置:
設(shè)置流接口用于voip接口
NSInputStream 和NSOutputStream 對(duì)于 Cocoa streams, 使用 setProperty:forKey: 方法添加
NSStreamNetworkServiceType 屬性給 stream. 改屬性的值設(shè)為 NSStreamNetworkServiceTypeVoIP.
[readStream setProperty:NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType];
這樣,當(dāng)程序切到后臺(tái)的時(shí)候,這個(gè)socket連接還會(huì)被保持。
另外,iphone都是通過(guò)wifi或者gprs上網(wǎng)的,那么當(dāng)socket連接空閑一段時(shí)間后,這個(gè)連接有可能被路由器關(guān)閉,為了保持連接,我們需要不停發(fā)送'心跳包'(保持連接狀態(tài))。
由于iphone上的程序切到后臺(tái)后,程序會(huì)被掛起,那么也就無(wú)法定時(shí)發(fā)送心跳包,所以這個(gè)問(wèn)題只能由服務(wù)端來(lái)解決。普通的辦法就是服務(wù)器每隔一定時(shí)間給每個(gè)客戶端發(fā)送一個(gè)心跳包,以維持這個(gè)連接。每當(dāng)客戶端接收到心跳包的時(shí)候,客戶端會(huì)被IOS喚醒,獲得一小段CPU時(shí)間,然后再次進(jìn)入掛起狀態(tài)。