[TOC]
iOS 后臺刷新
首先大概介紹下iOS的APP運行狀態(tài)簡介和后臺運行的一些基礎(chǔ)知識
1. App運行狀態(tài)簡介
根據(jù)官方的介紹
App的運行狀態(tài)包括5種,分別為:
- Not running(未運行)
- Inacctive(無效)
- Active(前臺運行)
- Background(后臺運行)
- Suspended(掛起)
2. iOS后臺運行
iOS后臺運行分為三種
- 后臺任務(wù)
App在進入后臺后還有任務(wù)沒執(zhí)行完,還需要運行一小段時間入热,那么可以用Background Task相關(guān)API向系統(tǒng)申請運行權(quán)限,運行完了再通知系統(tǒng)可以掛起App了 - 后臺模式
需要后臺長時間運行任務(wù)的App都需要顯式向系統(tǒng)申請權(quán)限揪荣,如Background Fetch
,允許App不定時被喚醒來更新一些數(shù)據(jù)往史。 - 后臺下載
專指由配置了backgroundSessionConfiguration的NSURLSession管理的下載過程仗颈。由系統(tǒng)進程接管App數(shù)據(jù)的下載,因此即便App被系統(tǒng)掛起椎例,甚至殺死或崩潰了挨决,也能繼續(xù)下載。下載完成后App會被喚醒订歪,處理一些狀態(tài)更新和回調(diào)脖祈。
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)
該種方式屬于后臺任務(wù)撞蚕,是調(diào)用相關(guān)的api來實現(xiàn)
官方延長應用程序的后臺執(zhí)行時間
通過添加beginBackgroundTaskWithName和endBackgroundTask相關(guān)的API可以保持APP在后臺處理30s內(nèi)的網(wǎng)絡(luò)任務(wù)
2.2.2. 當app需要支持在后臺下載文件時
可以通過設(shè)置urlsession的background模式來讓下載任務(wù)傳遞給系統(tǒng),這樣當系統(tǒng)需要終止APP時會自動接收未下載完成的任務(wù)邮破,并在下載完成后調(diào)用相應的api進行處理
2.2.3. Audio, AirPlay诈豌,and Picture in Picture 模式
應用在后臺時可以播放聲音信息仆救。
可以利用此模式播放無聲音樂抒和,App 進入后臺后矫渔,播放無聲音樂,配合beginBackgroundTaskWithName對系統(tǒng)申請后臺使用時間摧莽,可以使APP在后臺長時間泵硗荩活。
2.2.4. Location updates 模式
應用提供位置信息 應用場景:在后臺時需要不斷通知用戶位置更新信息镊辕。
通過后臺持續(xù)定位App油够,可以實現(xiàn)App后臺保活
如果持續(xù)后臺播放無聲音頻或是使用后臺持續(xù)定位的方式實現(xiàn)iOS App后臺闭餍福活石咬,會浪費電量,浪費CPU卖哎,
2.2.5 VoIP 模式
VoIP是能真正做到在App掛起和被殺死情況下實時拉起應用的方法鬼悠。當然它也有一定的局限性,應用必須要是VoIP應用亏娜,即應用中有類似視頻呼叫或者語音呼叫等功能焕窝。
2.2.5. Background fetch 模式
應用場景:需不斷地頻繁的基于一定規(guī)律從網(wǎng)絡(luò)上獲取新的數(shù)據(jù),大多數(shù)APP的后臺刷新都是使用此模式來完成维贺。
2.2.6. Remote notifications 模式
iOS的靜默推送:收到推送(沒有文字沒有聲音)它掂,不用點開通知,不用打開APP溯泣,就能執(zhí)行
-application:didReceiveRemoteNotification:fetchCompletionHandler:
虐秋,用戶完全感知不到。
靜默推送的缺點是:
1垃沦、如果應用已經(jīng)被Kill客给。是無法自動拉起應用的。所以它只能在應用后臺掛起的情況下使用栏尚。
2起愈、靜默推送和無法保證應用被實時喚醒。官網(wǎng)說法如下:
靜默推送不是讓您的應用程序在快速刷新操作之后保持醒來的方式译仗,也不是用于高優(yōu)先級更新的方式抬虽。>APN將后臺更新通知視為低優(yōu)先級,如果總數(shù)過多纵菌,APN可能會將其傳輸完全限制在一定程度阐污。實際的限>制是動態(tài)的,可以根據(jù)條件進行更改咱圆,但不要每小時發(fā)送一次以上的通知笛辟。
2.2.7. External accessory communication 模式
有規(guī)律的從外部藍牙設(shè)備獲取信息, 可以在后臺不斷的與外設(shè)進行溝通功氨,開啟后可讓應用不斷的與外設(shè)進行溝通。
2.2.8. Uses Bluetooth LE accessories/Acts as a Bluetooth LE accessory 模式
這兩種模式區(qū)別是一個是將設(shè)備作為外圍設(shè)備手幢,一個是將設(shè)備作為中心設(shè)備捷凄。需要在后臺不斷訪問其他藍牙設(shè)備獲取數(shù)據(jù)或不斷更新藍牙狀態(tài)。
2.2.9 Background processing
這是iOS13新增的一個模式围来,基于BackgroundTasks跺涤,
有點在于不會檢測cpu的占用率,也會啟動應用的后臺任務(wù)监透。
3. 關(guān)于后臺執(zhí)行序列
3.1 如果當前APP未運行
- 應用程序啟動
- 執(zhí)行
applicationDidEnterBackground(_:)
代理方法 - 執(zhí)行引起應用程序啟動的后臺event
- 生成APP快照
- 當事件處理完畢没酣,可能再次進入掛起狀態(tài)
3.2. 如果當前APP在內(nèi)存中并處于掛起狀態(tài)
- 系統(tǒng)恢復該APP
- 執(zhí)行
applicationDidEnterBackground(_:)
代理方法 - 執(zhí)行引起應用程序啟動的后臺event
- 生成APP快照
- 當事件處理完畢停团,可能再次進入掛起狀態(tài)