此次 iOS7 對程序後臺運行進行了增強,可是僅僅是增強而已,要想像 Android 程序那樣自由固然就別想了,蘋果這麼作主要仍是出於電池使用時間考慮,可是此次的增強對大部分程序基本夠用。ios
在介紹以前, 咱們先回顧一下在 iOS7 以前的後臺運行相關的知識。在 iOS7 以前(iOS4 以後)主要有三類的應用程序可以後臺運行:服務器
除了這三種應用,其餘程序只能是在進入後臺以前向系統請求一個額外的運行時間(最長爲 10 分鐘),並在該時間內來進行後臺運行操做,如保存用戶信息,上傳或下載數據,進行視頻編碼等操做。網絡
- (void)applicationDidEnterBackground:(UIApplication *)application { static UIBackgroundTaskIdentifier task; task = [application beginBackgroundTaskWithExpirationHandler:^{ task = UIBackgroundTaskInvalid; }; // 執行後臺操做 [application endBackgroundTask:task]; }
此次 iOS7 支持了兩種新的程序後臺運行模式:session
須要按期請求數據的程序能夠在系統中註冊,這樣程序就能夠在後臺被按期喚醒來下載新的數據。這種狀況須要在程序的 Info.plist 文件中 UIBackgroundModes 項增長 fetch 類型,同時經過 setMinimumBackgroundFetchInterval: 方法來設置程序按期獲取數據的最小時間間隔。你須要實現 application:performFetchWithCompletionHandler: 代理方法並在該方法內執行下載操做。app
程序還能夠經過後臺消息推送服務來通知用戶有新的內需能夠下載,同時激活後臺下載操做。這種須要在 UIBackgroundModes 項中增長 remote-notification 值,同時你須要實現 AppDelegate 方法 application:didReceiveRemoteNotification:fetchCompletionHandler: 來執行你的下載操做。ide
無論是支持 fetch 或 remote-notification 後臺運行模式的程序,都有可能被系統在合適的時候啓動或從後臺掛起狀態移除調。在 fetch 模式下,系統會利用有效的信息來決定啓動或激活程序的最佳時期。例如:系統可能會在網絡情況良好或者設備剛解鎖的時候讓程序執行 fetch 操做。支持 remote-notifiaction 的程序,能夠在接收到推送消息的時候被喚醒,但在用戶接收到推送消息以前,程序能夠經過按期獲取的形式下載最新內容,並在隨後的推送消息以前就已經準備好將內容展示給用戶。測試
爲了執行後臺下載操做,程序應該使用新增的 NSURLSession 類,該類在以前的 NSURLConnectoin 的基礎上提供了更簡潔、基於任務的接口來啓動並執行 NSURLRequest 對象。一個 NSURLSession 對象能夠啓動多個下載或上傳任務,並在代理方法裏面來處理來自服務器的認證請求。fetch
如今咱們來實現 fetch 和 remote-notifiaction 兩種後臺運行。ui
在 Xcode5.0 裏面 Capabilities 下能夠直接經過勾選的方式選擇應用須要支持的後臺運行的類型(可多選哦),咱們選中 Background fetch 和 Remote notification 兩項。並在程序的 Info.plist 文件中的 Required background modes 中添加 fetch 和 remote-notification 兩項。編碼
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. [application setMinimumBackgroundFetchInterval: UIApplicationBackgroundFetchIntervalMinimum]; return YES; } - (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{ NSURL *url = [NSURL URLWithString:@"http://127.0.0.1:3000/update.do"]; NSURLSession *updateSession = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; [updateSession dataTaskWithHTTPGetRequest:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { NSDictionary *messageInfo = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; NSLog(@"messageInfo:%@",messageInfo); completionHandler(UIBackgroundFetchResultNewData); }]; }
首先在 application:didFinishLaunchingWithOptions: 中設置 minimun background fetch interval 類型爲 UIApplicationBackgroundFetchIntervalMinimum(默認爲 UIApplicationBackgroundFetchIntervalNever),而後實現代理方法 application:performFetchWithCompletionHandler: 中實現數據請求。
爲了測試程序後臺運行,咱們能夠新建一個 Scheme,選中 Background Fetch(Launch due to a background fetch event),而後在該 Scheme 下運行程序,程序並不會啓動,可是你能看到它給後臺發了請求。
相似要實現 remote-notification 模式,須要在原來支持 push 的條件下實現 application:didReceiveRemoteNotification:fetchCompletionHandler: 代理方法,程序在後臺收到 payload 中包含 "content-available = 1" 的推送消息時,會執行該代理方法。(由於模擬器沒法模擬消息推送,iPad 版本的 iOS7 還沒提供下載,因此我暫時無法親測)。
總的來講實現上沒有什麼太複雜的東西,關鍵是你怎麼樣將這兩種新的後臺運行模式應用到你的程序中。
Posted by XiaoYi_HD - 6月 23 2013
如需轉載,請註明: 本文來自 Esoft Mobile