严格意义上来讲,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函数