iOS平臺提供給應用特殊的後臺服務,應用在後臺時仍被容許能執行一會。html
UIBackgroundModes Xcode Modes
1. audio -> Audio.Airplay and Picture in Picture: 應用在後臺時能夠播放聲音信息 應用場景:須要在後臺播放音頻
2. location -> Location updates: 應用提供位置信息 應用場景:在後臺時須要不斷通知用戶位置更新信息
3. voip -> Voice over IP: 提供Voice-over-IP服務。 如skype網絡電話
4. fetch -> Background fetch: 應用場景:需不斷地頻繁的基於必定規律從網絡上獲取新的數據 supported in iOS 7.0
5. remote-notification 應用場景:經過遠程推送做爲一個信號代表有新的數據須要下載,以儘量減小用戶直接點開通知後查看內容的等待時間 supported in iOS7.0
6. newsstand-content 在後臺時使用Newsstand框架(雜誌)進行數據的下載更新 supported in iOS5.0 and later
7. external-accessory 有規律的從固件獲取信息,能夠在後臺不斷的與外設進行溝通 supported in iOS 5.0 and later
一些外設控制App,好比一些控制第三方MFi配件的應用,開啓後可以讓應用不斷的與外設進行溝通
8. bluetooth-central -> Uses Bluetooth LE accessories 須要在後臺不斷更新藍牙狀態 CoreBluetooth supported in iOS 5.0 and later
9. bluetooth-peripheral -> Acts as a Bluetooth LE accessory 須要在後臺不斷訪問其餘藍牙設備獲取數據 supported in iOS 6.0 and later ios
官方爲咱們界定了 3 類後臺執行任務的場景:網絡
Background Tasksapp
使用 API beginBackgroundTaskWithExpirationHandler來指定.執行過程當中 APP 被切換到後臺時,任務尚未完成,這個時間又會自動調整爲一個時間片斷(具體多少我沒找到文檔說明,都是說能夠經過backgroundTimeRemaining 屬性獲得)。對於一個固定 task ,每次調用beginBackgroundTaskWithExpirationHandler,都會產生一個 token 值(UIBackgroundTaskIdentifier 實際是個整型),必須在任務執行結束時,調用 endBackgroundTask 並傳遞這個 token,來結束後臺任務。另外,做爲最佳實踐,都應該傳遞一個 超時 handler,以防申請到的時間片斷內,仍是沒能完成任務的話,作最後的清理和標註工做!若是不傳的話,那麼結果就是 iOS 直接 kill 掉你的APP
doc and code from : iOS 後臺任務設計指導框架
// 在某處定義一個 token 變量
UIBackgroundTaskIdentifier _bgTaskToken;
// 進入後臺 委派方法回調
- (void)applicationDidEnterBackground:(UIApplication *)application
{
_bgTaskToken = [application beginBackgroundTaskWithName:@"MyTask" expirationHandler:^{ // 時間到了,任務還沒完成,只能清理 ... // 取消後臺任務 [application endBackgroundTask:_bgTaskToken]; _bgTaskToken = UIBackgroundTaskInvalid; }]; // 異步啓動任務,這樣不會阻塞 本委派方法回調 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // 巴拉巴拉,作本身的任務 ... // 任務在時間限制內結束啦,取消後臺任務 [application endBackgroundTask:_bgTaskToken]; _bgTaskToken = UIBackgroundTaskInvalid; }); }
有三種方式來實現 位置的訪問:異步
The significant-change location service ,字面理解,就是隻有位置有變化時纔會發出通知,有人說這個時機是依據基站,切換了基站時,就會發出一次通知,因此頻率會受基站的密度影響,因此市區更新頻率會比郊區高。但好處 是這個服務無論你的 APP 是在前臺仍是後臺,無論是否已經被掛起,或已經死掉了,他都會喚醒你的進程進行相應處理,因此應該是最省電的async
外設設備有不少,好比一些心率監控器,會在必要的時候向手機推送數據。系統替 APP 監視這個鏈接,但有數據過來時,會喚醒 APP 進行處理,每次喚醒 APP 只有 10 S進行數據處理,若是10S不夠,須要使用 beginBackgroundTaskWithExpirationHandler: 方法再申請一段時間進行處理;ide
【Note】:Apple 要求此類應用 須要提供一個 開啓 和 關閉 鏈接的界面供用戶使用;fetch
服務端推送的通知內容里加入 鍵值對 content-available = 1 ,那麼 手機收到這個通知後,會自動啓動 APP 到後臺,或 喚醒(依舊保持後臺執行),並回調 委託方法application:didReceiveRemoteNotification:fetchCompletionHandler:ui
App Programming Guide for iOS - Background Execution
iOS 後臺任務設計指導