iOS後臺模式BackgroundMode

概述

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 Tasks:APP 在前臺時啓動某項任務,而後在未結束以前忽然 切換到了後臺,那麼 APP 能夠在切換回調裏使用某些 API 來繼續向系統請求一些時間來繼續完成這個任務;完成以後通知系統,以後系統會將 APP 掛起;
  • Downloading:在後臺啓動從網絡下載文件的任務 – 對於文件下載,iOS 有專門的機制;
  • Specific Backgournd Tasks:應用須要在後臺一直執行代碼;

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; }); }

Apple Doc

Tracking the User’s Location

有三種方式來實現 位置的訪問:異步

  • The significant-change location service(這也是官方推薦的方式)
  • Foreground-only location services
  • Background location services

The significant-change location service ,字面理解,就是隻有位置有變化時纔會發出通知,有人說這個時機是依據基站,切換了基站時,就會發出一次通知,因此頻率會受基站的密度影響,因此市區更新頻率會比郊區高。但好處 是這個服務無論你的 APP 是在前臺仍是後臺,無論是否已經被掛起,或已經死掉了,他都會喚醒你的進程進行相應處理,因此應該是最省電的async

Communicating with an External Accessory

外設設備有不少,好比一些心率監控器,會在必要的時候向手機推送數據。系統替 APP 監視這個鏈接,但有數據過來時,會喚醒 APP 進行處理,每次喚醒 APP 只有 10 S進行數據處理,若是10S不夠,須要使用 beginBackgroundTaskWithExpirationHandler: 方法再申請一段時間進行處理;ide

【Note】:Apple 要求此類應用 須要提供一個 開啓 和 關閉 鏈接的界面供用戶使用;fetch

Using Push Notifications to Initiate a Download

服務端推送的通知內容里加入 鍵值對 content-available = 1 ,那麼 手機收到這個通知後,會自動啓動 APP 到後臺,或 喚醒(依舊保持後臺執行),並回調 委託方法application:didReceiveRemoteNotification:fetchCompletionHandler:ui

Reference

App Programming Guide for iOS - Background Execution 
iOS 後臺任務設計指導

相關文章
相關標籤/搜索