【问题标题】:Allow HTTP without disabling ATS in iOS在 iOS 中允许 HTTP 而不禁用 ATS
【发布时间】:2016-10-30 07:05:52
【问题描述】:

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

【问题讨论】:

    标签: ios facebook app-transport-security


    【解决方案1】:

    According to Apple,如果您针对较旧的 SDK(即 iOS 8 或更早版本)构建,则 ATS 将被禁用。我不知道这到底是什么意思,但我猜这是目标构建设置架构,基础 SDK——而不是部署目标设置。

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

    • NSAllowsArbitraryLoads
    • NSExceptionAllowsInsecureHTTPLoads
    • NSExceptionMinimumTLSVersion

    但是,您似乎将被允许使用一个名为:

    的新例外:
    • NSAllowsArbitraryLoadsInWebContent

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

    在你的情况下,我猜你没有使用 WKWebView,所以你最好开始研究你的“合理理由”。或者坚持使用 iOS 8 SDK。

    【讨论】:

    • 您打算如何生成预览?使用 WKWebView 控件?如果是这样,请等待 Apple 发布 NSAllowsArbitraryLoadsInWebContent 并使用它。否则,您能否在服务器上生成预览并将其作为图像发送到您的应用?
    【解决方案2】:

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

    但是,如果用户给定的 URL 可以是任何 URL,那么除了使用 NSAllowsArbitraryLoads 之外别无他法。

    【讨论】:

    • 我尝试使用 burp-proxy 拦截 Facebook ios 应用程序流量,并且流量通过 HTTPS,但它们仍然显示 HTTP 链接的预览。他们没有跳过 ATS 。这意味着有一些方法可以做到这一点。不是吗?
    • @Duke 是的,有一种方法——使用NSAllowsArbitraryLoads。
    • 我正在尝试像 facebook 那样做。允许使用 SSL (ATS) 的 HTTP。
    • @Duke 你没有任何意义。带有 SSL 的 HTTP 是 HTTPS。
    • @Duke NSAllowsArbitraryLoads 只允许 HTTP。 HTTPS 仍然是安全的。它不会使应用程序“在网络层透明”。
    【解决方案3】:

    打开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。

    【讨论】:

    • 我们不知道用户输入。它可以是任何 HTTP url
    • 对不起,我没有注意到。您可以看到this post 在运行时如何写入 info.plist 但我不确定...
    猜你喜欢
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 2016-01-18
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 2012-05-19
    • 1970-01-01
    相关资源
    最近更新 更多