传输安全性阻止了明文 HTTP

Transport security has blocked a cleartext HTTP

提问人:Jeef 提问时间:7/7/2015 最后编辑:jwwJeef 更新时间:11/1/2023 访问量:947120

问:

根据以下错误消息,我需要在 HTTP 中设置什么设置才能启用 HTTP 模式?info.plist

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

Xcode

假设我的域是 。example.com

iOS Xcode iOS9 iOS10 应用程序传输安全

评论

1赞 Tom Howard 9/1/2015
stackoverflow.com/a/31629980/1803879
24赞 Matt 7/12/2016
主持人注:这个问题已经有36个答案了。在添加另一个解决方案之前,请确保您的解决方案是新的
6赞 Jakub Truhlář 1/3/2017
注意:此处的解决方案建议您应关闭 ATS ()。很快这是不可能的,因为苹果将要求 ATS(最初是年底 - 截止日期已延长) - developer.apple.com/news/?id=12212016bAllow arbitary loads
0赞 Alex1987 1/4/2017
firebase.google.com/docs/admob/ios/app-transport-security
0赞 Julian 9/27/2018
@Jeef为什么要添加iOS 10标签?在这方面,iOS 10是否有任何其他变化?我觉得它是在 iOS9 中引入的,就 iOS 版本而言,该标签应该足够了

答:

770赞 KMLong 7/7/2015 #1

请参阅论坛帖子 Application Transport Security?

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

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>example.com</key>
    <dict>
      <!--Include to allow subdomains-->
      <key>NSIncludesSubdomains</key>
      <true/>
      <!--Include to allow HTTP requests-->
      <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
      <true/>
      <!--Include to specify minimum TLS version-->
      <key>NSTemporaryExceptionMinimumTLSVersion</key>
      <string>TLSv1.1</string>
    </dict>
  </dict>
</dict>

惰性选项是:

<key>NSAppTransportSecurity</key>
<dict>
  <!--Include to allow all connections (DANGER)-->
  <key>NSAllowsArbitraryLoads</key>
      <true/>
</dict>

###Note:

info.plist是一个 XML 文件,因此您可以将此代码或多或少地放在文件中的任何位置。

评论

1赞 lmiguelvargasf 7/30/2015
我该怎么做,我的意思是将此代码添加到 Info.plist 的方法是什么,因为我不知道将此代码粘贴到何处?
2赞 Dan Beaulieu 7/31/2015
@lmiguelvargasf在纯文本编辑器中打开 info.plist
9赞 klaevv 10/13/2015
我仍然收到错误:设置了异常域,NSAllowsArbitraryLoads 为 false。即使将 NSAllowsArbitraryLoads 设置为 true,也会出现错误。这里有其他人有这个问题吗?
3赞 Philippe Monnet 1/31/2016
截至 2016 年 1 月 30 日,Apple 文档显示密钥中不再包含 Temporary 单词,例如:NSExceptionAllowsInsecureHTTPLoads NSExceptionMinimumTLSVersion 请参阅 developer.apple.com/library/prerelease/ios/documentation/...
3赞 BlueGuy 2/24/2016
以防其他人因为对 info.plist 进行这些简单的更改而拔掉他们的头发。添加对 Project>Target>Info>自定义 iOS 目标属性的更改
1015赞 CristiCh 8/4/2015 #2

使用 NSAppTransportSecurity:

Enter image description here

您必须在 info.plist 文件中的 NSAppTransportSecurity 字典下将 NSAllowsArbitraryLoads 键设置为 YES

Plist configuration

评论

