根据以下错误消息,我需要在info.plist
中设置什么设置才能启用HTTP模式?
传输安全性阻止了明文HTTP(http://)资源 负载,因为它是不安全的。可以通过配置临时例外 您应用的Info.plist文件。
假设我的域名为example.com
。
答案 0 :(得分:915)
答案 1 :(得分:812)
答案 2 :(得分:701)
查看论坛帖子 Application Transport Security? 。
页面 Configuring App Transport Security Exceptions in iOS 9 and OSX 10.11 。
例如,您可以添加以下特定域:
<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>
info.plist
是一个XML文件,因此您可以将此代码或多或少地放在文件中的任何位置。
答案 3 :(得分:372)
如果您使用的是Xcode 8.0和Swift 3.0或Swift 2.2甚至是Objective C:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSExceptionDomains</key>
<dict>
<key>example.com</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
</dict>
</dict>
答案 4 :(得分:315)
这已经过测试,正在使用iOS 9 GM种子 - 这是允许特定域使用HTTP而不是HTTPS的配置:
<div class="panel-group" id="accordion">
<div class="panel panel-default">
<div class="panel-heading">
<h4 class="panel-title">
<a data-toggle="collapse" data-parent="#accordion" href="#collapseOne"> RC Cars</a>
</h4>
</div>
<div id="collapseOne" class="panel-collapse collapse">
<div class="panel-body">
<ul>
<li><h4 class="text-left"><a href="rc-electric-cars ">RC Electric Cars</a></h4></li>
<li><h4 class="text-left"><a href="/">RC Petrol Cars</a></h4></li>
<li><h4 class="text-left"><a href="/">RC Nitro Cars</a></h4></li>
</ul>
</div>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">
<h4 class="panel-title">
<a data-toggle="collapse" data-parent="#accordion" href="#collapseTwo"> RC Trucks</a>
</h4>
</div>
<div id="collapseTwo" class="panel-collapse collapse">
<div class="panel-body">
<ul>
<li><h4 class="text-left"><a href="rc-electric-cars ">RC Electric Trucks</a></h4></li>
<li><h4 class="text-left"><a href="/">RC Petrol Trucks</a></h4></li>
<li><h4 class="text-left"><a href="/">RC Nitro Trucks</a></h4></li>
</ul>
</div>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">
<h4 class="panel-title">
<a data-toggle="collapse" data-parent="#accordion" href="#collapseThree"> RC Planes</a>
</h4>
</div>
<div id="collapseThree" class="panel-collapse collapse">
<div class="panel-body">
<ul>
<li><h4 class="text-left"><a href="rc-electric-cars ">RC Electric Planes</a></h4></li>
<li><h4 class="text-left"><a href="/">RC Petrol Planes</a></h4></li>
<li><h4 class="text-left"><a href="/">RC Nitro Planes</a></h4></li>
</ul>
</div>
</div>
</div>
<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>
必须为NSAllowsArbitraryLoads
,因为它不允许所有不安全连接,但例外列表允许在没有HTTPS的情况下连接到某些域。< / p>
答案 5 :(得分:140)
这是一个快速的解决方法(但不建议)在plist中添加它:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
这意味着(根据Apple's documentation):
NSAllowsArbitraryLoads
一个布尔值,用于禁用NSExceptionDomains字典中未列出的任何域的App Transport Security。列出的域使用为该域指定的设置。默认值NO需要所有连接的默认App Transport Security行为。
我真的推荐链接:
帮助我理解原因和所有影响。
下面的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>
禁止对所有页面进行任意调用,但PAGE_FOR_WHICH_SETTINGS_YOU_WANT_TO_OVERRIDE
允许该连接使用HTTP协议。
在上面的XML中,您可以添加:
<key>NSIncludesSubdomains</key>
<true/>
如果要为指定地址的子域允许不安全的连接。
最好的方法是阻止所有任意加载(设置为false)并添加例外以仅允许我们知道的地址正常。
2018年更新:
Apple并不建议关闭此功能 - 更多信息可在207 session WWDC 2018中找到,其中包含有关安全性的更多内容
出于历史原因和发展阶段留下原始答案
答案 6 :(得分:114)
对于那些想要了解 为什么 的更多背景信息的人,除了如何解决之外,请阅读以下内容。
随着iOS 9的推出,为了提高应用和Web服务之间连接的安全性,应用与其Web服务之间的安全连接必须遵循最佳实践。 应用程序传输安全性强制执行最佳做法行为:
正如App Transport Security Technote中所述,在与您的网络服务进行通信时,App Transport Security现在具有以下要求和行为:
- 服务器必须至少支持1.2版传输层安全性(TLS)协议。
- 连接密码仅限于提供前向保密的密码(请参阅下面的密码列表。)
- 证书必须使用SHA256或更好的签名哈希算法进行签名,使用2048位或更高的RSA密钥或256位或 更大的椭圆曲线(ECC)密钥。
- 无效的证书会导致硬故障并且无法连接。
换句话说,您的Web服务请求应该:a。)使用 HTTPS 和b。)使用TLS v1.2进行加密,并具有前向保密性。
但是,正如其他帖子中所提到的,您可以通过在应用的Info.plist
中指定不安全的域来覆盖App Transport Security中的这种新行为。
要覆盖,您需要添加NSAppTransportSecurity
&gt;您NSExceptionDomains
的{{1}}字典属性。接下来,您将把您的Web服务的域添加到Info.plist
字典。
例如,如果我想绕过主机 www.yourwebservicehost.com 上的Web服务的App Transport Security行为,那么我会执行以下操作:
在Xcode中打开您的应用。
在Project Navigator中找到NSExceptionDomains
文件,然后单击“右键单击”并选择 Open As &gt; 源代码菜单选项。属性列表文件将显示在右侧窗格中。
将以下属性块放在主属性字典中(在第一个Info.plist
下)。
<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>
下添加另一个字典属性。
要了解有关上述键的更多信息,请阅读this already mentioned technote。
答案 7 :(得分:65)
我不喜欢直接编辑plist。您可以使用GUI轻松地将其添加到plist中:
现在更改主区域中的数据:
Add Row
答案 8 :(得分:25)
有两种解决方案:
解决方案1:
Info.plist
文件中添加一个包含密钥“NSAppTransportSecurity
”'Allow Arbitrary Loads'
Plist
结构应如下图所示。
解决方案2:
Info.plist
文件中添加一个包含密钥“NSAppTransportSecurity
”NSExceptionDomains
”'MyDomainName.com'
添加元素NSIncludesSubdomains
类型的键“Boolean
”添加元素,并将值设置为YES
NSTemporaryExceptionAllowsInsecureHTTPLoads
类型的键“Boolean
”添加元素,并将值设置为YES
Plist
结构应如下图所示。
解决方案2是首选,因为它只允许选定的域,而解决方案1允许所有不安全的HTTP连接。
答案 9 :(得分:20)
iOS 9.0或更高版本提供传输安全性。尝试在应用程序中调用WS时,可能会收到此警告:
Application Transport Security已阻止明文HTTP(http://)资源加载,因为它不安全。可以通过应用程序的Info.plist文件配置临时例外。
将以下内容添加到Info.plist将禁用ATS:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key><true/>
</dict>
答案 10 :(得分:14)
答案 11 :(得分:12)
转到您的Info.plist
答案 12 :(得分:11)
确定要使用的设置可以自动执行,如this technote中所述:
/usr/bin/nscurl --ats-diagnostics --verbose https://your-domain.com
答案 13 :(得分:10)
根据Apple的说法,除非你有充分的理由这样做,否则一般禁用ATS会导致拒绝应用。即使这样,您也应该为可以安全访问的域添加例外。
Apple提供了一个出色的工具,可以准确地告诉您要使用的设置:在终端中输入
/usr/bin/nscurl --ats-diagnostics --verbose https://www.example.com/whatever
并且nscurl将检查此请求是否失败,然后尝试各种设置并告诉您确切的哪个设置通过,以及该怎么做。例如,对于我访问的某些第三方URL,此命令告诉我该字典通过:
{
NSExceptionDomains = {
"www.example.com" = {
NSExceptionRequiresForwardSecrecy = false;
};
};
}
要区分您自己的网站和不受您控制的第三方网站,请使用密钥NSThirdPartyExceptionRequiresForwardSecrecy。
答案 14 :(得分:9)
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>
这可能有点不安全,但我无法找到其他解决方案。
答案 15 :(得分:9)
注意:plist中的异常域应为LOWER-CASE。
示例:您已在Settings-&gt; Sharing下为您的机器命名为“MyAwesomeMacbook”;您的服务器(用于测试目的)在MyAwesomeMacbook.local:3000上运行,您的应用需要向http://MyAwesomeMacbook.local:3000/files发送请求...,您的plist需要指定“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>
答案 16 :(得分:8)
在swift 4和xocde 10中将NSAllowsArbitraryLoads更改为Allow Arbitrary Loads。所以看起来像这样:
<key>App Transport Security Settings</key>
<dict>
<key>Allow Arbitrary Loads</key><true/>
</dict>
答案 17 :(得分:7)
使用:
在类型为字典的plist文件中添加新项 NSAppTransportSecurity ,然后在类型 NSAllowsArbitraryLoads >布尔,并设置bool值 YES 。这对我有用。
答案 18 :(得分:6)
值得一提的是如何到达那里......
Info.plist是Main.storyboard或viewController.swift下面的文件之一。
当你第一次点击时,它通常是表格式,所以右键单击文件并“打开”为源代码,然后在下面添加代码,即:
<key>NSAppTransportSecurity</key><dict><key>NSAllowsArbitraryLoads</key><true/></dict>
复制粘贴上面的代码
"</dict>
</plist>"
最后。
答案 19 :(得分:5)
Xcode 7.1更新,面临问题27.10.15:
Info.plist中的新值是&#34;应用程序传输安全设置&#34;。 从那里,这本词典应该包含:
答案 20 :(得分:3)
对于那些来到这里的人试图找出他们的WKWebView总是白色并且什么都不加载的原因(完全按照how do I get WKWebView to work in swift and for an macOS App所述):
如果上面的所有火箭科学都不适合你,请检查明显的:沙盒设置
对swift和cocoa不熟悉,但在编程方面经验丰富,我花了大约20个小时来找到这个解决方案。没有几十个时髦的iOS教程和苹果主题演讲 - 没有提到这个小复选框。
答案 21 :(得分:3)
答案 22 :(得分:2)
Allow Arbitrary Loads
设置为NO
!!! 您必须始终将HTTPS
用于网络。但是,如果您确实不能这样做,只需向info.plist
例如,如果您使用http://google.com
并收到该错误,则必须必须将其更改为https://google.com
(使用 s )完美支持。
但是,如果您不能以某种方式(并且不能说服后端开发人员支持SSL),只需将此不安全域添加到info.plist
(而不是使其可用于< strong>所有不安全的网络!)
答案 23 :(得分:1)
使用NSExceptionDomains
可能无法同时应用效果,因为目标网站可能会通过js
从外部域加载资源(例如http
个文件)。可以通过将这些外部域添加到NSExceptionDomains
来解决此问题。
要检查无法加载哪些资源,请尝试使用远程调试。这是一个教程:http://geeklearning.io/apache-cordova-and-remote-debugging-on-ios/
答案 24 :(得分:0)
对于Cordova,如果要将其添加到ios.json中,请执行以下操作:
"NSAppTransportSecurity": [
{
"xml": "<dict><key>NSAllowsArbitraryLoads</key><true /></dict>"
}
]
它应该在:
之内"*-Info.plist": {
"parents": {
}
}
答案 25 :(得分:0)
默认情况下,iOS仅允许HTTPS API。由于HTTP不安全,因此您必须禁用应用程序传输安全性。有两种禁用ATS的方法:-
1。在项目info.plist中添加源代码,并在root标记中添加以下代码。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
2。使用项目信息。
在左窗格上的项目上单击项目,选择项目作为目标并选择信息选项卡。您必须在以下结构中添加字典。
答案 26 :(得分:0)
答案 27 :(得分:-3)
许多人都注意到,这是iOS 9.0附带的一个功能问题。他们添加了一个名为App Transport Security的东西,当我破坏我的应用程序时,我也很恼火。
您可以在.plist文件中的NSAppTransportSecurity字典下使用NSAllowsArbitraryLoads键将其绑定为YES,但最终您需要重新编写构成URL的代码以形成HTTPS://前缀。
Apple已在iOS 9.0中重写了NSUrlConnection类。您可以在 NSURLConnection 中阅读相关内容。
否则,在您有时间实施正确的解决方案之前,您可能必须退出iOS 9.0。