一、URLSession解析
NSURLSession
在iOS7
中推出,NSURLSession
的推出旨在替换之前的NSURLConnection
,NSURLSession
的使用相对于之前的NSURLConnection
更简单,而且不用处理Runloop
相关的东西。
2015年RFC 7540
标准发布了http 2.0
版本,http 2.0
版本中包含很多新的特性,在传输速度上也有很明显的提升。NSURLSession
从iOS9.0
开始,对http 2.0
提供了支持。
NSURLSession
由三部分构成:
- NSURLSession:请求会话对象,可以用系统提供的单例对象,也可以自己创建。
- NSURLSessionConfiguration:对
session
会话进行配置,一般都采用default
。 - NSURLSessionTask:负责执行具体请求的
task
,由session
创建。
NSURLSession
有三种方式创建:
sharedSession
:系统维护的一个单例对象,可以和其他使用这个session
的task
共享连接和请求信息。sessionWithConfiguration
:在NSURLSession初始化时传入一个NSURLSessionConfiguration,这样可以自定义请求头、cookie等信息。sessionWithConfiguration:delegate:delegateQueue:
:如果想更好的控制请求过程以及回调线程,需要上面的方法进行初始化操作,并传入delegate
来设置回调对象和回调的线程。
URLSessionConfiguration
URLSessionConfiguration的模式:
URLSessionConfiguration.default
:默认模式,通常我们用这种模式就足够了,default模式下系统会创建一个持久化的缓存并在用户的钥匙串中存储证书。URLSessionConfiguration.ephemeral
:系统没有任何持久性存储,所有内容的生命周期都与Session相同,当Session无效时,所有内容自动释放。URLSessionConfiguration.background
:创建一个可以在后台甚至APP已经关闭的时候仍然在传输数据的会话
URLSessionConfiguration的属性:
常规属性:
identifier
:配置对象的后台会话标识符。httpAdditionalHeaders
:与请求一起发送的附加头文件的字典。networkServiceType
:网络服务的类型。allowsCellularAccess
:一个布尔值,用于确定是否应该通过蜂窝网络进行连接。timeoutIntervalForRequest
:等待其他数据时使用的超时时间隔。timeoutIntervalForResource
:资源请求应该允许的最大时间量。sharedContainerIdentifier
:应该下载后台URL会话中的文件的共享容器的标识符。waitsForConnectivity
:一个布尔值,指示会话是否应等待连接变为可用或者立即失败。
设置Cookie政策:
httpCookieAcceptPolicy
:决定何时应该接受Cookie的策略常量。httpShouldSetCookies
:一个布尔值,用于确定请求是否应包含来自Cookie存储的Cookie。httpCookieStorage
:管理Cookie存储的单一对象(共享实例)。httpCokie
:表示httpCookie的对象。它是一个不可变的对象,从包含Cookie属性的字典中初始化
设置安全策略:
tlsMaximumSupportedProtocol
:在此会话中进行连接时客户端应请求的最大TLS协议版本。tlsMinimumSupportedProtocol
:协议协商期间应该接受的最小TLS协议版本。urlCredentialStorage
:提供身份验证凭据的凭证存储。
设置缓存策略:
urlCache
:用于向会话中的请求提供缓存响应的URL缓存。requestCachePolicy
:一个预定义常量,用于确定何时从缓存中返回响应。
支持后台转移:
sessionSendsLaunchEvents
:一个布尔值,指示在传输完成时是否应该在后台继续活启动应用程序。isDiscretionary
:一个布尔值,用于确定是否可以根据系统的判断来调度后台任务以获得最佳性能。
支持自定义协议:
protocolClasses
:在会话中处理请求的额外协议子类的数组。URLProtocol
:一个NSURLProtocol对象处理加载协议特定的UPL数据。NSURLProtocol类本身是一个抽象类,可以为与特定URL方案的URL处理基础设施。您可以为您的应用支持的任何自定义协议或URL方案创建子类
支持多路径TCP:
multipathServiceType
:指定用于通过WIFI和蜂窝接口传输数据的多路径TCP连接策略的服务类型。URLSessionConfiguration.MultipathServiceType
:指定多路径TCP使用的服务类型的常量。
设置HTTP策略和代理属性:
httpMaximumConnectionsPerHost
:同时连接到给定主机的最大数量。httpShouldUsePipelining
:一个布尔值,用于确定会话是否应该使用HTTP流水线。connectionProxyDictionary
:包含有关在此会话中使用的代理信息的字典。
支持连续变化:
waitsForConnectivity
:一个布尔值,指定会话是否应等待连接变为可用或者立即失败。
URLSessionTask
URLSessionDataTask:
URLSessionUploadTask
: 上传硬盘中的文件到服务,一般是HTTP POST或PUT方式- 处理从HTTP get请求中从服务器获取数据到内存中
URLSessionDownloadTask:
- 从远程服务器下载文件到临时文件位置
URLSessionStreamTask:
- 通过流文件传输
URLSessionDelegate
URLSessionTaskDelegate
:
- URLSessionDataDelegate
- URLSessionDownloadDelegate
- URLSessionStreamDelegate
NSURLRequestCachePolicy
- NSURLRequestUseProtocolCachePolicy = 0,默认缓存策略:如果一个
NSCachedURLResponse
的请求并不存在,数据将会从源端获取。如果请求拥有一个缓存的响应,那么URL加载系统会检查这个响应来决定,如果它指定内容必须重新生效的话。假如内容必须重新生效,将建立一个连向源端的连接来查看内容是否发生变化。假如内容没有变化,那么响应就从本地缓存返回数据。如果内容变化了,那么数据将从源端获取。 - NSURLRequestReloadIgnoringLocalCacheData = 1,URL应该加载源端数据,不使用本地缓存数据
- NSURLRequestReturnCacheDataElseLoad = 2,指定已存的缓存数据应该用来响应请求,不管它的生命时长和过期时间。如果在缓存中没有已存数据来响应请求的话,数据从源端加载
- NSURLRequestReturnCacheDataDontLoad = 3,指定已存的缓存数据用来满足请求,不管生命时长和过期时间。如果在缓存中没有已存数据来响应URL加载请求的话,不去尝试从源端加载数据,此时认为加载请求失败。这个常量指定了一个类似于离线模式的行为
- NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4,本地缓存数据、代理和其他中介都要忽视他们的缓存,直接加载源数据
- NSURLRequestReloadRevalidatingCacheData = 5,指定如果已存的缓存数据被提供它的源端确认为有效,则允许使用缓存数据响应请求,否则从源端加载数据
- NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData
总结
- 创建
NSURLSessionConfiguratio
n对象 - 用创建的
NSURLSessionConfiguration
对象创建配置NSURLSession对象 - 用
NSURLSession
对象创建对应的task对象,并用resume方法执行 - 用delegate方法或completion block响应网络事件及数据