173赞 Jacksonkr 8/30/2015
让大家知道:这是一个解决方法!每当您通过 HTTPS 使用 HTTP 时,您都会将用户的设备暴露在漏洞中。当然,在许多情况下这不太可能,但合乎道德的编程是最佳实践。只是说' ... - 此外,+1 用于工作(用于测试目的)
43赞 DiscDev 9/17/2015
这不是一个解决方案 - 这是一个黑客!要添加单个域“例外”,请参阅下面的答案: stackoverflow.com/a/32560433/1103584
21赞 reTs 11/3/2015
虽然已知此解决方案易受攻击,但它是我在开发过程中推荐的唯一解决方案。在开发过程中必须输入每个确切的域是愚蠢的(特别是如果您使用的是第三方 Web 服务)。
6赞 vishal dharankar 12/21/2015
这些密钥的名称现在已更改,在“允许任意加载”下“应用传输安全设置”
16赞 Oren 4/5/2016
为什么这么多人反对这个解决方案?这绝对不是黑客!许多应用程序需要与实际的互联网进行通信,而安全协议并不总是在您的控制之下。例如,能够显示来自其他没有SSL证书的服务器的图像似乎非常合理。
151赞 Julian 9/1/2015 #3

这是在 plist 中添加以下内容的快速解决方法(但不推荐):

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

这意味着(根据 Apple 的文档):

NSAllowsArbitraryLoads 一个布尔值,用于对 NSExceptionDomains
字典中未列出的任何域禁用 App Transport Security。列出的域使用为该域指定的设置。

默认值 NO 要求所有连接都采用默认的应用传输安全行为。

我真的推荐链接:

这有助于我理解原因和所有含义。

下面的 XML(在文件 Info.plist 中)将:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <false/>
    <key>NSExceptionDomains</key>
    <dict>
        <key>PAGE_FOR_WHICH_SETTINGS_YOU_WANT_TO_OVERRIDE</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
        </dict>
    </dict>
</dict>

禁止对所有页面进行任意调用,但 for 将允许连接使用 HTTP 协议。PAGE_FOR_WHICH_SETTINGS_YOU_WANT_TO_OVERRIDE

在上面的 XML 中,您可以添加:

<key>NSIncludesSubdomains</key>
<true/>

如果要允许指定地址的子域进行不安全的连接。

最好的方法是阻止所有任意加载(设置为 false)并添加例外以仅允许我们知道没问题的地址。

对于感兴趣的读者

2018年更新:

Apple 不建议将其关闭 - 更多信息可以在 207 会议中找到 WWDC 2018,其中解释了有关安全性的更多内容

由于历史原因和发展阶段而留下原始答案

评论

1赞 Sound Blaster 9/14/2015
NSAllowsArbitraryLoads必须是false
0赞 Julian 9/21/2015
@SoundBlaster,在什么情况下,你认为我的反对票答案是错误的?
0赞 amit gupta 9/22/2015
通过添加 plist(NSAppTransportSecurity NSAllowsArbitraryLoads),除了一个 Web 服务外,所有 Web 服务都工作正常,一个 Web 服务在 iOS 9 中返回内部服务器错误 (500),但在 iOS8 或更高版本中工作正常
0赞 Julian 10/7/2015
@SoundBlaster进行了更改,现在您不应该有异议:)
0赞 Agent Zebra 8/11/2016
谢谢,你实际上如何添加?每个环境都必须被包围吗?你如何编辑这个该死的plist文件?格式是什么?:D谢谢。<key>NSIncludesSubdomains</key> <true/><dict>
357赞 Sound Blaster 9/14/2015 #4

这已经过测试,并且正在 iOS 9 GM 种子上运行 - 这是允许特定域使用 HTTP 而不是 HTTPS 的配置:

<key>NSAppTransportSecurity</key>
<dict>
      <key>NSAllowsArbitraryLoads</key> 
      <false/>
       <key>NSExceptionDomains</key>
       <dict>
            <key>example.com</key> <!--Include your domain at this line -->
            <dict>
                <key>NSIncludesSubdomains</key>
                <true/>
                <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
                <true/>
                <key>NSTemporaryExceptionMinimumTLSVersion</key>
                <string>TLSv1.1</string>
            </dict>
       </dict>
</dict>

NSAllowsArbitraryLoadsmust 是 ,因为它不允许所有不安全的连接,但例外列表允许连接到某些没有 HTTPS 的域。false

这是视觉上的:

Info.plist structure

评论

