URL Loading System 是一系列用来访问经过 URL 来定位的资源的类和协议。这项技术的核心在于基于 NSURL
这个类来访问资源,除了加载 URL 的类 NSURLSession
以外,咱们把其余相关辅助类分为 5 类(如图所示):html
值得一提的是,iOS 7 之前的 Legacy URL Loading System 是一套基于
NSURLConnection
的体系。ios
URL Loading System 最经常使用的类就是根据 URL 请求数据的类 NSURLSession
。git
NSURLSession
的 API 支持三种类型的 session:github
基于 NSURLSession
,咱们能够建立 3 种类型的 URL 加载任务:web
NSData
形式的数据。Data tasks 主要用来发送短暂的、有交互性的请求。Data tasks 能够分次返回数据,也能够一次性返回全部的数据。1.URL 请求编程
URL Loading System 中的 NSURLRequest
将 URL 和请求协议相关的属性封装了起来。api
支持 HTTP 协议的 NSURLRequest
/NSMutableURLRequest
类的就包括读取/设置请求方式、请求体、请求头等属性的方法。缓存
2.响应安全
服务器返回的数据通常包括两部分:服务器
URL Loading System 中 NSURLResponse
的做用就是将元数据和内容数据自己封装起来。
有些协议,好比 HTTP,提供了一种重定向机制:当你发起一个请求时,而你请求的资源的 URL 已经发生改变了,服务器就会告诉客户端你请求的资源已经被转移到了新的 URL。
咱们能够经过实现相关的代理方法 URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler:
,来拦截重定向事件,并决定是否须要重定向到新的地址。
有些服务器会对某些特定的内容限制访问权限,只对提供了信任证书经过认证的用户提供访问资格。对于 web 服务器来讲,受保护的内容被汇集到一个须要凭证才能访问的区域。在客户端上,有时也须要根据凭证来肯定是否信任要访问的服务器。
URL Loading System 提供了封装凭证(credentials)、封装保护区域(protected areas)和保存安全凭证(secure credential)的类:
NSURLCredential
:封装一个含有认证信息(好比用户名和密码等)和持久化存储行为的凭证(credential)。NSURLProtectionSpace
:服务器上某个须要凭证才能访问的区域。NSURLCredentialStorage
:管理凭证的存储以及 NSURLCredential
和相应的 NSURLProtectionSpace
之间的映射关系。NSURLAuthenticationChallenge
:在客户端向有限制访问权限的服务器发起请求时,服务器会询问凭证信息,包括凭证、保护空间、认证错误信息、认证响应等。这个类会将这些信息封装起来。NSURLAuthenticationChallenge
实例一般被 NSURLProtocol
子类用来通知 URL Loading System 须要认证,以及在 NSURLSession
的代理方法中用来处理认证。URL Loading System 提供了 app 级别的 HTTP 响应缓存,在使用 NSURLSession
发起请求时,咱们能够经过设置 NSURLRequest
和 NSURLSessionConfiguration
的缓存策略(cache policy)来决定是否缓存以及如何处理缓存。同时,咱们还能够经过实现 URLSession:dataTask:willCacheResponse:completionHandler:
方法来针对特定的 URL 设置缓存策略。
实际上,不是全部请求的响应都能被缓存起来,URL Loading System 目前只支持对 http 和 https 请求的响应进行缓存。
URL Loading System 中提供的管理缓存的类有如下两个:
NSURLCache
:经过这个类能够设置缓存大小和位置,以及读取和存储各个请求的 NSCachedURLResponse
。NSCachedURLResponse
:封装了请求元数据(一个 NSURLResponse
对象)和实际响应内容(一个 NSData
对象)。NSURLRequest
默认的 cache policy 是 NSURLRequestUseProtocolCachePolicy
,下图就是一个采用了 NSURLRequestUseProtocolCachePolicy
的 HTTP 请求的缓存机制流程图(来源):
URL Loading System 提供了 app 级别的 cookie 存储机制。URL Loading System 中涉及到 cookie 操做的两个类分别是:
NSHTTPCookieStorage
:这个类提供了管理 cookie 存储的功能。NSHTTPCookie
:用来封装 cookie 数据和属性的类。NSURLRequest
提供了 HTTPShouldHandleCookies
属性来设置请求发起时,是否须要 cookie manager 自动处理 cookie。在 UIWebView
中,系统会经过 cookie manager 自动将 cookie 缓存起来。
URL Loading System 自己只支持 http、https、file、ftp 和 data 协议。NSURLProtocol
是一个抽象类,提供了处理 URL 加载的基础设施。经过实现自定义的 NSURLProtocol
子类,可让咱们的 app 支持自定义的数据传输协议。
另外,对于 NSURLProtocol
核心功能,官方文档中并无着重提到,可是倒是最重要的一点:借助它,你没必要改动应用在网络调用上的其余部分,就能够改变 URL 加载行为的所有细节。运用这一点,咱们能够自由发挥,作不少想作的事情,好比:
URL Loading System 涵盖了 iOS 网络编程的方方面面,经过以上的梳理,相信咱们已经对 iOS 网络编程有了一个总体的了解。