info.plist
根据以下错误消息,我需要进行什么设置才能启用HTTP模式?
传输安全性阻止了明文HTTP(http://)资源的加载,因为它不安全。可以通过应用程序的Info.plist文件配置临时异常。
假设我的域名是example.com
。
Allow arbitary loads
)。不久,这将是不可能的,因为苹果需要ATS (本来年底-截止日期已延长) - developer.apple.com/news/?id=12212016b
info.plist
根据以下错误消息,我需要进行什么设置才能启用HTTP模式?
传输安全性阻止了明文HTTP(http://)资源的加载,因为它不安全。可以通过应用程序的Info.plist文件配置临时异常。
假设我的域名是example.com
。
Allow arbitary loads
)。不久,这将是不可能的,因为苹果需要ATS (本来年底-截止日期已延长) - developer.apple.com/news/?id=12212016b
Answers:
如果您使用的是Xcode 8.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>
请参阅论坛中的应用程序传输安全性?。
同样是在iOS 9和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文件,因此您可以将此代码或多或少地放置在文件内的任何位置。
这已经过测试,并且正在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>
NSAllowsArbitraryLoads
必须为false
,因为它禁止所有不安全的连接,但是例外列表允许连接到某些没有HTTPS的域。
这是一个快速的解决方法(但不推荐),可以将其添加到plist中:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
这意味着(根据Apple的文档):
NSAllowsArbitraryLoads
一个布尔值,用于为未在NSExceptionDomains词典中列出的任何域禁用应用程序传输安全性。列出的域使用为该域指定的设置。默认值为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>
禁止对所有页面进行任意调用,但是for PAGE_FOR_WHICH_SETTINGS_YOU_WANT_TO_OVERRIDE
允许连接使用HTTP协议。
您可以在上面的XML中添加:
<key>NSIncludesSubdomains</key>
<true/>
如果要允许指定地址的子域的不安全连接。
最好的方法是阻止所有任意负载(设置为false)并添加例外,以仅允许我们知道的地址。
2018更新:
苹果不建议您关闭此功能-更多信息可以在207届WWDC 2018中找到,并在安全方面进行了更多说明
由于历史原因和发展阶段而留下原始答案
NSAllowsArbitraryLoads
必须是false
<key>NSIncludesSubdomains</key> <true/>
?每个设置都必须被包围<dict>
吗?您如何编辑该死的plist文件?格式是什么?:D谢谢。
对于那些想要更多了解为什么发生这种情况的人,除了如何解决它之外,请阅读以下内容。
随着iOS 9的引入,为了提高应用程序和Web服务之间的连接安全性,应用程序及其Web服务之间的安全连接必须遵循最佳实践。最佳实践行为由App Transport Security强制执行以:
如App Transport Security技术说明中所述,在与Web服务通信时,App Transport Security现在具有以下要求和行为:
- 服务器必须至少支持传输层安全性(TLS)协议版本1.2。
- 连接密码仅限于提供前向保密性的密码(请参阅下面的密码列表)。
- 证书必须使用SHA256或更好的签名哈希算法进行签名,并使用2048位或更高的RSA密钥或256位或更高的椭圆曲线(ECC)密钥。
- 无效的证书会导致严重故障并且无法连接。
换句话说,您的Web服务请求应:a。)使用HTTPS,b。)使用具有向前保密性的TLS v1.2进行加密。
但是,如其他文章所述,您可以通过在应用程序的中指定不安全的域来覆盖App Transport Security中的此新行为Info.plist
。
要覆盖,您需要将NSAppTransportSecurity
> NSExceptionDomains
字典属性添加到中Info.plist
。接下来,您将Web服务的域添加到NSExceptionDomains
字典中。
例如,如果我要绕过主机www.yourwebservicehost.com上的Web服务的“应用程序传输安全性”行为,则可以执行以下操作:
在Xcode中打开您的应用。
Info.plist
在Project Navigator中找到文件,然后单击“鼠标右键”,然后选择“ 打开方式 > 源代码”菜单选项。属性列表文件将出现在右窗格中。
将以下属性块放入主属性字典中(在第一个之下<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
。
要查找有关上述键的更多信息,请阅读已经提到的technote。
./platforms/ios/<project>/<project>-Info.plist
,该文件具有NSAllowsArbitraryLoads=false
多个TLS / HTTP / HTTPS组合服务的例外域。最初使用,NSAllowsArbitraryLoads=true
然后进行调整,通过反复试验对规则进行故障排除,以符合准则并提交批准。注意config.xml
<access origin=.../>
语句部分填充了此文件,但是当前需要通过直接编辑或通过XCode进行调整以使细节正确。
<access origin="*"/>
(在config.xml中)设置NSAllowsArbitraryLoads=true
(针对Cordova / Phonegap / hybrid应用程序
我不喜欢直接编辑plist。您可以使用GUI轻松将其添加到plist中:
现在,在主要区域中更改数据:
Add Row
有两种解决方案:
解决方案1:
Info.plist
文件中添加键为' NSAppTransportSecurity
' 的字典'Allow Arbitrary Loads'
Plist
结构应如下图所示。
解决方案2:
Info.plist
文件中添加键为' NSAppTransportSecurity
' 的字典NSExceptionDomains
' 在字典中添加另一个元素'MyDomainName.com'
NSDictionary类型的键添加元素NSIncludesSubdomains
的类型Boolean
和值设置为YES
NSTemporaryExceptionAllowsInsecureHTTPLoads
的类型Boolean
和值设置为YES
Plist
结构应如下图所示。
首选解决方案2,因为它仅允许选择的域,而解决方案1允许所有不安全的HTTP连接。
传输安全性在iOS 9.0或更高版本上可用。尝试在应用程序内调用WS时,可能会出现以下警告:
由于应用程序传输安全性不安全,它阻止了明文HTTP(http://)资源加载。可以通过应用程序的Info.plist文件配置临时异常。
将以下内容添加到您的Info.plist中将禁用ATS:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key><true/>
</dict>
NSExceptionAllowsInsecureHTTPLoads - YES
配置?
根据苹果公司的说法,除非您有充分的理由,否则通常禁用ATS会导致应用程序被拒绝。即使这样,您也应该为可以安全访问的域添加例外。
Apple有一个出色的工具,可以告诉您要使用的确切设置:在“终端”中,输入
/usr/bin/nscurl --ats-diagnostics --verbose https://www.example.com/whatever
然后nscurl将检查此请求是否失败,然后尝试各种设置,并确切告诉您哪个请求通过了,该怎么做。例如,对于我访问的某些第三方URL,此命令告诉我该词典通过了:
{
NSExceptionDomains = {
"www.example.com" = {
NSExceptionRequiresForwardSecrecy = false;
};
};
}
要区分您自己的站点和不受控制的第三方站点,请使用例如密钥NSThirdPartyExceptionRequiresForwardSecrecy。
NSExceptionAllowsInsecureHTTPLoads = true;
,但事实证明并不需要。
如本技术说明所述,找出要使用的设置可以自动执行:
/usr/bin/nscurl --ats-diagnostics --verbose https://your-domain.com
注意:您的plist中的例外域应为小写。
示例:您在“设置”->“共享”下将计算机命名为“ MyAwesomeMacbook”;您的服务器(出于测试目的)在MyAwesomeMacbook.local:3000上运行,并且您的应用需要向http://MyAwesomeMacbook.local:3000 / files发送请求...,您的plist中需要指定“ myawesomemacbook”。本地”作为例外域。
-
您的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>
采用:
在类型为Dictionary的plist文件中添加一个新项NSAppTransportSecurity,然后在类型为Boolean的字典中添加子项NSAllowsArbitraryLoads,并设置bool值为YES。这对我有用。
在2015-09-25(Xcode在2015-09-18更新之后):
我使用了一种非惰性方法,但是没有用。以下是我的尝试。
第一,
<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>
可能有些不安全,但是我找不到其他解决方案。
也许值得一提的是如何到达那里...
Info.plist是Main.storyboard或viewController.swift下的文件之一。
第一次单击时,它通常采用表格格式,因此,右键单击该文件并“打开为”源代码,然后在末尾添加以下代码,即:
<key>NSAppTransportSecurity</key><dict><key>NSAllowsArbitraryLoads</key><true/></dict>
复制粘贴上面的代码
"</dict>
</plist>"
到最后。
对于那些来这里寻找WKWebView始终为白色且不加载任何内容的原因的人(正是如此处所述,如何使WKWebView快速运行并用于macOS App):
如果以上所有火箭技术都不适合您,请检查以下内容:沙箱设置
我是Swift和Cocoa的新手,但是在编程方面经验丰富,我花了大约20个小时来找到这种解决方案。数十个时髦的iOS教程和Apple主题演讲中都没有-没有提及这个小复选框。
默认情况下,iOS仅允许HTTPS API。由于HTTP不安全,因此您必须禁用应用程序传输安全性。有两种禁用ATS的方法:-
1.在项目info.plist中添加源代码,并在root标记中添加以下代码。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
2.使用项目信息。
在左窗格的项目上单击项目,选择项目作为目标并选择信息选项卡。您必须在以下结构中添加字典。
NSExceptionDomains
由于目标站点可能会通过使用js
从外部域加载资源(例如文件),因此可能无法同时应用效果http
。也可以通过添加这些外部域来解决NSExceptionDomains
。
要检查不能加载哪些资源,请尝试使用远程调试。这是一个教程:http : //geeklearning.io/apache-cordova-and-remote-debugging-on-ios/
就像许多人指出的那样,这是iOS 9.0附带的功能问题。他们添加了一个称为“应用程序传输安全性”的东西,当它破坏了我的应用程序时,我也很生气。
您可以使用.plist文件中NSAppTransportSecurity词典下的NSAllowsArbitraryLoads键(是)将其包扎,但是最终您将需要重新编写形成URL的代码以形成HTTPS://前缀。
Apple已在iOS 9.0中重写了NSUrlConnection类。您可以在NSURLConnection中阅读有关它的信息。
否则,您可能必须退出iOS 9.0,直到您有时间实施正确的解决方案。