寫于2013-11-26
從 iOS 7 開始,程序就可以在退到后臺時干一些事情了,包括獲取用戶位置仅孩、獲取網(wǎng)絡數(shù)據(jù)等,本文將介紹如何在后臺獲取網(wǎng)絡數(shù)據(jù)印蓖。
實現(xiàn)
要使用后臺獲取網(wǎng)絡數(shù)據(jù)的功能只需要在 Xcode5 中的項目設置切到 Capabilities 勾選 Background Modes 中的 Background fetch 即可辽慕,如圖
或者直接在 info.plist 文件中添加 key UIBackgroundModes
并選擇 background fetch 。
首先設置后臺獲取的時間間隔:
[[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];
UIApplicationBackgroundFetchIntervalMinimum
表示最小的時間間隔赦肃,而 UIApplicationBackgroundFetchIntervalNever
就表示停止后臺獲取了溅蛉。你也可以設置你自己想要的時間間隔,比如天氣類的軟件就可以設置成1小時即3600秒摆尝。要說明的是温艇,這個時間間隔并不是絕對的,是否調(diào)用獲取函數(shù)完全是系統(tǒng)說了算堕汞,你設置的時間只是最小時間勺爱,比如你設置成1小時并不是每小時都會調(diào)用獲取函數(shù),當系統(tǒng)高興時每次調(diào)用的時間間隔不會小于1小時讯检,如果系統(tǒng)不高興了可能1天都不會調(diào)用一次琐鲁。
那么在哪里獲取網(wǎng)絡數(shù)據(jù)呢?你需要在 app delegate 文件中添加如下代碼:
- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler {
__block UIBackgroundFetchResult result = UIBackgroundFetchResultFailed;
[[AFHTTPSessionManager manager] GET:url
parameters:parameters
success:^(NSURLSessionDataTask *task, id responseObject) {
if (responseObject)
result = UIBackgroundFetchResultNewData;
else
result = UIBackgroundFetchResultNoData;
completionHandler(result);
}
failure:^(NSURLSessionDataTask *task, NSError *error) {
result = UIBackgroundFetchResultFailed;
completionHandler(result);
}];
}
上面的代碼是使用 AFNetworking
在后臺獲取網(wǎng)絡數(shù)據(jù)的基本邏輯人灼。其中需要注意的是 completionHandler
函數(shù)围段,不管獲取數(shù)據(jù)成功還是失敗,一定要在最后調(diào)用該函數(shù)并傳入相應的 UIBackgroundFetchResult
投放。
為什么一定要調(diào)用 completionHandler
呢奈泪?首先,系統(tǒng)根據(jù) result
的值來判斷你的程序在后臺程序里的優(yōu)先級和后臺調(diào)用行為灸芳,如果你不調(diào)用該函數(shù)涝桅,在一段時間之后系統(tǒng)將不再激活你的程序去后臺獲取了。其次烙样,系統(tǒng)會在調(diào)用 completionHandler
時截取你的應用更新數(shù)據(jù)后的新UI截圖冯遂,并用于后臺切換的示意圖(即雙擊home鍵實現(xiàn)的應用圖片)
測試
運行程序后,如圖點擊 Debug 菜單中的 Simulate Background Fetch 即可谒获。
另一種方法稍微復雜一點蛤肌,修改 Scheme 或新建一個 Scheme 壁却,在 Scheme 設置的 Options 標簽下選中 Background Fetch ,如圖:
由于后臺獲取的不確定性裸准,想實機測試的話比較困難展东,可以將獲取間隔設置成 UIApplicationBackgroundFetchIntervalMinimum
,同時關掉系統(tǒng)所有其他后臺程序(雙擊home鍵并滑出)炒俱,然后鎖屏并等待5分鐘以上琅锻,在解鎖機器后調(diào)用后臺獲取的概率比較大。
注意
- 后臺獲取并不是無限制的向胡,系統(tǒng)在激活你的應用之后會給大概30秒的時間用于處理網(wǎng)絡數(shù)據(jù),所以應該盡量減少數(shù)據(jù)獲取量并避免更新UI惊完,更好的方式是在后臺獲取少量數(shù)據(jù)并存儲然后在下次進入應用時再更新必要的UI變化
- 后臺調(diào)用具有不確定性僵芹,所以不要用于需要準確性的功能,比如定時提醒
- 在不需要后臺獲取時將獲取間隔設為
UIApplicationBackgroundFetchIntervalNever
小槐,避免不必要的消耗 - 不要一味的將獲取間隔設為最小值拇派,根據(jù)你的應用的需求來設置,比如只會每天變化的數(shù)據(jù)就應該設置成24*3600秒