iOS7中的多任務I

改變了後臺任務的運行方式ios

  在iOS6和以前的系統中,系統在用戶退出應用後,若是應用正在執行後臺任務的話,系統會保持活躍狀態直到後臺任務完成或者是超時之後,纔會進入真正的低功耗休眠狀態。網絡

  

  而在iOS7中,後臺任務的處理方式發生了改變。系統將在用戶鎖屏後儘快讓設備進入休眠狀態,以節省電力,這時後臺任務是被暫停的。以後在設備在特定時間進行系統應用的操做被喚醒(好比檢查郵件或者接到來電等)時,以前暫停的後臺任務將一塊兒進行。就是說,系統不會專門爲第三方的應用保持設備處於活動狀態。以下圖示:session

  

  這個變化在不減小應用的後臺任務時間長度的狀況下,給設備帶來了更多的休眠時間,從而延長了續航。對於開發者來講,這個改變動多的是系統層級的變化,對於非網絡傳輸的任務來講,保持原來的用法便可,新系統將會按照新的喚醒方式進行處理;而對於原來在後臺作網絡傳輸的應用來講,蘋果建議在iOS7中使用NSURLSession,建立後臺的session並進行網絡傳輸,這樣能夠很容易地利用更好的後臺傳輸API,而沒必要受限於原來的時長,關於這個具體的咱們一下子再說。app

後臺獲取(Background Fetch)fetch

  如今的應用沒法在後臺獲取信息,好比社交類應用,用戶必定須要在打開應用以後才能進行網絡鏈接,獲取新的消息條目,而後才能將新內容呈現給用戶。說實話這個體驗並非很好,用戶在打開應用後一定會有一段時間的等待,每次皆是如此。spa

  iOS7中新加入的後臺獲取就是用來解決這個不足的:後臺獲取乾的事情就是在用戶打開應用以前就使app有機會執行代碼來獲取數據,刷新UI。這樣在用戶打開應用的時候,最新的內容將已然呈如今用戶眼前,而省去了全部的加載過程。調試

  一、勾選Background Fetch。code

  

  二、設定獲取間隔。若是不對最小後臺獲取間隔進行設定的話,系統將使用默認值UIApplicationBackgroundFetchIntervalNever,也就是永遠不進行後臺獲取。固然,-setMinimumBackgroundFetchInterval:方法接受的是NSTimeInterval,所以你也能夠手動指定一個以秒爲單位的最小獲取間隔。orm

    [[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum]; blog

  三、實現後臺獲取代碼並通知系統。在AppDelegate裏實現-application:performFetchWithCompletionHandler:。

   系統將會在執行fetch的時候調用這個方法,而後開發者須要作的是在這個方法裏完成獲取的工做,而後刷新UI,並通知系統獲取結束,以便系統儘快回到休眠狀態。應用在前臺能完成的工做在這裏都能作,惟一的限制是系統不會給你很長時間來作fetch,通常會小於一分鐘,並且fetch在絕大多數狀況下將和別的應用共用網絡鏈接。這些時間對於fetch一些簡單數據來講是足夠的了,好比微博的新條目。

  四、通知系統獲取完成。

  方法是調用-application:performFetchWithCompletionHandler:的handler。這個CompletionHandler接收一個UIBackgroundFetchResult做爲參數,可供選擇的結果有UIBackgroundFetchResultNewData,UIBackgroundFetchResultNoData,UIBackgroundFetchResultFailed三種,分別表示獲取到了新數據(此時系統將對如今的UI狀態截圖並更新App Switcher中你的應用的截屏),沒有新數據,以及獲取失敗。

 1 //File: YourAppDelegate.m
 2 -(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
 3 {
 4     UINavigationController *navigationController = (UINavigationController*)self.window.rootViewController;
 5 
 6     id fetchViewController = navigationController.topViewController;
 7     if ([fetchViewController respondsToSelector:@selector(fetchDataResult:)]) {
 8         [fetchViewController fetchDataResult:^(NSError *error, NSArray *results){
 9             if (!error) {
10                 if (results.count != 0) {
11                     //Update UI with results.
12                     //Tell system all done.
13                     completionHandler(UIBackgroundFetchResultNewData);
14                 } else {
15                     completionHandler(UIBackgroundFetchResultNoData);
16                 }
17             } else {
18                 completionHandler(UIBackgroundFetchResultFailed);
19             }
20         }];
21     } else {
22         completionHandler(UIBackgroundFetchResultFailed);
23     }
24 }

  五、後臺獲取調試

    1) 新建Background Fetch Scheme。

    

    2)當應用在後臺時,模擬一次後臺獲取。這個比較簡單,在app調試運行時,點擊Xcode5的Debug菜單中的Simulate Background Fetch,便可模擬完成一次獲取調用。

參考:http://onevcat.com/2013/08/ios7-background-multitask/

相關文章
相關標籤/搜索