URL Loading System 概览

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

  • 协议支持(protocol support)
  • 认证和证书(authentication and credentials)
  • cookie 存储(cookie storage)
  • 请求配置(configuration management)
  • 缓存管理(cache management)
nsobject_hierarchy_2x.png

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

一、URL 加载

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

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

  • Default sessions:其行为跟 Foundation 中提供的其他 URL 加载方式类似,支持磁盘缓存,并且会把凭证(credentials)保存到 keychain 中。
  • Ephemeral sessions:不会存储任何数据到磁盘上,所有的缓存、凭证都只会随着 session 保存在内存中,而且一旦这个 session 被清除了,这些缓存同时也会被清除。
  • Background sessions:跟 default sessions 的行为基本类似,但是还支持后台驻留进程的数据传输,也就是说,当 app 被挂起时,还可以在后台继续传输数据。

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

  • Data tasks:发送和接收 NSData 形式的数据。Data tasks 主要用来发送短暂的、有交互性的请求。Data tasks 可以分次返回数据,也可以一次性返回所有的数据。
  • Download tasks:获取文件形式的数据,下载文件到本地,支持后台下载。
  • Upload tasks:以文件的形式发送数据给服务器,也支持后台下载。

二、辅助类

1.URL 请求

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

支持 HTTP 协议的 NSURLRequest/NSMutableURLRequest 类的就包括读取/设置请求方式、请求体、请求头等属性的方法。

2.响应

服务器返回的数据一般包括两部分:

  • 描述内容数据的元数据:描述内容数据的元数据往往是请求协议定义的,大部分协议的元数据包括 MIME type、 expected content length、text encoding (where applicable)以及这个响应对应的 URL。
  • 内容数据本身:也就是要请求的数据

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 发起请求时,我们可以通过设置 NSURLRequestNSURLSessionConfiguration 的缓存策略(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 请求的缓存机制流程图(来源):

http_caching_policy_decisions_tree.png

六、cookie 存储

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 网络编程有了一个整体的了解。

参考:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容