我是否需要使用 NSExceptionDomains,或者我是否可以完全禁用 App Transport Security?

Do I need to use NSExceptionDomains, or can I just disable App Transport Security completely?

我正在开发一款可以流式传输大量远程直播视频的应用。这些实时视频的 URL 各不相同,其中大部分使用 HTTP 而不是 HTTPS。

通过将 AllowArbitraryLoads 设置为 YES 来完全禁用 App Transport Security 是否有任何缺点?或者我应该使用 NSExceptionDomains?是否有任何其他选项可以为应用程序用户提供最大的安全性,同时确保应用程序在尝试与媒体服务器通信时不会 运行 出现问题。

虽然使用 NSAllowsArbitraryLoads 完全禁用 ATS 通常是 SO 上给出和接受的解决方案,但它会带来一些开发人员应该注意的后果。首先,截至目前(2017 年 8 月),Apple 允许开发人员使用该设置来根据他们的选择禁用 ATS。但是,Apple 表示他们将开始要求开发人员提供使用该密钥完全关闭 ATS 的理由。 Apple 最初计划在 2017 年 1 月开始强制要求提供正当理由,但后来无限期推迟。对我来说,开发人员继续使用 NSAllowsArbitraryLoads 设置是有风险的,因为当 Apple 开始执行新政策时,开发人员可能无法将其应用程序的关键修复程序提交到应用程序商店。

特别针对您关于流媒体视频的问题,您可以使用以下几个选项:

NSAllowsArbitraryLoadsForMediaContent

从 iOS10 开始,Apple 提供了一个新密钥 NSAllowsArbitraryLoadsForMediaContent,用于将媒体内容排除在 ATS 要求之外。根据 Apple 的指导方针,该密钥(以及类似的 NSAllowsArbitraryLoadsForWebContent)不需要证明。

但是,由于此密钥仅在 iOS 10 中添加,如果您的应用需要在 iOS 9 设备上支持 运行,则会出现问题。幸运的是,Apple 也提供了一种方法来做到这一点。要支持 iOS 9 和 iOS 10+ 设备,您需要添加 both NSAllowsArbitraryLoadsForMediaContent and NSAllowsArbitraryLoads 到你的 plist。由于 iOS9 不知道 NSAllowsArbitraryLoadsForMediaContent,它只看到/关心 NSAllowsArbitraryLoads 密钥,并且会禁用 iOS 9 设备的所有 ATS 合规性检查。因为 iOS10 知道新密钥,它会忽略 'NSAllowsArbitraryLoads' 并且只禁用媒体流的 ATS 合规性检查。

因为如果您需要支持 iOS9 种设备,这是 Apple 推荐的方法,如果您在将来的某个时候确实需要提供理由,您可以简单地声明这是 Apple 推荐的支持方法iOS 9 台设备上的非 https 媒体流。至少他们会看到您正在尝试允许 ATS 提供其服务。

NSExceptionDomains

如果您确实知道您的媒体所在的所有域不支持所有 ATS 要求,并且 NSAllowsArbitraryLoadsForMediaContent 方法不适合您,我建议使用 NSExceptionDomains 接下来。同样,它向 Apple 表明您正在尝试限制您的应用程序用户对不安全服务器连接的暴露程度。如果您稍后确实需要向 Apple 提供理由,您只需让他们知道这些域不受您的控制,但您应用程序的其余通信仍受到 ATS 合规性检查的保护。

NSAllowsArbitraryLoads

此时,有些应用可能需要使用此设置。但是这些应该基本上仅限于允许用户输入服务器的应用程序(开发人员不知道应用程序可能需要与哪些服务器进行通信。这些应用程序非常罕见。大多数应用程序只是简单地设置它,因为它们在开发中遇到错误从 iOS9 开始,并阅读一些 SO 答案,如果你设置标志,错误就会消失。遗憾的是,我认为盲目遵循该建议的应用程序数量可能导致 Apple 试图强加理由程序.

即使您使用 NSAllowsArbitraryLoads 设置,最好的做法是还使用 NSExecption 域添加例外,以*重新打开 ATS 合规性检查**您控制的符合 ATS 的域。这样至少 Apple 会知道您正在保护您控制的连接。

因此,仅将 NSAllowsArbitraryLoads 用作您确实不知道服务器连接的应用程序的最后手段。