关于URL加载系统 <- URL会话编程指南

本指南描述了Foundation框架的一些类,它们可用于与URL交互,也可以与使用标准网络协议的服务器进行通信。这些类被统称为URL加载系统。

URL加载系统是一系列类和协议,它们允许app访问URL指向的内容。这个技术的核心就是NSURL类,它让app可以操作URL和它所指向的资源。

为了支持该类,Foundation框架提供了丰富的类,让你可以加载URL的内容、上传数据到服务器、管理cookie存储、控制响应缓存、处理证书存储并以特定方式验证、以及编写自定义的协议扩展。

URL加载系统提供对使用以下协议访问资源的支持:

  • File Transfer Protocol (ftp://)
  • Hypertext Transfer Protocol (http://)
  • Hypertext Transfer Protocol with encryption (https://)
  • Local file URLs (file:///)
  • Data URLs (data://)

当然它还使用用户系统首选项来支持代理服务器和SOCKS网关。

重要:在Apple平台,有一个被称为ATS(App Transport Security,应用传输安全)的网络安全功能,它可以用于应用和应用扩展,默认情况下它是开启的。它通过确保app的网络连接仅使用工业标准的协议,以及使用无已知弱点的密码,来提高隐私和数据完整性。更多信息,参见NSAppTransportSecurity。

注意:除了URL加载系统之外,OS X和iOS提供了在其他应用程序(例如Safari)中打开URL的API。这些API不在本文档中描述。
更多关于在OS X中启动服务器的信息,请阅读Launch Services Programming Guide。
更多关于OS X中NSWorkSpace类的openURL:方法的信息,请阅读NSWorkspace Class Reference。
更多关于iOS中UIApplication类的openURL:方法的信息,请阅读UIApplication Class Reference。

概览

URL加载系统包括很多类,这些类使用很多重要的辅助类来加载URL,而这些辅助类与那些URL加载类一起来使用可以改变它们的行为。主要的辅助类分为五大类:协议支持、验证和证书、cookie保存、配置管理、以及缓存管理。

The URL loading system class hierarchy
URL加载

在URL加载系统中最常用的是允许app从源中检索URL的内容。你可以使用NSURLSession来检索内容。你采用的具体方法很大程度上取决于你想把数据提取到内存还是下载到磁盘。

提取内容到内存

在高层级,提取URL数据有两种基本方法:

  • 对于简单的请求,使用NSURLSession API直接从NSURL对象中检索内容,结果可以是NSData对象,也可以是磁盘上的文件。
  • 对于更加复杂的请求,例如上传数据的请求,要给NSURLSession提供一个NSURLRequest对象(或者它的可变子类,NSMutableURLRequest)。

无论你选择哪种方法,你的app都可以以两种方式来获取响应数据:

  • 提供完成处理程序代码块。当URL加载类从服务器接收数据完成之后,它调用这个代码块。
  • 提供自定义委托。当URL加载类从服务器接收到数据的时候调用自定义的委托方法。如有必要,你的app负责累积这些数据。

除了这些数据本身之外,URL加载类还把封装的与请求相关的元数据(例如MIME类型以及内容长度),提供给委托以及完成处理程序代码块。

相关章节:Using NSURLSession。

把内容下载为文件

在高级别上,有两个基本的方法来把URL的内容下载到文件:

  • 对于简单的请求,使用NSURLSession API直接从NSURL对象中检索内容,结果可以是NSData对象,也可以是磁盘上的文件。
  • 对于更加复杂的请求,例如上传数据的请求,要给NSURLSession提供一个NSURLRequest对象(或者它的可变子类,NSMutableURLRequest)。

注意:通过NSURLSession实例启动的下载不能缓存。如果你需要缓存结果,app必须在使用NSURLSession的同时,自己将数据写入磁盘。

相关章节:Using NSURLSession

辅助类

URL加载类使用两个辅助类来提供额外的元数据——一个是针对请求本身(NSURLRequest)、一个是针对服务器的响应(NSURLResponse)。

URL请求

NSURLRequest对象会在一个独立的协议管理器中封装URL以及任何特定协议属性。

注意:当客户端app使用NSMutableURLRequest实例来启动连接或下载时,会产生一个请求的深拷贝。在下载开始之后,改变初始请求对下载不会产生影响。

一些协议支持特定的协议属性。例如,HTTP协议添加一些方法到NSURLRequest,返回HTTP请求体、头部、以及传输方法。它还添加了方法到NSMutableURLRequest,以便设置这些值。

响应元数据

服务器对于请求的响应可以通过两种方式查看:元数据描述了内容以及数据本身的内容。大多数协议通常的元数据通过NSURLResponse类被封装,它由MIME类型、预期的内容长度、文本编码(如果适用)、以及提供响应的URL组成。NSURLResponse的协议特定子类,可以提供额外的元数据。例如,NSHTTPURLResponse web服务器返回的头部和状态吗。

重要:只有响应的元数据是存储在NSURLResponse对象的。各种URL加载类提供给app的响应数据,是通过完成处理程序代码块或者该对象的委托进行的。
NSCachedURLResponse实例封装NSURLResponse对象、URL内容数据、以及任何由app提供的额外数据。详情参见 Cache Management。

本文档介绍了使用URL响应对象的详细情况。

重定向和其他请求改变

一些协议,例如HTTP,为服务器提供一种方式来告诉app,内容已被移动到另一个URL上。当内容移动发生时,这个URL加载类可以通知他们的委托。如果app提供了合适的委托方法,app就可以决定是否遵循重定向、从重定向处返回响应体、或者返回一个错误。

相关章节:Handling Redirects and Other Request Changes

验证和证书

一些服务器对特定内容限制访问,要求用户通过提供某种证书(客户端证书,用户名和密码等等)来进行验证,以此来获取权限。在web服务器,限制内容被分组为要求单独证书系列的区域,证书还经常被用于确定重定向服务器是否可信。

URL加载系统提供制作证书模型以及提供安全的证书持久化保护区域的类。你的app可以说明这些证书存储于单一请求、app启动期间、或者永久的在用户的钥匙串中。

注意:永久存储的证书保存在用户的钥匙串中,并在所有应用中共享。

NSURLCredential类封装一个包含验证信息(例如,用户名和密码)和持久化行为组成的证书。NSURLProtectionSpace类表示需要特定证书的区域。一个受保护空间可以限于一个URL、可以包含在web服务器的区域、或者指向到一个代理。

NSURLCredentialStorage对象管理会话的证书存储,并提供NSURLCredential对象到对其提供身份验证的相关的 NSURLProtectionSpace对象的映射。只有在验证成功,证书才会被保存。

NSURLAuthenticationChallenge类封装NSURLProtocol实现请求所需的信息来验证请求:建议的证书、涉及的保护空间、用于决定验证要求的协议的错误或响应、以及进行验证的尝试次数。NSURLAuthenticationChallenge实例还指定初始化验证的对象。被称为发送方的初始化对象,必须符合NSURLAuthenticationChallengeSender协议。

NSURLAuthenticationChallenge实例通过NSURLProtocol子类被用于通知需要验证的URL加载系统。它们还提供NSURLSession的委托方法,便于自定义认证处理。

相关章节:Authentication Challenges and TLS Chain Validation

缓存管理

URL加载系统提供一个磁盘和内存复合的缓存,它减少了app对于网络连接的依赖,并且提供了更快的缓存响应的周转时间。缓存按每个app存储。缓存依据缓存策略通过NSURLSession查询,缓存策略是在初始化NSURLRequest 和 NSURLSessionConfiguration对象的时候被指定的。

NSURLCache类提供配置缓存尺寸以及在磁盘上的位置的方法。它还提供方法来管理NSCachedURLResponse对象的集合,该对象包含了缓存响应。

NSCachedURLResponse对象封装了NSURLResponse对象和URL内容数据。NSCachedURLResponse还提供用户信息字典,app可以使用该字典来缓存任何自定义数据。

不是所有的协议都支持响应缓存。现在只有http 和 https请求可以被缓存。

NSURLSession对象通过URLSession:dataTask:willCacheResponse:completionHandler:委托方法来控制是否缓存响应,以及是否仅将响应缓存在内存中。

相关章节:Understanding Cache Access

Cookie存储

由于HTTP协议的无状态,客户端经常使用cookie来提供跨URL请求数据的持久化存储。URL加载系统提供创建管理cookie的接口,可以把cookies作为HTTP请求的一部分进行发送,而在解析web服务器响应的时候接收cookie。

OS X和iOS提供NSHTTPCookieStorage类,它还提供管理NSHTTPCookie对象集合的接口。在OS X中,cookie 被所有app共享;在iOS中,cookie属于每个应用自己的。

相关章节:Cookie Storage。

协议支持

URL加载系统原生支持http, https, file, ftp, 和 data协议。尽管如此,URL加载系统还允许app注册自己的类来支持额外的应用层网络协议。你还可以想URL请求和URL响应对象添加特定的协议属性。

相关章节:Cookies and Custom Protocols。

如何使用本文档

通过阅读Using NSURLSession这篇URL加载系统的概述开始。然后阅读Life Cycle of a URL Session来了解如何使用NSURLSession及其委托的详情。关于URL加载系统的其他部分的跟进一步信息,会在下面的几章中提供:

  • Encoding URL Data解释了如何对任意字符串进行编码,以便在URL中安全的使用它们。
  • Handling Redirects and Other Request Changes描述了在响应URL请求发生改变时你所拥有的选项。
  • Authentication Challenges and TLS Chain Validation描述了与安全服务器连接的验证过程。
  • Understanding Cache Access描述了在请求期间连接如何使用缓存。
  • Cookies and Custom Protocols解释了可用于管理cookie存储、以及支持自定义应用层协议的类。

推荐阅读更多精彩内容