7赞 DiscDev 9/17/2015
这应该被标记为答案。在 iOS 9 GM 种子上测试并工作,以允许特定域使用 http,而无需采取“懒惰”方式并完全打开您的应用程序。
2赞 JMStudios.jrichardson 9/20/2015
如何将其添加到我的 info.plist 中?
8赞 KMC 10/6/2015
好的,我将该条目添加到我的 info.plist 中,但我仍然收到此错误 - “ App Transport Security 已阻止明文 HTTP (http://) 资源加载,因为它不安全。可以通过应用的 Info.plist 文件配置临时异常。
2赞 tpankake 10/14/2016
@RomanShapovalov如果必须使用 IP 地址,请尝试将 .xip.io 添加到 IP 地址的末尾,并将 xip.io 添加到 NSExceptionDomains。请参见 xip.io。我在开发(但不是发布)时直接连接到 IP,这对我来说非常有用。
3赞 Chucky 2/18/2018
直到我意识到我把它放在我的测试项目中错误的 info.plist 中,它才对我有用。确保你把它放在正确的位置!
22赞 Malek Belkahla 9/19/2015 #5

传输安全性在 iOS 9.0 或更高版本上可用。尝试在应用程序中调用 WS 时,可能会收到以下警告:

应用程序传输安全性已阻止明文 HTTP (http://) 资源加载,因为它不安全。可以通过应用的 Info.plist 文件配置临时例外。

将以下内容添加到 Info.plist 将禁用 ATS:

<key>NSAppTransportSecurity</key>
<dict>
     <key>NSAllowsArbitraryLoads</key><true/>
</dict>

评论

1赞 Thiago Arreguy 9/19/2015
NSAllowsArbitraryLoads 必须为 false,如果为 true,则允许所有不安全的连接
0赞 amit gupta 9/22/2015
通过在 plist 中添加所有 Web 服务,除了一个 Web 服务外,一个 Web 服务在 iOS 9 中返回内部服务器错误 (500),但在 iOS8 或更高版本中工作正常
1赞 Vrashabh Irde 9/23/2015
在商店接受吗?
0赞 jww 6/6/2017
非常糟糕的建议;请参阅世界上最危险的代码:在非浏览器软件中验证 SSL 证书。如果这个问题充满了推荐的做事方式,那么“我也是”这样的答案就不需要了。
9赞 Tejinder 9/21/2015 #6

用:

PList Screenshot to understand better

在 plist 文件中添加一个类型为 Dictionary 的新项 NSAppTransportSecurity,然后在 Boolean 类型的字典中添加子项 NSAllowsArbitraryLoads,并将 bool 值设置为 YES这对我有用。

评论

1赞 Thiago Arreguy 9/22/2015
NSAllowsArbitraryLoads 必须为 false,如果为 true,则允许所有不安全的连接
0赞 amit gupta 9/22/2015
通过在 plist 中添加除一个 Web 服务外的所有 Web 服务工作正常,一个 Web 服务在 iOS 9 中返回内部服务器错误 (500),但在 iOS8 或更高版本中工作正常@ThiagoArreguy
0赞 jww 6/6/2017
非常糟糕的建议;请参阅世界上最危险的代码:在非浏览器软件中验证 SSL 证书。如果这个问题充满了推荐的做事方式,那么“我也是”这样的答案就不需要了。
0赞 Tejinder 6/6/2017
我知道这是一个不好的建议,但这只是目前处于开发模式的解决方案。苹果为我们提供了灵活性,如果它那么糟糕,他们不会允许这样做。
121赞 whyceewhite 9/22/2015 #7

对于那些想要了解为什么会发生这种情况的人,除了如何解决它之外,请阅读下文。

随着 iOS 9 的推出,为了提高应用与 Web 服务之间连接的安全性,应用与其 Web 服务之间的安全连接必须遵循最佳做法应用程序传输安全性强制执行最佳做法行为,以便:

  • 防止意外泄露,以及
  • 提供安全的默认行为。

应用传输安全技术说明中所述,在与 Web 服务通信时,应用传输安全现在具有以下要求和行为:

  • 服务器必须至少支持传输层安全性 (TLS) 协议版本 1.2。
  • 连接密码仅限于提供前向保密的密码(请参阅下面的密码列表)。
  • 必须使用 SHA256 或更好的签名哈希算法对证书进行签名,该算法具有 2048 位或更高的 RSA 密钥,或者 256 位或 更大的椭圆曲线 (ECC) 键。
  • 无效的证书会导致硬故障和无连接。

换言之,您的 Web 服务请求应:a.)使用 HTTPS 和 b.)使用具有前向保密功能的 TLS v1.2 进行加密。

