在 iOS 中允许 HTTP 而不禁用 ATS

Allow HTTP without disabling ATS in iOS

我正在开发一个应用程序,其中有一些小调整。它将显示给定 url 的预览(就像 Facebook、whatsapp 那样)。但是如果 "User-given" url 在 HTTP 中,当 ATS 打开时我无法加载预览。所以我使用 NSAllowsArbitraryLoads 关闭了整个 HTTPS 流量。有没有什么方法可以在启用 ATS 的情况下允许 http?

您可以添加例外 (NSExceptionDomains) 以允许特定域使用 HTTP。见 documentation.

但是,如果给定的用户 URL 可以是任何 URL,那么除了使用 NSAllowsArbitraryLoads.

别无他法

打开 Info.plist 作为源代码,然后将其添加到您想要的位置:

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <false/>
        <key>NSExceptionDomains</key>
        <dict>
            <key>aWebsite.com</key>
            <dict>
                <key>NSIncludesSubdomains</key>
                <true/>
                <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
                <true/>
                <key>NSTemporaryExceptionMinimumTLSVersion</key>
                <string>TLSv1.1</string>
            </dict>
            <key>anotherWebsiteIfYouWant.com</key>
            <dict>
                <key>NSIncludesSubdomains</key>
                <true/>
                <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
                <true/>
                <key>NSTemporaryExceptionMinimumTLSVersion</key>
                <string>TLSv1.1</string>
            </dict>
        </dict>
    </dict>

这样您就不必完全禁用 ATS。

According to Apple,如果您针对较旧的 SDK 进行构建,那么 iOS 8 或更早版本将禁用 ATS。我不知道这到底是什么意思,但我猜这是目标构建设置 Architectures,Base SDK -- 而不是部署目标设置。

This video 包含最近在 WWDC 2016 上宣布的 ATS 更改的详细信息。从 2017 年初开始,如果您使用以下任何 ATS 例外情况,Apple 将拒绝您的应用 AND 您无法提供这样做的合理理由:

  • NSAllowsArbitraryLoads
  • NSExceptionAllowsInsecureHTTPLoads
  • NSExceptionMinimumTLSVersion

但是,看来您被允许使用一个名为:

的新例外
  • NSAllowsArbitraryLoadsInWebContent

这意味着一个 WKWebView 控件仍然可以加载 HTTP 内容。不确定这是否也适用于 UIWebView。

在你的情况下,我猜你没有使用 WKWebView,所以你最好开始处理你的 "reasonable justification"。或者坚持使用 iOS 8 SDK。