對於ios7,蘋果支持幾種后台運行模式,backgroundTask,voip,后台播放音樂等,具體看官方文檔就好。
我這邊需要在后台跑一個長時間運行的計時器,所以就不能讓app進入suspend狀態。
很早以前聽說可以通過后台播放音樂來實現,借鑒了一下,測試好幾天,找出來了一個還比較靠譜的方案:
首先在
- (void)applicationDidEnterBackground:(UIApplication *)application{
}
里面申請backgroundTask
[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:nil]
實現一個可以運行幾分鍾的權限。
然后寫一個計時器實時檢測 backgroundTimeRemaining
- (void)tik{
if ([[UIApplication sharedApplication] backgroundTimeRemaining] < 61.0) {
[[CKAudioTool sharedInstance] playSound];
[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:nil];
}
}
[[CKAudioTool sharedInstance] playSound];這段代碼是去播放了一個無聲的音樂,很關鍵的一點是
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionMixWithOthers error:&error]
這樣后台播放就不會影響到別的程序播放音樂了。
我這個計時器每分鍾運行一次tik函數,如果發現后台運行時間小於一分鍾了,就再去申請一個backgroundTask。
神奇的地方在於:backgroundTask不能在程序已經進入后台的時候申請,可以用一個播放音樂的假前台狀態去申請,所以可以做到不斷申請到權限,也就完成了長時間后台執行。
應用實例“同學鬧鍾”。(這都能通過蘋果審核???)