iOS7 新後臺及下載SDK介紹

   在iOS7之前的系統中,App默認是不能後臺運行的,若是要後臺運行,能夠採用如下兩類方法:ios

  (1)使用beginBackgroundTaskWithExpirationHandler函數,向系統申請一段時間來執行須要後臺運行的操做,這種方法的缺點是,後臺操做最多隻能運行10分鐘,超過10分鐘以後App會休眠。使用這種方法須要APPNAME-info.plist中設置Application does not run in background爲NO,而後在適當的時間調用beginBackgroundTaskWithExpirationHandler函數。網絡

 (2)將App的後臺運行模式設置爲audio 、VOIP、location、Newstand等。使用這種方法,能夠無限制的在後臺運行,以audio爲例,將plist中的Required background modes項目設置爲App plays audio or streams audio/video using AirPlay,而且在進入後臺時播放無聲音樂,就可讓App一直運行。這種方法的缺點是,若是使用不當,可能會被AppStore拒絕。由於審覈時是能夠經過靜態分析知道使用了哪些API的,若是一個程序原本就不是音樂類的,卻使用了播放音樂的API後臺播音樂,有可能就被拒絕,若是想要繞過這個限制,能夠向APP增長播放音樂的功能,但這樣實際是增長了無用功能。session

    在iOS7之後,系統增長了兩種後臺的模式,一種是Background fetch ,另外一種是Remote notification,下面分別介紹。app

    Background fetch:  設置了這種後臺方式以後,當App休眠以後,會隔一段時間被系統喚醒,從而執行一段短期操做。喚醒的間隔由系統決定,App中能夠設置[[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];,但即便設置了,間隔也不肯定是多少。另外,App被喚醒後,能夠執行操做的時間也不長,文檔上描述的30秒左右(實際上更長也能夠,可是可能會下降之後被喚醒的概率)。ide

  Remote notification:在iOS7之前,當系統收到推送消息後,會當即彈出消息提示用戶,用戶點擊消息以後,就能夠啓動App,而後加載數據。使用了這種新的後臺模式以後,當系統收到推送消息以後,會喚醒App,給App一個機會執行一部分操做,等操做以後才提醒用戶,並且還支持silent模式,即執行完操做以後,徹底不對用戶作任何提醒,默默的就在後臺把活幹完了。函數

   除了增長了上述的兩種新後臺模式之外,ios7還增長了一下傳輸數據的方法,即Background Transfer service 。fetch

(1)Background Transfer service概述ui

      這種方法的名字很容易讓人誤解,覺得是App進入後臺時,使用這種方法進行數據傳輸。實際上,這種方法與後臺無關。 當App使用了這種方法後,能夠將一個下載任務交給系統的獨立進程去下載,無論App在前臺、休眠、以及crash,下載過程都在進行,由於是系統的獨立進程在爲App進行下載。當系統的下載任務結束或者出錯時,系統會喚醒App,調用其中的函數,讓App作一部分處理,好比讓App從新添加其餘任務。這裏有一個缺點就是,若是由於沒有網絡致使系統下載失敗了,系統即便喚醒了App,App也是沒有辦法下載的,而後App會進入休眠,即便後面有了網絡,系統也不會繼續下載,由於只要系統向App發出了失敗的信號,除非App 調用resume函數來恢復下載過程,系統是不會本身恢復下載的。這裏就須要用到前面提到的fetch後臺模式,讓App過一段時間被系統喚醒,而後App就能夠去檢查網絡,當有網時恢復下載過程。url

(2)相關類介紹spa

  NSURLSession  session類

  NSURLSessionConfiguration 用於初始化session的配置類

  NSURLSessionTask—The base class for tasks within a session.  全部task的基類

  NSURLSessionDataTask 用來讀取url的返回內容的task類(不支持background session)

  NSURLSessionUploadTask用於上傳文件的task類

  NSURLSessionDownloadTask 用於將url下載成爲臨時文件的task類

  NSURLSessionDelegate  處理session級別的事件

  NSURLSessionTaskDelegate處理全部task級別的通用事件

  NSURLSessionDataDelegate 處理與讀取Data有關的事件

  NSURLSessionDownloadDelegate    處理與下載文件有關的事件

 

(3)使用步驟(如下載文件爲例)

  1. 建立URLSession

- (NSURLSession *)backgroundSession

{

    //Use dispatch_once_t to create only one background session. If you want more than one session, do with different identifier

    static NSURLSession *session = nil;

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration backgroundSessionConfiguration:session_id];

        configuration.discretionary = YES;

        session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil];

    });

    [configDict setObject:session_id forKey:@"session_id"];

    return session;

}

 

  2.建立DownloadTask

         NSURL *downloadURL = [NSURL URLWithString:@"http:// 17-45990.dmg"];

        NSURLRequest *request = [NSURLRequest requestWithURL:downloadURL];

        self.session = [self backgroundSession];

 

        self.downloadTask = [self.session downloadTaskWithRequest:request];

 

         [self.downloadTask resume];

   當建立完task,而且resume以後,任務就開始下載了

 

  3.實現下載的回調,接收事件

(1) 在須要響應回調的類裏面實現NSURLSessionDelegate、NSURLSessionTaskDelegate、NSURLSessionDownloadDelegate等協議

(2)實現如下函數:

   URLSession:downloadTask: didWriteData   得到當前下載的數據大小及總大小

   URLSession: downloadTask: didFinishDownloadingToURL   成功下載以後調用,能夠得到臨時文件的本地地址

   URLSession: task: didCompleteWithError  文件下載失敗的回調

   URLSessionDidFinishEventsForBackgroundURLSession:  一個session結束以後,會在後臺調用

   application: performFetchWithCompletionHandler: 當App被fetch喚醒時調用

   application: handleEventsForBackgroundURLSession:completionHandler: 在這個函數中檢查是否傳輸已經完成,而後調用completionHandle來更新AppSwitcher界面

  4. 關於斷點續傳

   (1)因爲下載過程是由系統在處理,即便App被殺死也不影響下載,所以App無需在斷網或者退出時記錄當前的下載位置。

   (2)當下載過程開啓後,只要系統沒有發出失敗信號,即便斷網了、系統關機了,等恢復網絡或者系統重啓以後,系統會繼續下載,此時app只須要建立與上次相同id的session,便可接收到下載進度信息。若是app收到了失敗信號,須要從nserro中經過userinfo來獲取resumedata,從而在下次恢復下載時,使用downloadTaskWithResumeData函數來建立task,這樣就能夠斷點續傳,而不是用downloadTaskWithRequest來建立task,後者會開啓一個新的下載。

 

參考: iOS7中的多任務

         iOS Backgrounding Techniques

 

==========================華麗的分割線==============================

 日劇高手是一個根據劇照猜劇名的App,App向用戶提供日劇的劇照,由用戶來選擇答
案。
   系統裏面如今包含三百部日劇的劇照,若是你想知道本身的日劇水平怎麼樣,就來挑戰
下吧 O(∩_∩)O~

   下載地址:
   https://itunes.apple.com/cn/app/ri-ju-gao-shou/id889031444?mt=8 
--

相關文章
相關標籤/搜索