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

时间:2017-08-18 23:25:27

标签: ios app-transport-security

我正在开发一个可以传输大量远程直播视频的应用。这些实时视频的网址各不相同,其中大多数都使用HTTP而非HTTPS。

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

1 个答案:

答案 0 :(得分:2)

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

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

<强> NSAllowsArbitraryLoadsForMediaContent

从iOS 10开始,Apple提供了一个新密钥NSAllowsArbitraryLoadsForMediaContent,用于从ATS要求中排除媒体内容。根据Apple的指导原则,该密钥(以及类似的NSAllowsArbitraryLoadsForWebContent)不需要证明理由。

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

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

<强> NSExceptionDomains

如果您确实知道您的媒体所在的所有域名不支持所有ATS要求,并且NSAllowsArbitraryLoadsForMediaContent方法不适合您,我建议您使用NSExceptionDomains下一个。再次,它向Apple显示您正在尝试限制应用用户不安全服务器连接的曝光量。如果您确实需要在以后提供Apple理由,您只需让他们知道域名不在您的控制范围内,但您的应用程序的其余部分仍然受到ATS合规性检查的保护。

NSAllowsArbitraryLoads

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

即使您使用NSAllowsArbitraryLoads设置,最佳做法是使用NSExecption域为您控制的符合ATS的域添加例外*重新启用ATS合规性检查**。然后,至少Apple会知道您正在保护您控制的连接。

因此,只使用NSAllowsArbitraryLoads作为您真正无法了解服务器连接的应用程序的最后手段。