为什么必须添加 `NSAppTransportSecurity` 并将 `NSAllowsArbitraryLoads` 键添加到 `YES`?

Why does one have to add `NSAppTransportSecurity` and add the `NSAllowsArbitraryLoads` key to `YES`?

在早期,每当我想检索数据时,都不需要添加 NSAppTransportSecurityinfo.plist 中将 NSAllowsArbitraryLoads 键设置为 YES,但现在如果您要通过网络 运行 您的应用程序,那么必须添加它。

为什么需要它?它有什么用?它的用途是什么?

有人能帮忙吗?

应用程序传输安全性 与 iOS9 一起引入,作为将您的应用程序连接到网络时的附加安全功能。

来自 Apple 的文档:

App Transport Security is a feature that improves the security of connections between an app and web services. The feature consists of default connection requirements that conform to best practices for secure connections. Apps can override this default behavior and turn off transport security.

其中一项要求是所有连接都必须使用 HTTPS。这就是为什么所有仅使用 HTTP 的连接都会在 iOS9.

上失败的原因

如果您使用的服务无法通过 HTTPS 使用,您仍然可以通过覆盖应用程序传输安全来使用它。这就是 Info.plist 文件中的 NSAppTransportSecurity 词典的用途。您可以在此处定义要覆盖的应用程序传输安全要求。

例如 NSAllowsArbitraryLoads 禁用任何域的 所有 安全要求。您可以在 NSExceptionDomains 字典中定义例外情况,但如果您不这样做,则所有域都将被允许在没有 App Transport Security 的情况下连接到您的应用程序。

当您想连接到不使用 HTTPS 的单个域时,您不应使用 NSAllowsArbitraryLoads,因为这会禁用 所有 的安全性所有 个域。相反,您应该专门覆盖仅针对该域的 HTTPS 要求。

您可以在 Info.plist 文件中这样做:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>yourdomain.com</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
        </dict>
    </dict>
</dict>

总而言之:App Transport Security 是一件好事,因为它鼓励您使用比普通 HTTP 连接更安全的 HTTPS 连接。因为您不能总是使用 HTTPS,所以它为您提供了允许不安全连接的机会。最好只在您需要的地方使用这些安全覆盖。