基本上所有的应用都需要用到网络,Apple 给我们提供的网络交互框架主要是基于 URLSession 的 URL 加载系统。
URLSession介绍
URLSession 实际指代 Foundation 框架的 URL 加载系统中的一些类和协议。主要由以下几个类组成:

- URLSession
- 负责请求/响应的关键对象,可以理解成和服务端的一个会话,必须创建会话,在会话的基础上进行网络数据的上传和获取,使用 URLSessionConfiguration 配置对象进行创建。
- 在请求/响应的执行过程中调用 URLSessionTaskDelegate 定义的各种代理方法。
- URLSessionConfiguration
- 用于对
URLSession
对象进行初始化,可以配置 可用网络、Cookie、安全性、缓存策略、自定义协议、启动事件 等选项,以及用于移动设备优化的相关选项。 - 几乎可以配置任何网络相关选项。
- URLSessionTask
- 一个抽象类,其子类可以创建不同类型的任务(Task),如:下载、上传、获取数据(如:JSON 或 XML)。
- 在特定 Session 中执行。
- URLRequest
- 将 URL 和请求协议相关的属性封装起来,传递给 URLSession 用于创建URLSessionTask。
- URLResponse
- 将返回的元数据和内容数据本身封装起来。
在 apple 官方文档中,将网络模块分为了以下几种类:

在一个请求被发送到服务器之前,系统会先查询共享的缓存信息,然后根据 缓存策略(Cache Policy) 以及 可用性(availability) 的不同,一个已经被缓存的响应可能会被立即返回。如果没有缓存的响应可用,则这个请求将根据我们指定的策略来缓存它的响应,以便将来的请求可以使用。
在一个请求被发送到服务器过程中,服务器可能会发出 鉴权查询(Authorization Challenge),这可以由共享的 Cookie 或 证书存储(Credential Storage) 来自动响应,或者由被委托对象来响应。此外,发送中的请求也可以被注册的
URLProtocol
对象所拦截,以便在必要时改变其加载行为。URLSession
是负责请求/响应的关键对象,URLSession
本身并不会进行请求,而是通过创建 Task 的形式来进行网络请求。同一个 URLSession
可以创建多个 Task,并且这些 Task 之间的 Cache 和 Cookie 是共享的。URLSession
在管理请求/响应的过程中会调用相关的代理方法。这些代理方法主要分两类:- Session 的委托对象实现的代理方法(
URLSessionDelegate
定义的方法) - 主要用于处理连接层问题,如:服务器信任、客户端证书认证、NTLM 和 Kerberos 协议等问题
- Task 的委托对象实现的代理方法(
URLSessionTaskDelegate
及其子协议定义的方法) - 主要用于处理以网络请求为基础的问题,如:Basic,Digest,代理身份验证(Proxy Authentication) 等。