當iphone應用程序進行網絡編程時,切到后臺后,socket連接會斷掉,ios的設計就是這樣。
但是好在apple公司也沒有那么絕,還是有一些東西可以在后臺運行的(backgroundmodes),
比如:音樂?GPS ?Voip Locationupdates等
我們以voip為例:
這里我們可以將NSStream指定voip的屬性,從而可以避免程序切到后臺的時候socket連接中斷。
可以分為兩步:
1.在info.plist文件中,增加voip選項,如
2. 設置NSStream的屬性,如
在IOS中,sockets是用流或者更高級的結構,設置一個VOIP的socket,你只需要在通常的設置中添加一個特殊的key來標明這個接口是用于連接VOIP服務的,下表列出了流的接口和設置:
設置流接口用于voip接口
NSInputStream 和NSOutputStream 對于 Cocoa streams, 使用 setProperty:forKey: 方法添加
NSStreamNetworkServiceType 屬性給 stream. 改屬性的值設為 NSStreamNetworkServiceTypeVoIP.
[readStream setProperty:NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType];
這樣,當程序切到后臺的時候,這個socket連接還會被保持。
另外,iphone都是通過wifi或者gprs上網的,那么當socket連接空閑一段時間后,這個連接有可能被路由器關閉,為了保持連接,我們需要不停發送'心跳包'(保持連接狀態)。
由于iphone上的程序切到后臺后,程序會被掛起,那么也就無法定時發送心跳包,所以這個問題只能由服務端來解決。普通的辦法就是服務器每隔一定時間給每個客戶端發送一個心跳包,以維持這個連接。每當客戶端接收到心跳包的時候,客戶端會被IOS喚醒,獲得一小段CPU時間,然后再次進入掛起狀態。