参考:
NSURLSession:通过HTTP(s)下载内容,进行身份验证,并支持后台下载。
一个Session可以对应多个task,session与task都有不同类型。
session的类型
default session:使用持久化存储进行缓存。
ephemera session:使用内存进行临时缓存。
background session:类似default session,分离的线程处理数据传输。
task的类型
data tasks:NSData类型数据传递,不支持后台session。
download tasks:通常为file类型,支持session。
upload tasks:通常为file类型,支持background session。
系统提供代理优先级高于自定义代理;整个任务流程如下:
(一)URLSession生命周期与系统提供的代理间交互:
1,创建session configuration;
2,创建session;
3,创建task,调用resume开始任务;
4,下载中:
cancelByProductingResumeData:中断下载
downloadTaskWithResumeData:重新下载
或downloadTaskWithResumeData:completionHandler:创建新下载任务继续下载;
5,下载完成,调用completion handler;
下载错误显示在客户端,
服务端错现在在NSHTTPURLResponse 对象中;
6,session撤销:
invalidateAndCancel,取消未完成任务销毁session;
finishTasksAndInvalidate,待完成任务后
(二)RLSession生命周期与自定义代理间交互:
1,创建session configuration;
2,创建session;
3,创建task,调用resume开始任务;
4,远程服务器需要认证,并且认证是连接级别的:
4.1,session级别校验:
NSURLAuthenticationMethodNTLM,
NSURLAuthenticationMethodNegotiate,
NSURLAuthenticationMethodClientCertificate,
NSURLAuthenticationMethodServerTrust;
session调用:URLSession:didReceiveChallenge:completionHandler:
task调用:URLSession:task:didReceiveChallenge:completionHandler:
4.2,非session级别校验:
NSURLAuthenticationMethod…等其他方式
session调用:URLSession:task:didReceiveChallenge:completionHandler:
4.3,调用验证失败或任务数据来自流,调用URLSession:task:needNewBodyStream:
5,HTTP需要重定向:
URLSession:task:willPerformHTTPRedirection:newRequest:CompletionHandler:
6,对于download task的中断与续传:
中断方式1:downloadTaskWithResumeData:
中断方式2:downloadTaskWithResumeData:completionHandler:
session使用以下调用来创建新的download task来下载:
URLSession:downloadTask:didResumeAtOffset:expectedTotalBytes:
7,对于数据任务:
调用:URLSession:dataTask:didReceiveResponse:completionHandler:
数据任务转下载任务:URLSession:dataTask:didBecomeDownloadTask:
8,对于上传任务uploadTaskWithStreamedRequest:
调用:URLSession:task:needNewBodyStream
9,初始化上传body内容时:
调用URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:记录进度
10,下载进度:
数据:URLSession:dataTask:didReceiveData:
文件:URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:
中断文件下载:cancelByProducingResumeData:
断点续传:downloadTaskWithResumeData:或downloadTaskWithResumeData:completionHandler:
11,缓存策略:
URLSession:dataTask:willCacheResponse:completionHandler:
如果不实现此方法则使用默认缓存策略。
12,下载任务完成:
session调用:URLSession:downloadTask:didFinishDwonloadingToURL:
在此调用return前需要把文件移到应用程序沙盒程序的目录。
13,任何任务完成都调用以下:
URLSession:task:didCompleteWithError:
任务失败处理:
如果数据任务失败,不要理解重试,检查服务器可达性,直到可达再重新请求。
如果下载任务可以恢复,NSError对象的userInfo包含NSURLSessionDownloadTaskResumeDatakey,传递值来调用downloadTaskWithResumeData或downloadTaskWithResumeData:completionHandler:
如果下载任务不可恢复,需要重新创建下载任务然后重开事务。
总之,下载失败,验证不是服务器原因,都要创建任务并启动任务。
14,如果返回为多部件编码。。。
15,Session关闭:
invalidateAndCancel
finishTasksAndInvalidate
关闭后调用URLSession:didBecomeInvalidWithError。
(三)Session 在后台与Delgate的交互,Session中的Tasks在后台全部完成:
1,当Session中的Tasks全部完成后,调用Application Delegate中的application:handleEventsForBackgroundURLSession:completionHandler:
2,之后对每一个Task,调用Session Delegate中的
URLSession:downloadTask:didFinishDownloadingToURL: (成功的话) 和
URLSession:task:didCompleteWithError:(成功失败都会调用)
3,再之后,调用Session Delegate中的
URLSessionDidFinishEventsForBackgroupdURLSession:
4,步骤3的最后,需要调用步骤1的completionHandler Block。