iOS 後臺任務之 Long-running background task

項目裏遇到需求須要App進入後臺還能執行一些任務,因而便Google了一下,整理一篇小記錄。css

你們都知道iOS系統裏,全部App進入後臺的時候默認都是會暫停全部線程,等到再雙擊Home鍵回到前臺纔會繼續執行。那有的場景須要在後臺進行upload、download,或者進行一些計算等等怎麼辦呢?html

iOS7推出了一些新的API,讓,那就是 NSURLSession ,就是爲了取代前 NSURLConnection而生,在咱們經常使用的 AFNetworking 2.0 中也新增了對其的支持 (AFURLSessionManager/AFHTTPSessionManager) ,用 NSURLSession 能夠很方便快速地進行一些後臺的網絡任務,很強大,網上資料也不少了,本文就很少提它了,後面也許會單獨對 NSURLSession 後臺任務專門寫篇文章。ios

今天要介紹的是 long-running background task,"長時間運行後臺任務",中文應該是這個名字,當咱們須要進入後臺不暫停程序,就能夠給系統說一聲 "我須要在後臺執行任務了哦~",而後你的 App 就不會被系統掛起,準確來講是延遲暫停,注意這是全局的,意思就是 App 裏全部東西都將正常執行,就跟在前臺同樣。不過系統給你這個權限的時間是有限的。網絡

Begin

首先咱們須要定義一個 UIBackgroundTaskIdentifier 對象,噢,Command 點進去竟然是個NSUIntegerapp

UIBackgroundTaskIdentifier myTask;

而後有兩個方法來開始後臺任務,都是在 UIApplication 裏,能夠看到第二個方法能夠傳一個taskName參數,並且是iOS7新增的。(原來 iOS4.0 就支持了~)
在 Apple 的文檔裏是這麼介紹的:ide

Marks the beginning of a new long-running background task.測試

- (UIBackgroundTaskIdentifier)beginBackgroundTaskWithExpirationHandler:(void(^)(void))handler  NS_AVAILABLE_IOS(4_0);
- (UIBackgroundTaskIdentifier)beginBackgroundTaskWithName:(NSString *)taskName expirationHandler:(void(^)(void))handler NS_AVAILABLE_IOS(7_0);

好,那咱們來開始一個後臺任務:ui

myTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
// 後臺任務到期執行,好像是10分鐘
}];

執行上面這句話後,當你的 App 再次進入後臺時就不會被立刻暫停了。可是咱們不能濫用這個,爲了本身的App負責,也爲用戶的 iPhone 負責,關鍵是濫用的話 App Store 審覈那也過不去的...url

Stop

因此,有開就有關:spa

[[UIApplication sharedApplication] endBackgroundTask: myTask];
myTask = UIBackgroundTaskInvalid;

另外 UIApplication 還提供兩個個屬性 backgroundTimeRemaining 和backgroundRefreshStatus,可自行研究...


注:關於這個時間問題,筆者也有些不解,在測試的時候 ExpirationHandler 會在 180 秒左右,也就是 3 分鐘的時候觸發,但後臺任務仍是在繼續。求大神解惑!


參考文章:

相關文章
相關標籤/搜索