【问题标题】:App Transport Security blocks routing via custom url schemeApp Transport Security 通过自定义 url 方案阻止路由
【发布时间】:2017-07-31 18:11:48
【问题描述】:

我的 iOS 应用程序(用 Swift 和 React Native 编写)有一个自定义 url 方案,允许我从例如路由到应用程序。像这样的 Safari myappscheme://https://www.mywebsite.com/somematerial。如果我在我的应用程序中启用应用程序传输安全性,通过自定义 url 方案的路由将被阻止并且我收到以下消息:

App Transport Security 已阻止明文 HTTP (http://) 资源 加载,因为它不安全。可以通过以下方式配置临时异常 您应用的 Info.plist 文件。

但是,如果我禁用 ATS,应用程序会按预期路由。我没有在我的应用程序中通过 http 访问任何链接,在我的路由中,我总是通过 https 获取数据。因此,我不知道为什么 ATS 会阻止此路由。你知道我是否需要提供一些关于我的 url 方案的额外信息吗?

请在 Info.plist 中查看我的 ATS 配置:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoadsInWebContent</key>
    <true/>
    <key>NSExceptionDomains</key>
    <dict>
        <key>localhost</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
        </dict>
    </dict>
</dict>

我还将自定义 url 方案列入白名单:

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>myappscheme</string>
</array>

【问题讨论】:

  • 代替'localhost'试试'server.local'
  • @Floler 感谢您的建议,但这不起作用。

标签: ios swift react-native url-scheme


【解决方案1】:

此问题已解决。我注销了我正在点击的端点,并通过在终端中执行检查它是否满足 ATS 要求:

nscurl --ats-diagnostics https://www.example.com/

事实证明,我尝试获取的特定子域未能满足所有 ATS 要求。我的服务器团队已解决此问题并确保端点安全。

【讨论】:

    【解决方案2】:

    我认为问题出在 React Native,您提到您使用 Safari 作为自定义链接的来源,这可能意味着您正在尝试在 Simulator 中调试您的应用程序和自定义路由,所以您的问题可能与 React 有关本国的。如果您在 React Native 离线工作时在真实设备上遇到相同的行为,请更新您的问题。

    通过添加 NSAllowsArbitraryLoads 进入您的 Info.plist 文件。由于 ATS 确实 不允许对 IP 地址的不安全 HTTP 请求,您必须完全 禁用它以在设备上运行。这只是一个要求 在设备上进行开发,除非您无法解决问题 应该为生产构建启用 ATS。了解更多信息, 有关配置 ATS,请参阅 this post

    React Native Documentation - Running On Device

    【讨论】:

    • 感谢您的建议,但事实并非如此。我的应用程序也只有 Swift 的旧版本,如果我不允许任意加载,通过自定义 url 方案的路由也不起作用。我没有通过 Safari 进行调试,而是使用 UIApplication.shared.openURL(myappscheme://mywebsite.com/som‌​ematerial) 从我的 swift 代码中打开 url。我在模拟器和设备上遇到了同样的问题。
    【解决方案3】:

    配置info.plist 设置。

    您可以添加特定的域,例如:

    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
        <key>NSExceptionDomains</key>
        <dict>
            <key>www.google.com</key>
            <dict>
                <key>NSIncludesSubdomains</key>
                <true/>
                <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
                <true/>
                <key>NSTemporaryExceptionMinimumTLSVersion</key>
                <string>TLSv1.1</string>
            </dict>
        </dict>
    </dict>
    

    【讨论】:

    • 感谢您的建议,但我不想将我的域列为例外。我想满足 ATS 要求。
    猜你喜欢
    • 2018-12-24
    • 2016-01-24
    • 2016-04-17
    • 2015-06-22
    • 2016-03-21
    • 2015-11-05
    • 2016-11-26
    • 2015-11-30
    • 2015-12-15
    相关资源
    最近更新 更多