但是,正如在其他文章中提到的,您可以通过在应用程序中指定不安全的域来覆盖应用程序传输安全性中的这种新行为。Info.plist


要覆盖,您需要将 > 字典属性添加到 .接下来,将 Web 服务的域添加到字典中。NSAppTransportSecurityNSExceptionDomainsInfo.plistNSExceptionDomains

例如,如果我想绕过主机 www.yourwebservicehost.com 上 Web 服务的应用程序传输安全行为,那么我将执行以下操作:

  1. 在 Xcode 中打开您的 App。

  2. 在 Project Navigator 中找到该文件,然后单击“鼠标右键”,然后选择“打开为源代码>”菜单选项。属性列表文件将显示在右窗格中。Info.plist

  3. 将以下属性块放在主属性字典中(在第一个 )。<dict>


<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>www.example.com</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.1</string>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

如果需要为其他域提供例外,则可以在 下添加另一个字典属性。NSExceptionDomains

要了解有关上面引用的键的更多信息,请阅读此已经提到的技术说明

评论

1赞 helloB 9/23/2015
这在我的 2 个应用程序中有效,但在第三个应用程序中不起作用。有没有人遇到过使用上述修复程序但仍然收到相同错误消息的情况?(是的,我更新了字典以使用我的 API 域,而不是代码中的域)
0赞 YanSte 10/6/2015
最好!Apple 确认此解决方案使用
0赞 jimmont 12/11/2015
这适用于 Cordova/Phonegap/Ionic 应用程序编辑文件,其中包含许多具有不同 TLS/HTTP/HTTPS 组合的服务的例外域。最初使用后进行调整,通过反复试验对规则进行故障排除,以符合准则并提交审批。注意语句部分填充此文件,但目前需要通过直接编辑或通过 XCode 进行调整才能正确获取详细信息。./platforms/ios/<project>/<project>-Info.plistNSAllowsArbitraryLoads=falseNSAllowsArbitraryLoads=trueconfig.xml<access origin=.../>
0赞 jimmont 12/11/2015
此外(在 config.xml 中)集(用于 Cordova/Phonegap/混合应用程序)<access origin="*"/>NSAllowsArbitraryLoads=true
0赞 jww 6/6/2017
为什么设置为 ?你颠覆了 ATS 的目的。另请参阅世界上最危险的代码:在非浏览器软件中验证 SSL 证书。您的软件刚刚上榜。NSExceptionAllowsInsecureHTTPLoadstrue
10赞 Heedoo 9/25/2015 #8

在 2015-09-25 (在 2015-09-18 的 Xcode 更新之后):

我使用了一种非懒惰的方法,但它没有用。以下是我的尝试。

第一

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>www.xxx.yyy.zzz</key>
        <dict>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSTemporaryExceptionMinimumTLSVersion</key>
            <string>TLSv1.1</string>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

第二,

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>www.xxx.yyy.zzz</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.1</string>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

最后,我使用了懒惰的方法:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

这可能有点不安全,但我找不到其他解决方案。

评论

0赞 jww 6/6/2017
为什么设置为 ?你颠覆了 ATS 的目的。另请参阅世界上最危险的代码:在非浏览器软件中验证 SSL 证书。您的软件刚刚上榜。NSAllowsArbitraryLoadstrue
-1赞 Mark DeWald 10/2/2015 #9

正如许多人所指出的那样,这是iOS 9.0附带的功能问题。他们添加了一个名为 App Transport Security 的东西,当它破坏我的应用程序时,我也很生气。

