网络

URL Loading System 概览

2018-01-25  本文已影响155人  ShannonChenCHN

URL Loading System 是一系列用来访问通过 URL 来定位的资源的类和协议。这项技术的核心在于基于 NSURL 这个类来访问资源,除了加载 URL 的类 NSURLSession 之外,我们把其他相关辅助类分为 5 类(如图所示):

nsobject_hierarchy_2x.png

值得一提的是,iOS 7 以前的 Legacy URL Loading System
是一套基于 NSURLConnection 的体系。

一、URL 加载

URL Loading System 最常用的类就是根据 URL 请求数据的类 NSURLSession

NSURLSession 的 API 支持三种类型的 session:

基于 NSURLSession,我们可以创建 3 种类型的 URL 加载任务:

二、辅助类

1.URL 请求

URL Loading System 中的 NSURLRequest 将 URL 和请求协议相关的属性封装了起来。

支持 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)的类:

五、缓存管理

URL Loading System 提供了 app 级别的 HTTP 响应缓存,在使用 NSURLSession 发起请求时,我们可以通过设置 NSURLRequestNSURLSessionConfiguration 的缓存策略(cache policy)来决定是否缓存以及如何处理缓存。同时,我们还可以通过实现 URLSession:dataTask:willCacheResponse:completionHandler: 方法来针对特定的 URL 设置缓存策略。

实际上,不是所有请求的响应都能被缓存起来,URL Loading System 目前只支持对 http 和 https 请求的响应进行缓存。

URL Loading System 中提供的管理缓存的类有以下两个:

NSURLRequest 默认的 cache policy 是 NSURLRequestUseProtocolCachePolicy,下图就是一个采用了 NSURLRequestUseProtocolCachePolicy 的 HTTP 请求的缓存机制流程图(来源):

http_caching_policy_decisions_tree.png

六、cookie 存储

URL Loading System 提供了 app 级别的 cookie 存储机制。URL Loading System 中涉及到 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 网络编程有了一个整体的了解。

参考:


如果你也喜欢交流技术、喜欢阅读、积极践行,欢迎关注我的公众号:祥龙Shannon写字的地方,一起成长。

qrcode_for_gh_cc686217be41_344.jpg
上一篇 下一篇

猜你喜欢

热点阅读