[TOC]
iOS 后臺刷新
首先大概介紹下iOS的APP運行狀態簡介和后臺運行的一些基礎知識
1. App運行狀態簡介
根據官方的介紹
App的運行狀態包括5種,分別為:
- Not running(未運行)
- Inacctive(無效)
- Active(前臺運行)
- Background(后臺運行)
- Suspended(掛起)
2. iOS后臺運行
iOS后臺運行分為三種
- 后臺任務
App在進入后臺后還有任務沒執行完,還需要運行一小段時間,那么可以用Background Task相關API向系統申請運行權限,運行完了再通知系統可以掛起App了 - 后臺模式
需要后臺長時間運行任務的App都需要顯式向系統申請權限,如Background Fetch
,允許App不定時被喚醒來更新一些數據。 - 后臺下載
專指由配置了backgroundSessionConfiguration的NSURLSession管理的下載過程。由系統進程接管App數據的下載,因此即便App被系統掛起,甚至殺死或崩潰了,也能繼續下載。下載完成后App會被喚醒,處理一些狀態更新和回調。
2.1. iOS后臺模式
Audio, AirPlay,and Picture in Picture
Location updates
Voice over IP VoIP
External accessory communication
Uses Bluetooth LE accessories
Acts as a Bluetooth LE accessory
Background fetch
Remote notifications
iOS13 新增 Background processing
從文檔來看,蘋果是允許應用在后臺運行一段時間,但是有時間限制。
那么如何在APP后臺長時間保活呢?
2.2. iOS App 后臺保活方式簡介
2.2.1. 短時間APP后臺保活(有時間限制30s)
該種方式屬于后臺任務,是調用相關的api來實現
官方延長應用程序的后臺執行時間
通過添加beginBackgroundTaskWithName和endBackgroundTask相關的API可以保持APP在后臺處理30s內的網絡任務
2.2.2. 當app需要支持在后臺下載文件時
可以通過設置urlsession的background模式來讓下載任務傳遞給系統,這樣當系統需要終止APP時會自動接收未下載完成的任務,并在下載完成后調用相應的api進行處理
2.2.3. Audio, AirPlay,and Picture in Picture 模式
應用在后臺時可以播放聲音信息。
可以利用此模式播放無聲音樂,App 進入后臺后,播放無聲音樂,配合beginBackgroundTaskWithName對系統申請后臺使用時間,可以使APP在后臺長時間保活。
2.2.4. Location updates 模式
應用提供位置信息 應用場景:在后臺時需要不斷通知用戶位置更新信息。
通過后臺持續定位App,可以實現App后臺保活
如果持續后臺播放無聲音頻或是使用后臺持續定位的方式實現iOS App后臺保活,會浪費電量,浪費CPU,
2.2.5 VoIP 模式
VoIP是能真正做到在App掛起和被殺死情況下實時拉起應用的方法。當然它也有一定的局限性,應用必須要是VoIP應用,即應用中有類似視頻呼叫或者語音呼叫等功能。
2.2.5. Background fetch 模式
應用場景:需不斷地頻繁的基于一定規律從網絡上獲取新的數據,大多數APP的后臺刷新都是使用此模式來完成。
2.2.6. Remote notifications 模式
iOS的靜默推送:收到推送(沒有文字沒有聲音),不用點開通知,不用打開APP,就能執行
-application:didReceiveRemoteNotification:fetchCompletionHandler:
,用戶完全感知不到。
靜默推送的缺點是:
1、如果應用已經被Kill。是無法自動拉起應用的。所以它只能在應用后臺掛起的情況下使用。
2、靜默推送和無法保證應用被實時喚醒。官網說法如下:
靜默推送不是讓您的應用程序在快速刷新操作之后保持醒來的方式,也不是用于高優先級更新的方式。>APN將后臺更新通知視為低優先級,如果總數過多,APN可能會將其傳輸完全限制在一定程度。實際的限>制是動態的,可以根據條件進行更改,但不要每小時發送一次以上的通知。
2.2.7. External accessory communication 模式
有規律的從外部藍牙設備獲取信息, 可以在后臺不斷的與外設進行溝通,開啟后可讓應用不斷的與外設進行溝通。
2.2.8. Uses Bluetooth LE accessories/Acts as a Bluetooth LE accessory 模式
這兩種模式區別是一個是將設備作為外圍設備,一個是將設備作為中心設備。需要在后臺不斷訪問其他藍牙設備獲取數據或不斷更新藍牙狀態。
2.2.9 Background processing
這是iOS13新增的一個模式,基于BackgroundTasks,
有點在于不會檢測cpu的占用率,也會啟動應用的后臺任務。
3. 關于后臺執行序列
3.1 如果當前APP未運行
- 應用程序啟動
- 執行
applicationDidEnterBackground(_:)
代理方法 - 執行引起應用程序啟動的后臺event
- 生成APP快照
- 當事件處理完畢,可能再次進入掛起狀態
3.2. 如果當前APP在內存中并處于掛起狀態
- 系統恢復該APP
- 執行
applicationDidEnterBackground(_:)
代理方法 - 執行引起應用程序啟動的后臺event
- 生成APP快照
- 當事件處理完畢,可能再次進入掛起狀態