您可以在 .plist 文件中的 NSAppTransportSecurity 字典下使用 NSAllowsArbitraryLoads 键将其包扎为 YES,但最终您需要重新编写构成 URL 的代码以形成 HTTPS:// 前缀。

Apple 在 iOS 9.0 中重写了 NSUrlConnection 类。您可以在 NSURLConnection 中阅读有关它的信息。

否则,您可能需要退出iOS 9.0,直到您有时间实施正确的解决方案。

12赞 ecotax 10/7/2015 #10

弄清楚要使用的设置可以自动执行,如本技术说明所述:

/usr/bin/nscurl --ats-diagnostics --verbose https://your-domain.com

评论

0赞 ecotax 10/7/2015
显然,您确实需要OS X 10.11(El Capitan)。
6赞 Naishta 10/26/2015 #11

可能值得一提的是如何到达那里......

Info.plist 是 Main.storyboard 或 viewController.swift 下面的文件之一。

当您第一次单击它时,它通常是表格格式,因此右键单击文件并“打开为”源代码,然后在末尾添加以下代码,即:

 <key>NSAppTransportSecurity</key><dict><key>NSAllowsArbitraryLoads</key><true/></dict>

复制粘贴上面的代码

 "</dict>
</plist>"

这是在最后。

评论

0赞 jww 6/6/2017
为什么设置为 ?你颠覆了 ATS 的目的。另请参阅世界上最危险的代码:在非浏览器软件中验证 SSL 证书。您的软件刚刚上榜。NSAllowsArbitraryLoadstrue
5赞 MkaysWork 10/28/2015 #12

Xcode 7.1 更新,面临问题 27.10.15:

Info.plist 中的新值是“应用传输安全设置”。 从那里,这本词典应该包含:

  • 允许任意负载 = 是
  • 例外域(在此处插入您的 http 域)
70赞 Vincent 11/6/2015 #13

我不喜欢直接编辑plist。您可以使用 GUI 轻松地将其添加到 plist 中:

  • 单击左侧导航器中的 Info.plist。
  • 现在更改主区域中的数据:

    • 在最后一行添加 +
    • 输入组的名称:应用传输安全设置
    • 右键单击该组,然后选择Add Row
    • 输入“允许任意负载”
    • 将右侧的值设置为“是

Example

评论

0赞 11/20/2015
澄清一下:如果“允许任意负载”为“是”,并且存在“异常域”,则允许的负载仅限于异常域中的负载。这是对的吗?
0赞 Lamour 2/19/2016
如果我想发布应用程序,这是一种安全的方法吗?
0赞 Raptor 1/5/2017
不。通过允许任意加载,您的应用可以自由地连接到任何域。从安全的角度来看,您应该控制和限制应用程序应该连接到哪个域/网站,以避免意外的网络使用。
0赞 Vincent 1/5/2017
大多数应用仅路由到已知服务器。这是由开发人员控制的。所以安全问题是已知的。
0赞 jww 6/6/2017
为什么设置为 ?你颠覆了 ATS 的目的。另请参阅世界上最危险的代码:在非浏览器软件中验证 SSL 证书。您的软件刚刚上榜。NSAllowsArbitraryLoadsYES
857赞 Cerniuk 11/15/2015 #14

以下是直观的设置:

visual settings for NSAllowsArbitraryLoads in info.plist via Xcode GUI

评论

12赞 User 3/29/2016
我没有那个选择。
26赞 Stoph 4/1/2016
如果直接打开 Info.plist,则只需添加 NSAppTransportSecurity 字典,然后在其中创建 NSAllowsArbitraryLoads 项(请参阅下面由 Umar Farooq 编辑的答案)。
3赞 RegularExpression 4/10/2016
同样在这里 - 例外域不适用于 7.3 对我来说。
4赞 jameshfisher 6/23/2016
此选项不存在 - XCode 7.3.1
3赞 Matthew Bellantoni 3/22/2017
来自 @JoshPinter 的信息对我有用 XCode 8。
16赞 Sebastian 11/30/2015 #15

开发实例

