在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中的多任務
==========================華麗的分割線==============================
日劇高手是一個根據劇照猜劇名的App,App向用戶提供日劇的劇照,由用戶來選擇答
案。
系統裏面如今包含三百部日劇的劇照,若是你想知道本身的日劇水平怎麼樣,就來挑戰
下吧 O(∩_∩)O~
下載地址:
https://itunes.apple.com/cn/app/ri-ju-gao-shou/id889031444?mt=8
--