嚴格意義上來講,iOS並不能像Android同樣,真的在後臺開啓一個下載Service,一直下載。可是它能夠進行在系統容許範圍內的後臺上傳和下載。
當使用ios
NSURLSessionConfiguration* sessionConfig = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:identifier]; NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:self.operationQueue];
建立一個Session後,由此Session建立出的NSURLSessionDownloadTask 和 NSURLSessionUploadTask 都會被交給系統的Background Transfer Services負責上傳下載。 這種方法建立的task,不支持block形式的建立方法,必須使用比較原始的delegate回調方式。並且目前NSURLSessionDataTask對background模式的支持很差,切入後臺後, 沒有任何系統回調函數, 過一段時間再把程序切入前臺直接報錯。至於緣由,有以下帖子說明:swift
https://stackoverflow.com/questions/39639268/ios-background-task-using-nsurlsessiondatatask服務器
其中的主要意思是,NSURLSessionDataTask是把數據保存在內存中的,而Background Transfer Services沒法跨進程讀取內存數據。可是實際上,官方文檔並無說明DataTask不支持後臺模式,極可能是目前的iOS版本里存在bug。session
官方推薦的使用方法是在一個Session中,直接將須要處理的任務所有開啓,程序進入後臺,這些任務所有下載完成後,系統會通知程序。這種模式很適合下載的Url數量不多的狀況,好比只須要下載幾個url中的數據。可是若是須要下載幾十個或是上百個url的資源,咱們就不能一會兒發起那麼多的請求,服務器極可能沒法及時響應,致使請求超時出錯。那麼想要達到後臺下載的效果,就須要把衆多請求分組放入多個Session,一個Session中的全部下載完成後,系統回產生回調,咱們在系統回調中再次開啓新的Session,繼續下載。ide
thisistest函數