下面是一个 plist 的屏幕截图,它保持 ATS 完好无损(=安全),但允许通过 HTTP 而不是 HTTPSlocalhost 建立连接。它适用于 Xcode 7.1.1。

Enter image description here

评论

0赞 milkersarac 1/20/2017
有没有办法使localhost安全,即在react-native中使用HTTPS,这样我们就不必使用默认配置?NSExceptionAllowsInsecureHTTPLoads - YES
29赞 Jayprakash Dubey 3/10/2016 #16

Apple Document 1

Apple Document 2

有两种解决方案:

解决方案 1 :

  1. 在文件中添加一个带有键的字典Info.plistNSAppTransportSecurity'
  2. 在字典中添加另一个带有键的元素'Allow Arbitrary Loads'

Plist结构应如下图所示。

Solution 1

解决方案 2 :

  1. 在文件中添加一个带有键的字典Info.plistNSAppTransportSecurity'
  2. 在字典中添加另一个元素,键为 ”NSExceptionDomains'
  3. 添加键类型为 NSDictionary 的元素'MyDomainName.com'
  4. 添加键 '' 的元素,其类型和值设置为NSIncludesSubdomainsBooleanYES
  5. 添加键 '' 的元素,其类型和值设置为NSTemporaryExceptionAllowsInsecureHTTPLoadsBooleanYES

Plist结构应如下图所示。

Solution 2

解决方案 2 是首选,因为它只允许选定的域,而解决方案 1 允许所有不安全的 HTTP 连接。

评论

0赞 jww 6/6/2017
为什么设置为 ?你颠覆了 ATS 的目的。另请参阅世界上最危险的代码:在非浏览器软件中验证 SSL 证书。您的软件刚刚上榜。NSAllowsArbitraryLoadsYES
0赞 zeusstl 3/21/2016 #17

对于 Cordova,如果要将其添加到ios.json中,请执行以下操作:

"NSAppTransportSecurity": [
   {
      "xml": "<dict><key>NSAllowsArbitraryLoads</key><true /></dict>"
   }
]

它应该在以下部分:

"*-Info.plist": {
   "parents": {
   }
}

评论

0赞 zeusstl 3/21/2016
只是在配置中<access origin=“*” />.xml不起作用。不确定两者是否有必要,但ios.json解决方案为我敲定了交易。
0赞 jww 6/6/2017
为什么设置为 ?你颠覆了 ATS 的目的。另请参阅世界上最危险的代码:在非浏览器软件中验证 SSL 证书。您的软件刚刚上榜。NSAllowsArbitraryLoadstrue
16赞 gnasher729 4/18/2016 #18

根据 Apple 的说法,通常禁用 ATS 会导致应用程序被拒绝,除非您有充分的理由这样做。即便如此,您也应该为可以安全访问的域添加例外。

Apple 有一个出色的工具,可以准确地告诉您要使用哪些设置:在“终端”中,输入

/usr/bin/nscurl --ats-diagnostics --verbose https://www.example.com/whatever

nscurl 会检查这个请求是否失败,然后尝试各种设置,并告诉你到底是哪一个通过,以及该怎么做。例如,对于我访问的某些第三方 URL,此命令告诉我此字典通过:

{
    NSExceptionDomains = {
        "www.example.com" = {
            NSExceptionRequiresForwardSecrecy = false;
        };
    };
}

若要区分你自己的网站和不受你控制的第三方网站,请使用密钥 NSThirdPartyExceptionRequiresForwardSecrecy。

评论

1赞 damithH 1/10/2017
它是在实际测试应用程序之前进行检查的好工具。节省时间。但是要阅读任何资源以了解此命令的输出。
1赞 Chris Prince 6/26/2017
有趣的工具。就我而言,它夸大了事情。它列出了三个键,包括 ,但事实证明不需要一个键。NSExceptionAllowsInsecureHTTPLoads = true;
11赞 ObjectiveTC 9/13/2016 #19

注意:plist 中的例外域应为小写。

