NSURLSession

NSURLSession 类和相关类提供下载内容的 API。此 API 提供了一组丰富的委托方法,用于支持身份验证,并使你的应用能够在你的应用未运行时执行后台下载,或者在 iOS 中,在你的应用暂停时执行后台下载。

在较高的层次上, NSURLSession 基于会话和任务的概念。任务表示单个 URL 的单个请求(或单个上载到单个 URL)。会话是一组相关请求。

操作系统提供单个预先存在的会话 - 共享会话,它基本上像 NSURLConnection 一样工作。此外,你可以根据需要在应用中创建自己的会话。

不同的应用以不同的方式使用会话。许多应用程序在启动时创建一个会话,并继续重复使用它。其他应用程序可以从取消一组相关任务中受益(例如,当你关闭选项卡时,Web 浏览器会取消所有未完成的请求),从而创建一个会话来保存每组相关请求。

使用 NSURLSession 的第一步是创建会话配置对象。 (通常)可重用对象包含各种会话设置,你可以根据自己的特定需求进行调整,例如最大并发,每个请求发送的额外标头,是否允许通过蜂窝无线电发送请求(仅限 iOS),超时,凭证存储,最小 TLS 版本,甚至代理设置。

会话配置有三种类型,具体取决于你希望结果会话的行为方式:

  • 默认配置创建的会话与 NSURLConnection 非常相似。
  • 后台配置创建会话,其中请求在进程外发生,即使应用程序不再运行,也允许下载继续。
  • 临时配置会创建不会将任何内容缓存到磁盘,不将 cookie 存储到磁盘等的会话,因此适用于隐藏浏览器窗口等内容。

创建后台配置时,必须提供会话标识符,以便稍后重新关联后台会话(如果你的应用程序退出或被操作系统暂停或终止)。你的应用中不得有多个具有相同标识符的会话实例,因此通常情况下,这些配置不可重复使用。可以重用所有其他会话配置以创建任意数量的会话。因此,如果你需要创建具有类似设置的多个会话,则可以创建一次配置,并在每次创建新会话时重复使用它。

创建会话后,你可以在该会话中创建任务。有三种类型的任务:

  • 数据任务将数据作为 NSData 对象返回。这些适用于一般用途,但在后台会话中不受支持。
  • 下载任务将数据作为磁盘上的文件返回。这些适用于较大的请求,或用于后台会话。
  • 上载任务从 NSData 对象或磁盘上的文件上载数据。你提供了一个提供 POST 正文的数据对象或文件。你在任务上提供的正文数据/文件将覆盖 NSURLRequest 对象中提供的任何正文数据/文件(如果适用)。

这些类型中的每一种都允许你以几种不同的方式获取响应数据 - 通过使用基于块的回调或通过在会话上提供委托并实现委托方法。

此外,NSURLSession 允许你提供用于处理身份验证,执行自定义 TLS 证书处理(包括客户端证书和服务器验证),更改缓存行为等的委托方法。