NSURLSession工作流程
NSURLSessionDataTask 发起一个POST HTTP请求
- 创建一个NSSessionConfiguration
- 用Configuration创建一个NSURLSession,设置缓存策略,delegate,Task所在线程
- 创建一个NSURLRequest,设置请求类型为POST,构造HTTP Header,将参数放入HTTPBody
- 用NSURLSession创建一个NSURLSessionDataTask,传入Request
- 调用 Task Resume方法,唤醒Task
- 在身份验证回调中处理证书信任问题
- 在接收到响应回调中处理是否继续接受数据
- 在数据接收回调中处理数据,更新进度
- 最后关闭任务或者关闭Session
NSURLSessionStreamTask工作流程
发起一个请求,以流读写的方式传递数据,异步读写,双向通信的TCP连接
在回调中处理数据
NSURLSessionDownloadTask断点续传过程
- 当任务发生错误中断的时候,Task会包含出错的Error信息,Error的Userinfo中有一个字段NSURLSessionDownloadTaskResumeData,其中就包含了ResumeData。
- 手动调用cancelByProducingResumeData,中断DownloadTask,并获得ResumeData。
- 在恢复下载是,使用ResumeData创建DownloadTask即可。
后台下载功能
- 配置系统权限Newsstand downloads
- 创建一个SessionConfiguration,初始化的时候用backgroundSessionConfigurationWithIdentifier:方法,并且指定任务唯一标识
- 设置Configuration的sessionSendsLaunchEvents为YES,使任务在完成的时候会唤起App
- 启动任务
- 当任务完成后,系统会唤起App,并会调用application:handleEventsForBackgroundURLSession:completionHandler:方法
- 如果期间APP发生手动退出或者闪退,重新启动后可以再次获取到相同唯一标示的任务。
NSURLCache运作
- 指定缓存内存容量大小、缓存硬盘容量大小来创建一个NSURLCache
- 将指定的NSURLRequest和相关联的NSURLCachedResponse存储Cache,下次根据NSURLRequest来获取对应的NSURLCachedResponse。
- NSURLCachedResponse对应的缓存策略
- 不限制缓存
- 只允许内存缓存
- 不允许缓存
- 通过Category扩展,NSURLCache可以通过NSURLSessionDataTask来关联NSURLCachedResponse。
NSURLProtocol
- 在系统中注册NSURLProtocol
- 在NSURLSessionDataTask中设置调用NSURLProtocolClient协议实现后的方法
- 当发起URL加载的时候,系统会在已经注册过的NSURLProtocol中寻找对应可以处理NSURLRequest的Class来处理。
- NSURLProtocol开始处理NSURLRequest,重新构造NSURLRequest。
- 在加载开始后,将NSURLRequest标记为已经执行,防止重复执行陷入循环。
- NSURLProtocol只能拦截NSURLSession和UIView中的URL加载,他们在加载时都用的底层Socket连接,WKWebView属于WebKit,不走Socket,所以无法拦截。
AFNetworking工作流程
发起一个POST HTTPS请求
- 生成一个AFHTTPSessionManager,设置BaseURL
- 配置RequestSerialization和ResponseSerialization。
- RequestSerialization将生成Requst的Header(Content-Type,User-Agent,Accept-Language,)、HTTPBody,如是POST请求方式,将参数以NSData的形式放入HTTPBody中,如是GET请求,则将参数拼在URL上。
- 根据Request来创建一个NSURLSessionDataTask,将Task放入一个并发数为1的线程队列中,同时创建一个独立的delegate放入Map中。
- 当Task开始运行,发起HTTPS请求,每次收到数据都会用NSProgress来统计进度
- 发生身份验证
- 验证类型为公钥验证,提取服务端trust中的公钥,比对本地公钥,然后将结果传回服务端
- 验证类型为证书验证,服务器trust与证书域名做匹配,如果设置了本地证书,则将证书加入到服务器trust中,然后将结果传回服务端。
- 也可以拒绝响应或取消验证。
- 当得到Response的时候,ResponseSerialization会进行域名和状态码验证,验证失败会抛出Error
- 验证成功后,ResponseSerialization进行responseObject的创建,期间的处理有转义成JSON,XML,PropertyList,解压PNG或JPG等。
SDWebImageManager 获取图片
- 先检测当前请求的URL是否已经失败过,如果没有设置失败尝试,则流程结束
- 先检测内存缓存是否有对应的URL缓存,再磁盘缓存中是否存在,如果有则调用完成回调,流程结束
- 如果缓存不存在,则会创建图片下载进程。
- 下载线程将接收到的图片数据拼接在一起,如果采用了渐进式的显示模式,则会每收到一次都拼接一次,并执行完成回调
- 如果出现超时、无法连接等网络错误,则会将URL放入失败过的URL Map中,防止下次重复执行。
- 下载成功后,将图片解压,将data数据分别存入内存缓存和磁盘缓存。
- 执行完成回调,取得图片
HTTPS证书中都包含哪些内容
- 所有者的公用密钥
- 所有者的专有名称
- 颁发证书的 CA 的专有名称
- 证书生效的起始日期
- 证书的到期日期
- X.509 中定义的证书数据格式的版本号。X.509 标准的最新版本为 V3,大多数证书都遵循此版本。
- 序列号。这是颁发证书的 CA 所分配的唯一标识。序列号在颁发证书的 CA 中是唯一的:同一 CA 证书签署的两个证书不会具有相同的序列号。