示例:您在“设置”->“共享”下将机器命名为“MyAwesomeMacbook”;您的服务器(用于测试目的)在 MyAwesomeMacbook.local:3000 上运行,并且您的应用程序需要向 http://MyAwesomeMacbook.local:3000/files...(您的列表)发送请求,您需要将“MyAwesomeMacbook.local”指定为例外域。

--

您的 info.plist 将包含...

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>myawesomemacbook.local</key>
    <dict>
      <!--Include to allow subdomains-->
      <key>NSIncludesSubdomains</key>
      <true/>
      <!--Include to allow HTTP requests-->
      <key>NSExceptionAllowsInsecureHTTPLoads</key>
      <true/>
    </dict>
  </dict>
</dict>
597赞 Anit Kumar 10/28/2016 #20

如果您使用的是 Xcode 8.0+ 和 Swift 2.2+ 甚至 Objective C:

Enter image description here

如果要允许与任何站点的 HTTP 连接,可以使用以下密钥:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

如果您知道要连接哪些域,请添加:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>example.com</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

评论

35赞 jww 6/6/2017
为什么设置为 ?你颠覆了 ATS 的目的。另请参阅世界上最危险的代码:在非浏览器软件中验证 SSL 证书。您的软件刚刚上榜。NSAllowsArbitraryLoadstrue
8赞 ThinkDigital 7/21/2018
@jww 这就是这篇文章的目的。我需要连接到以播放音频的站点尚未使用 HTTPS,我不想等待。
7赞 Freek Sanders 3/12/2019
这在iOS 10.0 +或MacOS 10.12 +中不起作用,它实际上说允许所有任意加载,除了提到的那些(example.com)。因此,它会做与期望相反的事情。此处应将 NSAllowsArbirtraryLoads 设置为 false。更多信息: Apple 文档
1赞 thibaut noah 7/19/2019
同意,为什么每个人都投赞成票?如果设置了例外域,则使用 NSAllowsArbitraryLoads 是没有意义的。
1赞 mister_giga 1/18/2020
NSAllowsArbitraryLoads 不需要为 true,因此必须将其删除。NSExceptionDomains 足以仅启用与该域的非安全连接。NSAllowsArbitraryLoads = true 将启用与任何域的非安全连接,因此,如果仍然将其设置为 true,则 NSExceptionDomains 是无稽之谈,因为它已经包含所有域
14赞 Gr8Warrior 1/9/2017 #21

转到您的 Info.plist

  1. 右键单击空白区域,然后单击添加行
  2. 将密钥名称写为 NSAppTransportSecurity,在其下
  3. 选择“例外域”,向此添加新项目
  4. 写下您需要访问的域名
  5. 将“域类型”从“字符串”更改为“字典”,添加新项目
  6. NSTemporaryExceptionAllowsInsecureHTTPLoads,这将是一个具有 true 值的布尔值。Look at the picture to follow it correctly

评论

1赞 jww 6/6/2017
为什么设置为 ?你颠覆了 ATS 的目的。另请参阅世界上最危险的代码:在非浏览器软件中验证 SSL 证书。您的软件刚刚上榜。NSAllowsArbitraryLoadstrue
1赞 Oiew 8/14/2017 #22

由于目标站点可能会加载资源(例如 files) 从外部域 .也可以通过将这些外部域添加到中来解决此问题。NSExceptionDomainsjshttpNSExceptionDomains

若要检查无法加载哪些资源,请尝试使用远程调试。这是一个教程:http://geeklearning.io/apache-cordova-and-remote-debugging-on-ios/

5赞 Alekseev Vladimir 10/9/2017 #23

对于那些来到这里试图找到他们的 WKWebView 总是白色并且不加载任何内容的原因的人(完全如此描述,我如何让 WKWebView 在 swift 和 macOS 应用程序中工作):

如果上述所有火箭科学都不适合您,请检查显而易见的:沙盒设置

sandbox settings]

作为 swift 和 cocoa 的新手,但在编程方面非常有经验,我花了大约 20 个小时来找到这个解决方案。几十个时髦的 iOS 教程和苹果主题演讲都没有——没有人提到这个小复选框。

