只为此心无垠

A blog for Jekyll

凤凰花开开两季,之余青春止于青春


Download the theme

About the URL Loading System

关于URL加载系统

本指南介绍了这个框架可用于URL交互,并使用标准的互联网协议与服务器进行通信。这些类被总称为URL Loading System

URL Loading System是一套classprotocol的集合,使您的应用程序通过URL访问内容。此技术的核心是NSURL类,它可以让应用程序处理指定URL和resource。

为了支持NSURL类,Foundation框架提供一系列丰富的类,让你加载URL的内容,上传数据到服务器,管理cookie存储,控制响应缓存,处理证书存储和应用程序特定的身份验证方式,并自定义协议的扩展。

URL Loading System提供了以下协议进行访问资源的支持:

  • 文件传输协议(ftp://
  • 超文本传输协议(http://
  • 加密超文本传输协议(https://
  • 本地文件URL( file:///
  • 数据的网址(data://

使用用户的系统偏好,还透明地支持代理服务器和SOCKS网关。

重要提示:  除了URL Loading System,在其他应用程序,Mac OS X和iOS也提供API打开URL,如Safari。这些API并未在本文档中描述。

有关在OS X启动服务的更多信息,请阅读 Launch Services Programming Guide

在OS X类,有关NSWorkSpaceopenURL:方法的详细信息,请阅读 NSWorkspace Class Reference

在iOS中类,有关UIApplicationopenURL:方法的详细信息,请阅读UIApplication Class Reference

总览

URL Loading System包含了一些URL加载的重要辅助类。主要辅助类分为五种:协议支持,认证和证书,cookie存储,配置管理和缓存管理。

该网址加载系统类层次结构

URL加载

URL loading system最常用的类,让你的应用从源上获取URL的内容。您可以使用NSURLSession获取内容。具体的使用方法在很大程度上取决于是将数据读取到内存中,还是将其下载到磁盘。

获取数据(In Menory)

高层次的说,有两个基本的方法来获取URL数据:

  • 对于简单的请求,直接使用NSURLSessionAPI,通过NSURL对象来获取内容,要么是作为一个NSData对象,要么是磁盘上的文件。
  • 对于复杂些的请求,例如上传数据,提供了NSURLRequest对象(或它的子类NSMutableURLRequest)。

无论你选择哪种方法,你的应用程序可以通过两种方式获得响应数据:

  • 提供completion handler block。当从服务器接收数据完成之后,URL loading class会调用该block。
  • 提供自定义delegate。当它从始发源接收数据,URL loading class会定期调用你的delegate方法。您的应用程序负责堆叠这些数据。

除了数据本身,URL loading class会为delegate或block,提供response对象,此对象封装了request元数据,如MIME类型和 content length。

相关章节: 使用NSURLSession

下载文件

更深层地,有两个基本的方法来下载文件内容:

  • 对于简单的请求,直接使用NSURLSessionAPI,通过NSURL对象来获取内容,要么是作为一个NSData对象,要么是磁盘上的文件。
  • 对于复杂些的请求,例如上传数据,提供了NSURLRequest对象(或它的子类NSMutableURLRequest)。

注:  由NSURLSession实例发起的下载不缓存。如果你需要缓存结果,您的应用程序必须使用NSURLSession,并自己将数据写入到磁盘。

相关章节: 使用NSURLSession

Helper Classes

URL Loading classes使用两个辅助类,提供额外的元数据,一个是请求本身(NSURLRequest),另一个是服务器的响应(NSURLResponse)。

注:元数据(Metadata),又称中介数据中继数据,为描述数据的数据(data about data),主要是描述数据属性的信息,用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。

URL Requests

一个NSURLRequest对象封装了URL和协议相关的属性。

注意:  当客户端应用程序发起连接,或使用NSMutableURLRequest示例下载,深拷贝这个请求。原始请求的任何改变是无效的,直到下载完成。

某些协议还支持特定的属性。例如,HTTP协议将方法添加到NSURLRequest,可以返回HTTP请求的请求提,请求头和传输方法。同理NSMutableURLRequest

URL请求对象更多细节,会在这本书中描述。

响应元

服务器的响应可被分成两个部分:描述内容的元数据和内容数据本身。在大多数协议内很常见,Metadata是由NSURLResponse类封装,包含MIME type,expected content length,文本编码text encoding , URL等 。当然,NSURLResponse的其他子类可以提供其他元数据。例如,NSHTTPURLResponse存储了请求提和由Web服务器返回的状态代码status code 。

重要:  只有在响应的元数据被存储在NSURLResponse对象。不同的URL loading class,要么通过delegate,要么通过completion block,为app提供响应数据。

NSCagcgURLResponse实例封装了NSURLResponse对象和the URL content data,以及其他app提供的信息。详见 Cache Management 。

重定向和其他请求更改

某些协议,如HTTP,会提供一个方法,让服务器通知app,内容被移动到不同URL。当这种情况发生,URL loading class可以通知其delegate。如果您的应用程序提供了一个合理的delegate方法,您的应用程序可以再决定是否跟随重定向,是通过重定向之后返回响应主体,还是返回一个错误。

相关章节:Handling Redirects and Other Request Changes

身份验证和证书

身份验证(Authentication)指客户端身份验证,要求用户提供证书(客户端证书,用户名和密码等等)。

一些服务器限制访问某些内容,要求用户提供证书(客户端证书,用户名和密码等等)进行身份验证,以获得访问权。在Web服务器的情况下,限制内容被分成需要不同证书的组成(部分)。证书也被用来确定信任关系,反过来说,也可以评估您的应用程序是否应该信任这台服务器。

URL loading system提供了类,来建模证书和保护区,以及安全持久化证书。您的应用程序可以指定这些证书只坚持唯一的一个请求,要么永久在用户的钥匙串,要么在应用程序的启动时。

注:  证书(持久化存储)保存在用户的钥匙串,在其他所有应用程序之间是共享的。

NSURLCredential封装了证书,包括验证信息(例如用户名和密码)和持久性的行为。NSURLProtectionSpace表示需要特定证书的区域。一个保护空间可以限定在单一的URL,包含一个Web服务器上的领域,或代理。

一个共享实例NSURLCredentialStorage管理证书存储,和提供NSURLCredential对象和相应NSURLProtectionSpace的映射。

NSURLAuthenticationChallenge封装了信息,由NSURLProtocol身份验证请求的实现规定:a proposed credential, the protection space involved, the error or response that the protocol used to determine that authentication is required, and the number of authentication attempts that have been made。一个NSURLAuthenticationChallenge实例还需指定发起身份验证的对象。这个发起的对象,称为sender,必须遵守NSURLAuthenticationChallengeSender协议。

NSURLAuthenticationChallenge实例被NSURLProtocol子类所使用,通知URL loading system 需要身份验证。还有NSURLSession的委托方式,方便定制身份验证处理。

相关章节:Authentication Challenges and TLS Chain Validation

Cache管理

URL loading system提供了一个磁盘和内存的综合缓存方案,让应用减少对网络连接的依赖,并为以前缓存的响应提供更快的周转。缓存是每个应用程序的基础。根据初始NSURLRequestNSURLSessionConfiguration对象指定的高速缓存策略,缓存由NSURLSession查询。

NSURLCache类提供了配置缓存大小和磁盘缓存位置的方法。它还提供了方法,来管理NSCachedURLResponse集合(包含了已缓存的响应对象)。

一个NSCachedURLResponse对象封装NSURLResponse对象和URL的内容数据。NSCachedURLResponse还提供了用户信息的字典,你的应用程序可以缓存任何自定义数据。

并非所有的协议实现支持响应缓存。目前只有httphttps支持请求缓存。

一个NSURLSession对象可以控制响应是否缓存,以及响应是否只缓存在内存中,通过实现URLSession:dataTask:willCacheResponse:completionHandler: 的委托方法。

相关章节: Understanding Cache Access

Cookie的存储

由于HTTP协议的无状态特性,客户经常使用cookies,提供请求数据在不同URL之间的持久化存储。URL loading system提供接口,来创建和管理cookies,作为HTTP请求的一部分发送cookies,并且在解析Web服务器的响应时,接收cookies。

OS X和iOS提供NSHTTPCookieStorage类,这又提供了一种接口,来管理集合NSHTTPCookie对象。在OS X中存储的cookie可以在所有应用程序之间共享; 在iOS中,cookie的存储是仅限每个应用程序内。

相关章节: Cookie Storage

协议支持

URL loading system本身支持httphttpsfileftp,和data协议。然而,URL loading system还可以让你的应用程序注册自己的类,来支持其他的应用层网络协议。您还可以添加特定协议的属性,URL请求和URL响应对象。

相关章节:Cookies and Custom Protocols

如何使用本文档

通过阅读使用NSURLSession,了解URL loading system的概述。然后阅读 Life Cycle of a URL Session 详细了解NSURLSession如何与它的delegate进行交互。在下面的章节中提供了URL loading system其他方面的详细信息:

最近的文章

Encode URL Data

编码URL数据URL编码字符串,使用Core Foundation 函数的CFURLCreateStringByAddingPercentEscapes和CFURLCreateStringByReplacingPercentEscapesUsingEncoding。这些函数允许编码您指定的字符列表,除了高ASCII编码(0x80- 0xff)和非打印字符。根据RFC 3986,在URL中的保留字符有:reserved = gen-delims / sub-delims gen-del...…

编码继续阅读
更早的文章

View Controller Program Guide for iOS(五)

适配模型-The Adaptive Model适配界面是一个对可用空间的最佳利用。作为自适应意味着能够调整内容适配任何iOS设备。在iOS中的自适应模型Adaptive Model用简单且动态的方法来重新排列,并调整内容来应对变化。当你利用这个模式,一个单一的应用程序用很少的额外代码,就能适应不同的屏幕尺寸(如图12-1)。图12-1适配不同的设备和方向一个适配屏幕的重要工具是自动布局。使用自动布局,您可以定义规则(被称为约束Constraints)控制控制器的视图布局。你可以在Inter...…

UINavigationController继续阅读