我是否需要使用 NSExceptionDomain,或者是否可以完全禁用应用程序传输安全性?



我正在开发一个流式传输大量远程直播视频的应用程序。这些直播视频的网址各不相同,其中大多数使用 HTTP 而不是 HTTPS。

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

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

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

NSAllowsArbitraryLoadsForMediaContent

从iOS 10开始,Apple提供了一个新的关键NSAllowsArbitraryLoadsForMediaContent,用于将媒体内容排除在ATS要求之外。 根据苹果的指导方针,该密钥(以及类似的NSAllowsArbitraryLoadsForWebContent(不需要理由。

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

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

NSExceptionDomains

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

NSAllowsArbitraryLoad

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

即使您使用NSAllowsArbitraryLoads设置,最佳做法也是使用 NSExecption 域添加例外,以便为您控制的符合 ATS 标准的域重新打开 ATS 合规性检查。 那么至少苹果会知道您正在保护您控制的连接。

因此,仅将NSAllowsArbitraryLoads用作您真正无法知道服务器连接的应用程序的最后手段。

最新更新