iOS在升級到4.0以后就支持了多任務了。下文將詳細介紹一下這個特性。
1、檢查設備是否支持多任務
Apple出於性能的考慮,並不是所有的iOS設備升級到iOS4以后都支持多任務,比如iPhone 3G。如果你的應用在沒有多任務特性時會出問題,為了保持應用的健壯性,你應該對此進行判斷並處理。你可以通過調用UIDevice對象的multitaskingSupported屬性來獲取當前設備是否支持多任務。
if(![UIDevice currentDevice].multitaskingSupported){
//不支持多任務時應做的處理
}
2、基本多任務特性
通常,當用戶按一下Home鍵,當前應用就會被進入后台,應用處在后台運行狀 態一小段時間后,就會進入掛起(suspend)狀態,此時應用不會再執行任何代碼。如果系統在運行其他應用時內存資源不足,這個掛起的應用甚至有可能被 系統退出,釋放內存以供活動的應用使用。只有當用戶再次運行此應用,應用才會從掛起狀態喚醒,代碼得以繼續執行。這就是iOS4帶來的基本的多任務特性,這個特性是一般應用默認支持的,就是說你的應用不需要任何修改就能支持基本多任務特性。
既然是多任務你應該會在應用進入后台時做一些處理,比如暫停一些界面的定時刷新或網絡請求。同時,或者你會在程序進入前台時執行一些恢復操作。在你的應用的application delegate里有2個消息用於處理這些消息:
- (void)applicationDidEnterBackground:(UIApplication *)application {
//進入后台時要進行的處理
}- (void)applicationWillEnterForeground:(UIApplication *)application {
//進入前台時要進行的處理
}
當然你也許不會都在application delegate處理所有的事情。如果你要在其他對象中處理,那么你就需要注冊系統通知了,這兩個通知分別是 UIApplicationDidEnterBackgroundNotification和 UIApplicationWillEnterForegroundNotification。
也許你需要更多的多任務特性,比如后台播放音樂或者是后台進行GPS跟蹤。這會是下面介紹的內容。
3、后台播放音樂
通常,一般應用在進入后台時,任何聲音就將會停止。這也許不是我們所想要的。要想讓自己的應用支持后台播放,首先要修改應用的Info.plist 文件,你需要在Info.plist文件中添加UIBackgroundModes字段,該字段的值是應用支持的所有后台模式,是一個數值類型。目前此數 組可以包含“audio”、“location”和“voip”這三個字符串常量,如果要支持后台音樂播放,你就需要包含“audio”,其余兩個會將在 后面講到。
同時,你也應該設置一下應用程序的Audio Sesstion。這個是必需的,如果不設置Audio Sesstion,應用就可能進入后台時Audio Sesstion失活而停止播放。一般需要這么設置就可以了:
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
4、后台GPS跟蹤
和后台播放音樂類似,若要支持后台GPS跟蹤,你就需要在Info.plist文件中UIBackgroundModes字段對應的數組中增加“location”字符串。
5、后台voip支持
由於voip應用需要一個長連接到服務器,為了讓這類應用能正常工作,iOS中假如后台voip支持特性。為支持這一特性,需要在Info.plist文件中UIBackgroundModes字段對應的數組中增加“voip”字符串。
此外你仍然需要配置一下你的網絡連接,以便支持后台連接。iOS提供的網絡連接庫有幾種,下面一一說明:
如果你使用的是NSStream,如NSInputStream或NSOutputStream,需要調用setProperty:forKey:將Key為NSStreamNetworkServiceType的value設置為
NSStreamNetworkServiceTypeVoIP
如果你使用NSURLRequest,需要調用setNetworkServiceType:將網絡類型設置為NSURLNetworkServiceTypeVoIP
如果你使用CFStream,如CFReadStreamRef或CFWriteStreamRef,需要調用 CFReadStreamSetProperty或CFWriteStreamSetProperty將 kCFStreamNetworkServiceType屬性設置為kCFStreamNetworkServiceTypeVoIP。