iOS后台模式BackgroundMode


概述

iOS平台提供給應用特殊的后台服務,應用在后台時仍被允許能執行一會。

后台模式

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 
這里寫圖片描述

后台執行場景

官方為我們界定了 3 類后台執行任務的場景:

  • Background Tasks:APP 在前台時啟動某項任務,然后在未結束之前突然 切換到了后台,那么 APP 可以在切換回調里使用某些 API 來繼續向系統請求一些時間來繼續完成這個任務;完成之后通知系統,之后系統會將 APP 掛起;
  • Downloading:在后台啟動從網絡下載文件的任務 – 對於文件下載,iOS 有專門的機制;
  • Specific Backgournd Tasks:應用需要在后台一直執行代碼;

Background Tasks

使用 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 是在前台還是后台,不管是否已經被掛起,或已經死掉了,他都會喚醒你的進程進行相應處理,所以應該是最省電的

Communicating with an External Accessory

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

【Note】:Apple 要求此類應用 需要提供一個 開啟 和 關閉 連接的界面供用戶使用;

Using Push Notifications to Initiate a Download

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

Reference

App Programming Guide for iOS - Background Execution 
iOS 后台任務設計指導


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM