iOS之URLSession解析

272 阅读6分钟

一、URLSession解析

NSURLSessioniOS7中推出,NSURLSession的推出旨在替换之前的NSURLConnectionNSURLSession的使用相对于之前的NSURLConnection更简单,而且不用处理Runloop相关的东西。

2015年RFC 7540标准发布了http 2.0版本,http 2.0版本中包含很多新的特性,在传输速度上也有很明显的提升。NSURLSessioniOS9.0开始,对http 2.0提供了支持。

NSURLSession由三部分构成:

  • NSURLSession:请求会话对象,可以用系统提供的单例对象,也可以自己创建。
  • NSURLSessionConfiguration:对session会话进行配置,一般都采用default
  • NSURLSessionTask:负责执行具体请求的task,由session创建。

NSURLSession有三种方式创建:

  1. sharedSession:系统维护的一个单例对象,可以和其他使用这个sessiontask共享连接和请求信息。
  2. sessionWithConfiguration:在NSURLSession初始化时传入一个NSURLSessionConfiguration,这样可以自定义请求头、cookie等信息。
  3. sessionWithConfiguration:delegate:delegateQueue::如果想更好的控制请求过程以及回调线程,需要上面的方法进行初始化操作,并传入delegate来设置回调对象和回调的线程。

URLSessionConfiguration

URLSessionConfiguration的模式

  1. URLSessionConfiguration.default:默认模式,通常我们用这种模式就足够了,default模式下系统会创建一个持久化的缓存并在用户的钥匙串中存储证书。
  2. URLSessionConfiguration.ephemeral:系统没有任何持久性存储,所有内容的生命周期都与Session相同,当Session无效时,所有内容自动释放。
  3. URLSessionConfiguration.background:创建一个可以在后台甚至APP已经关闭的时候仍然在传输数据的会话

URLSessionConfiguration的属性

常规属性

  1. identifier:配置对象的后台会话标识符。
  2. httpAdditionalHeaders:与请求一起发送的附加头文件的字典。
  3. networkServiceType:网络服务的类型。
  4. allowsCellularAccess:一个布尔值,用于确定是否应该通过蜂窝网络进行连接。
  5. timeoutIntervalForRequest:等待其他数据时使用的超时时间隔。
  6. timeoutIntervalForResource:资源请求应该允许的最大时间量。
  7. sharedContainerIdentifier:应该下载后台URL会话中的文件的共享容器的标识符。
  8. waitsForConnectivity:一个布尔值,指示会话是否应等待连接变为可用或者立即失败。

设置Cookie政策

  1. httpCookieAcceptPolicy:决定何时应该接受Cookie的策略常量。
  2. httpShouldSetCookies:一个布尔值,用于确定请求是否应包含来自Cookie存储的Cookie。
  3. httpCookieStorage:管理Cookie存储的单一对象(共享实例)。
  4. httpCokie:表示httpCookie的对象。它是一个不可变的对象,从包含Cookie属性的字典中初始化

设置安全策略

  1. tlsMaximumSupportedProtocol:在此会话中进行连接时客户端应请求的最大TLS协议版本。
  2. tlsMinimumSupportedProtocol:协议协商期间应该接受的最小TLS协议版本。
  3. urlCredentialStorage:提供身份验证凭据的凭证存储。

设置缓存策略

  1. urlCache:用于向会话中的请求提供缓存响应的URL缓存。
  2. requestCachePolicy:一个预定义常量,用于确定何时从缓存中返回响应。

支持后台转移

  1. sessionSendsLaunchEvents:一个布尔值,指示在传输完成时是否应该在后台继续活启动应用程序。
  2. isDiscretionary:一个布尔值,用于确定是否可以根据系统的判断来调度后台任务以获得最佳性能。

支持自定义协议

  1. protocolClasses:在会话中处理请求的额外协议子类的数组。
  2. URLProtocol:一个NSURLProtocol对象处理加载协议特定的UPL数据。NSURLProtocol类本身是一个抽象类,可以为与特定URL方案的URL处理基础设施。您可以为您的应用支持的任何自定义协议或URL方案创建子类

支持多路径TCP

  1. multipathServiceType:指定用于通过WIFI和蜂窝接口传输数据的多路径TCP连接策略的服务类型。
  2. URLSessionConfiguration.MultipathServiceType:指定多路径TCP使用的服务类型的常量。

设置HTTP策略和代理属性

  1. httpMaximumConnectionsPerHost:同时连接到给定主机的最大数量。
  2. httpShouldUsePipelining:一个布尔值,用于确定会话是否应该使用HTTP流水线。
  3. connectionProxyDictionary:包含有关在此会话中使用的代理信息的字典。

支持连续变化

  1. waitsForConnectivity:一个布尔值,指定会话是否应等待连接变为可用或者立即失败。

URLSessionTask

URLSessionDataTask

  1. URLSessionUploadTask: 上传硬盘中的文件到服务,一般是HTTP POST或PUT方式
  2. 处理从HTTP get请求中从服务器获取数据到内存中

URLSessionDownloadTask

  1. 从远程服务器下载文件到临时文件位置

URLSessionStreamTask

  1. 通过流文件传输

URLSessionDelegate

URLSessionTaskDelegate:

  1. URLSessionDataDelegate
  2. URLSessionDownloadDelegate
  3. URLSessionStreamDelegate

NSURLRequestCachePolicy

  1. NSURLRequestUseProtocolCachePolicy = 0,默认缓存策略:如果一个NSCachedURLResponse的请求并不存在,数据将会从源端获取。如果请求拥有一个缓存的响应,那么URL加载系统会检查这个响应来决定,如果它指定内容必须重新生效的话。假如内容必须重新生效,将建立一个连向源端的连接来查看内容是否发生变化。假如内容没有变化,那么响应就从本地缓存返回数据。如果内容变化了,那么数据将从源端获取。
  2. NSURLRequestReloadIgnoringLocalCacheData = 1,URL应该加载源端数据,不使用本地缓存数据
  3. NSURLRequestReturnCacheDataElseLoad = 2,指定已存的缓存数据应该用来响应请求,不管它的生命时长和过期时间。如果在缓存中没有已存数据来响应请求的话,数据从源端加载
  4. NSURLRequestReturnCacheDataDontLoad = 3,指定已存的缓存数据用来满足请求,不管生命时长和过期时间。如果在缓存中没有已存数据来响应URL加载请求的话,不去尝试从源端加载数据,此时认为加载请求失败。这个常量指定了一个类似于离线模式的行为
  5. NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4,本地缓存数据、代理和其他中介都要忽视他们的缓存,直接加载源数据
  6. NSURLRequestReloadRevalidatingCacheData = 5,指定如果已存的缓存数据被提供它的源端确认为有效,则允许使用缓存数据响应请求,否则从源端加载数据
  7. NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData

总结

  1. 创建NSURLSessionConfiguration对象
  2. 用创建的NSURLSessionConfiguration对象创建配置NSURLSession对象
  3. NSURLSession对象创建对应的task对象,并用resume方法执行
  4. 用delegate方法或completion block响应网络事件及数据