標籤:
項目裡遇到需求需要App進入後台還能執行一些任務,於是便Google了一下,整理一篇小記錄。
大家都知道iOS系統裡,所有App進入背景時候預設都是會暫停所有線程,等到再雙擊Home鍵回到前台才會繼續執行。那有的情境需要在後台進行upload、download,或者進行一些計算等等怎麼辦呢?
iOS7推出了一些新的API,讓,那就是 NSURLSession ,就是為了取代前 NSURLConnection而生,在我們常用的 AFNetworking 2.0 中也新增了對其的支援 (AFURLSessionManager/AFHTTPSessionManager) ,用 NSURLSession 可以很方便快速地進行一些背景網路任務,很強大,網上資料也很多了,本文就不多提它了,後面也許會單獨對 NSURLSession 背景工作專門寫篇文章。
今天要介紹的是 long-running background task,"長時間運行背景工作",中文應該是這個名字,當我們需要進入後台不暫停程式,就可以給系統說一聲 "我需要在後台執行任務了哦~",然後你的 App 就不會被系統掛起,準確來說是延遲暫停,注意這是全域的,意思就是 App 裡所有東西都將正常執行,就跟在前台一樣。不過系統給你這個許可權的時間是有限的。
Begin
首先我們需要定義一個 UIBackgroundTaskIdentifier 對象,噢,Command 點進去居然是個NSUInteger,
UIBackgroundTaskIdentifier myTask;
然後有兩個方法來開始背景工作,都是在 UIApplication 裡,可以看到第二個方法可以傳一個taskName參數,而且是iOS7新增的。(原來 iOS4.0 就支援了~)
在 Apple 的文檔裡是這麼介紹的:
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);
好,那我們來開始一個背景工作:
myTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{// 背景工作到期執行,好像是10分鐘}];
執行上面這句話後,當你的 App 再次進入後台時就不會被馬上暫停了。但是我們不能濫用這個,為了自己的App負責,也為使用者的 iPhone 負責,關鍵是濫用的話 App Store 審核那也過不去的...
Stop
所以,有開就有關:
[[UIApplication sharedApplication] endBackgroundTask: myTask];myTask = UIBackgroundTaskInvalid;
另外 UIApplication 還提供兩個個屬性 backgroundTimeRemaining 和backgroundRefreshStatus,可自行研究...
註:關於這個時間問題,筆者也有些不解,在測試的時候 ExpirationHandler 會在 180 秒左右,也就是 3 分鐘的時候觸發,但背景工作還是在繼續。求大神解惑!
參考文章:
- iOS App Programming Guide - App States and Multitasking
- Hour 21: Building Background-Aware Applications
- Continue uploading process in background IOS
iOS 背景工作之 Long-running background task