详细解析几个和网络请求有关的类(五) —— 关于NSURL加载系
版本记录
版本号 | 时间 |
---|---|
V1.0 | 2018.03.10 |
前言
我们做APP发起网络请求,一般都是使用框架,这些框架的底层也都是苹果的API,接下来几篇就一起来看一下和网络有关的几个类。感兴趣的可以看上面几篇文章。
1. 详细解析几个和网络请求有关的类 (一) —— NSURLSession
2. 详细解析几个和网络请求有关的类(二) —— NSURLRequest和NSMutableURLRequest
3. 详细解析几个和网络请求有关的类(三) —— NSURLConnection
4. 详细解析几个和网络请求有关的类(四) —— NSURLSession和NSURLConnection的区别
关于URL加载系统
本指南介绍了可用于与URL进行交互以及使用标准Internet协议与服务器进行通信的Foundation框架类。这些类一起被称为URL加载系统。
URL加载系统是一组允许您的应用访问由URL引用的内容的类和协议。这项技术的核心是NSURL
类,它可以让你的应用程序操纵URL和它们引用的资源。
为了支持这个类,Foundation框架提供了丰富的类集合,让您可以加载URL的内容,上传数据到服务器,管理cookie存储,控制响应缓存,以APP指定的方式处理凭证存储和认证,并编写自定义协议扩展。
URL加载系统为使用以下协议访问资源提供支持:
- 文件传输协议
(ftp://)
- 超文本传输协议
(http://)
- 带加密的超文本传输协议
(https://)
- 本地文件网址
(file:///)
- 数据网址
(data://)
它还使用用户的系统偏好明显的支持代理服务器和SOCKS网关。
重要:在Apple平台上,名为
App Transport Security(ATS)
的网络安全功能可用于应用和应用扩展,并且默认情况下处于启用状态。 它通过确保您的应用程序的网络连接仅使用行业标准协议和没有已知弱点的密码来提高隐私和数据完整性。有关更多信息,请参阅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存储,配置管理和缓存管理protocol support, authentication and credentials, cookie storage, configuration management, cache management
。
1. URL Loading - URL 加载
URL加载系统中最常用的类允许您的应用从源中检索URL的内容。 您可以使用NSURLSession
检索该内容。 您使用的具体方法很大程度上取决于您是要将数据提取到内存还是将其下载到磁盘。
Fetching Content as Data (In Memory) - 获取内容作为数据(在内存中)
在较高层次上,有两种基本的方法来获取URL数据:
-
对于简单的请求,可以使用
NSURLSession
API直接从NSURL
对象中检索内容,既可以作为NSData对象,也可以作为磁盘上的文件。 -
对于更复杂的请求 - 例如上传数据的请求 - 向
NSURLSession
提供NSURLRequest
对象(或其可变子类,NSMutableURLRequest
)。
无论您选择哪种方式,您的应用程序都可以通过两种方式获取响应数据:
-
提供完成处理程序块。 URL加载类在完成从服务器接收数据时调用该块。
-
提供一个自定义代理。 URL加载类会在接收源数据时定期调用您的委托方法。 如果需要,您的应用程序负责积累该数据。
除了数据本身之外,URL加载类还为您的代理或完成处理程序块提供了封装与请求关联的元数据(例如MIME类型和内容长度)的响应对象。
相关章节:Using NSURLSession
Downloading Content as a File - 将内容作为文件下载
在较高层次上,有两种基本方法可将URL的内容下载到文件中:
-
对于简单的请求,可以使用
NSURLSession
API直接从NSURL
对象中检索内容,既可以作为NSData对象,也可以作为磁盘上的文件。 -
对于更复杂的请求 - 例如上传数据的请求 - 向
NSURLSession
提供NSURLRequest
对象(或其可变子类,NSMutableURLRequest
)。
注意:由
NSURLSession
实例启动的下载不会被缓存。 如果您需要缓存结果,您的应用程序必须使用NSURLSession并将数据写入磁盘本身。
相关章节:Using NSURLSession
2. Helper Classes - 辅助类
URL加载类使用两个辅助类,它们提供附加的元数据 - 一个用于请求本身(NSURLRequest
),另一个用于服务器的响应(NSURLResponse
)。
URL Requests - URL请求
NSURLRequest
对象以独立于协议的方式封装URL和任何协议特定的属性。
注意:当客户端应用程序使用NSMutableURLRequest
的实例启动连接或下载时,会对请求进行深层复制。 初始化下载后,对启动请求所做的更改不起作用。
一些协议支持协议指定的属性。 例如,HTTP协议将方法添加到NSURLRequest
中,以返回HTTP请求正文,头和请求方法。 它还向NSMutableURLRequest
添加方法来设置这些值。
本书通篇描述了使用URL请求对象的细节。
Response Metadata - 响应元数据
从服务器到请求的响应可以被看作两部分:描述内容和内容数据本身的元数据。 大多数协议通用的元数据由NSURLResponse
类封装,包含MIME类型,预期内容长度,文本编码(如果适用)以及提供响应的URL。 NSURLResponse
的特定于协议的子类可以提供额外的元数据。 例如, NSHTTPURLResponse存储由Web服务器返回的标题头和状态代码。
重要提示:只有响应的元数据存储在
NSURLResponse
对象中。 各种URL加载类通过完成处理程序块或对象代理将响应数据本身提供给您的应用程序。
NSCachedURLResponse实例封装NSURLResponse对象,URL内容数据以及您的应用程序提供的任何其他信息。 详情请参阅Cache Management。
本书通篇描述了使用URL响应对象的细节。
3. Redirection and Other Request Changes - 重定向和其他请求更改
某些协议(如HTTP)为服务器提供了一种方式,告诉您的应用程序内容已移至不同的URL。 URL加载类可以在发生这种情况时通知他们的代理。 如果您的应用程序提供了适当的委托方法,则您的应用程序可以决定是否遵循重定向,从重定向返回响应主体,或返回错误。
相关章节:Handling Redirects and Other Request Changes
4. Authentication and Credentials - 身份验证和凭证
某些服务器限制对特定内容的访问,要求用户通过提供某种证书(客户端证书,用户名和密码等)进行身份验证才能获得访问权限。在Web服务器的情况下,受限制的内容被分组到需要一组凭证的领域。凭证(特别是证书)也用于确定另一方向的信任 - 评估您的应用是否应该信任服务器。
URL加载系统提供模型凭证和受保护区域的类以及提供安全的凭证持久性。您的应用可以指定这些凭据在单个请求,应用启动期间或永久保存在用户的钥匙串中时保留。
注意:存储在持久性存储中的凭证保存在用户的钥匙串中,并在所有应用程序中共享。
NSURLCredential类封装由认证信息(例如用户名和密码)和持久性行为组成的凭证。 NSURLProtectionSpace类表示需要特定凭证的区域。保护空间可以限制为单个URL,包含Web服务器上的领域或引用代理。
NSURLCredentialStorage对象管理会话的凭证存储,并提供NSURLCredential
对象与其提供身份验证的相应NSURLProtectionSpace
对象的映射。只有身份验证质询成功时才会存储凭证。
NSURLAuthenticationChallenge类封装了NSURLProtocol实现为验证请求所需的信息:建议的凭证,涉及的保护空间,协议用于确定需要验证的错误或响应,以及已完成的验证尝试次数。 NSURLAuthenticationChallenge
实例还指定启动身份验证的对象。发起对象(称为发送者)必须符合NSURLAuthenticationChallengeSender
协议。
NSURLAuthenticationChallenge
实例被NSURLProtocol
子类用于通知URL加载系统需要认证。它们也提供给NSURLSession
的委托方法,以方便定制认证处理。
相关章节:Authentication Challenges and TLS Chain Validation
5. Cache Management - 内存管理
URL加载系统提供了一个磁盘和内存中缓存,允许应用程序减少对网络连接的依赖,并为以前缓存的响应提供更快的周转时间。缓存存储在每个应用程序的基础上。 NSURLSession
根据启动NSURLRequest
和NSURLSessionConfiguration
对象指定的缓存策略来查询缓存。
NSURLCache类提供了一些方法来配置缓存大小及其在磁盘上的位置。它还提供了管理包含缓存响应的NSCachedURLResponse对象集合的方法。
NSCachedURLResponse
对象封装NSURLResponse
对象和URL内容数据。 NSCachedURLResponse
还提供了一个用户信息字典,您的应用可以使用它来缓存任何自定义数据。
并非所有的协议实现都支持响应缓存。目前只有http和https请求被缓存。
NSURLSession对象可以通过实现URLSession:dataTask:willCacheResponse:completionHandler:delegate
方法来控制是否缓存响应以及是否应该仅在内存中缓存响应。
相关章节:Understanding Cache Access
6. Cookie Storage - Cookie存储
由于HTTP协议的无状态特性,客户端通常使用Cookie来提供跨URL请求的持久数据存储。 URL加载系统提供接口来创建和管理cookie,发送cookie作为HTTP请求的一部分,并在解释web服务器的响应时接收cookie。
OS X和iOS提供了NSHTTPCookieStorage类,该类又提供了管理NSHTTPCookie对象集合的接口。 在OS X中,所有应用程序共享cookie存储; 在iOS中,Cookie存储是按应用程序进行的。
相关章节:Cookie Storage
7. Protocol Support - 协议支持
URL加载系统本身支持http,https,file,ftp和data协议。 但是,URL加载系统还允许您的应用程序注册您自己的类以支持其他应用程序层网络协议。 您还可以将协议指定的属性添加到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存储和支持自定义应用层协议的类。
后记
本篇主要介绍了关于URL系统这个苹果框架的概览和描述,包括URL加载系统的各个组成部分。