评论

1赞 Brecht Machiels 4/30/2018
哦,我的上帝,非常感谢你!你为我节省了同样的 20 小时搜索时间!
2赞 shim 7/20/2018
在目标的“功能”部分中看不到该部分 (Xcode 9.4.1)
9赞 Faris 1/16/2019 #24

在 swift 4 和 xocde 10 中,将 NSAllowsArbitraryLoads 更改为允许任意负载。所以它将看起来像这样:

<key>App Transport Security Settings</key>
<dict>
     <key>Allow Arbitrary Loads</key><true/>
</dict>
3赞 vrat2801 5/24/2019 #25

默认情况下,iOS 仅允许 HTTPS API。由于 HTTP 不安全,因此必须禁用应用程序传输安全性。有两种方法可以禁用 ATS:-

1. 在项目 info.plist 中添加源代码,并在根标签中添加以下代码。

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

2. 使用项目信息。

在左侧窗格中单击项目上的项目,选择项目作为目标,然后选择“信息”选项卡。您必须按以下结构添加字典。

enter image description here

6赞 Kamani Jasmin 1/24/2020 #26

如何解决?

enter image description here

以下步骤可以修复它。

enter image description here enter image description here enter image description here enter image description here enter image description here

23赞 Mojtaba Hosseini 8/5/2020 #27

⛔️ 不要使用不良做法!

许多答案(包括已接受的答案)都告诉您,通过设置 to (或 )。这是网络请求最危险的设置!它用于测试和临时目的。Allow Arbitrary LoadsYestrue

你可以看到这位 Apple 工程师在 WWDC18 中清楚地说出了这一点,即使是对于 Web 内容,你也试图允许它们!enter image description here


✅ 设置为 !!Allow Arbitrary LoadsNO

您必须始终用于您的网络内容。但是,如果您确实做不到,只需在HTTPSinfo.plist

例如,如果您正在使用并收到该错误,则必须将其更改为(使用 s),因为它完全支持。http://google.comhttps://google.com

但是,如果你不能以某种方式(并且你不能说服后端开发人员支持SSL),请将这个安全的域添加到(而不是使其可用于所有不安全的网络!info.plist)

Expception

3赞 Sanjay Mali #28

**最后!!!已解决的应用传输安全性 **

  1. Follow the follow the screen shot. Do it in Targets info Section.

enter image description here

3赞 Abishek Thangaraj 12/31/2021 #29

我们有两种方法可以克服这个问题。我们需要添加 inSwift 5NSAppTransportSecurityinfo.plist

我给出源代码和图像供参考info.plist

第一个是将 -> 添加到 中。NSAppTransportSecurityNSAllowsArbitraryLoadsinfo.plist

enter image description here

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <false/>
    </dict>
</dict>
</plist>

另一种方法是添加 -> 并添加 URL 的域并启用加载 sub-domains() 和允许不安全的 HTTP 加载(NSAppTransportSecurityNSExceptionDomainsinfo.plistNSIncludesSubdomainsNSExceptionAllowsInsecureHTTPLoads)

enter image description here

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>NSAppTransportSecurity</key>
    <dict>
      <key>NSExceptionDomains</key>
      <dict>
        <key>www.7timer.info</key>
        <dict>
          <key>NSIncludesSubdomains</key>
          <true/>
          <key>NSExceptionAllowsInsecureHTTPLoads</key>
          <true/>
        </dict>
      </dict>
    </dict>
  </dict>
</plist>
0赞 Sajid Hasan 11/1/2023 #30
  1. 打开 info.plist 文件

  2. 添加一个名为 Dictionary 的键。App Transport Security Settings

  3. 添加一个名为 Boolean 的 Subkey,并将其值设置为 YES,如下图所示。Allow Arbitrary Loads

  4. 最后,清理项目(使用 Command+Shift+K)并完成。

image of the solution in info.plist

或者,在代码中:

<plist version="1.0">
<dict>
    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>

    // .....

</dict>

评论

1赞 HangarRash 11/1/2023
请不要发布重复的答案。