我如何加载一个HTTP URL与应用程序传输安全启用在iOS 9?

所以,昨晚发布的iOS新测试版SDK有“应用传输安全”,鼓励开发者使用https而不是http。原则上,这是一个好主意,我已经在我们的登台/生产环境中使用了https。然而,当iOS应用程序连接到我笔记本电脑上运行的web服务时,我在本地开发环境中没有设置https。

从今天早上的一些测试来看,即使您提供http URL, URL加载系统也会决定使用https。有人知道如何禁用这种行为吗——即使只是针对特定的url ?

434849 次浏览

详见Apple的信息。plist参考(感谢@gnasher729)。

你可以在Info.plist中为特定的域添加例外:

<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>testdomain.com</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSExceptionRequiresForwardSecrecy</key>
<true/>
<key>NSExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
<key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
<false/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<true/>
<key>NSThirdPartyExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
<key>NSRequiresCertificateTransparency</key>
<false/>
</dict>
</dict>
</dict>

每个例外域的所有键都是可选的。演讲者没有详细说明任何关键,但我认为它们都是相当明显的。

(来源:2015年全球开发者大会第703场,“隐私和你的应用”, 30:18)

你也可以用一个键忽略所有应用程序传输安全限制,如果你的应用程序有很好的理由这样做:

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

如果你的应用没有一个好的理由,你可能会面临被拒绝的风险:

将NSAllowsArbitraryLoads设置为true将允许它工作,但苹果非常明确地表示,他们打算在没有特定原因的情况下拒绝使用该标志的应用程序。我能想到的使用NSAllowsArbitraryLoads的主要原因是用户创建的内容(链接共享,自定义web浏览器等)。在这种情况下,Apple仍然希望您包含对您所控制的url强制执行ATS的异常。

如果你确实需要访问没有通过TLS 1.2提供的特定url,你需要为这些域编写特定的例外,而不是使用NSAllowsArbitraryLoads设置为yes。你可以在nsurssession WWDC会话中找到更多信息。

请谨慎分享NSAllowsArbitraryLoads解决方案。这不是苹果推荐的修复程序。

- kcharwood(谢谢@marco-tolman)

作为接受的答案已经提供了所需的信息,以及有关使用和禁用应用程序传输安全可以找到更多关于这一点的更多信息。

对于逐域异常,将这些异常添加到Info.plist:

<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>yourserver.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>

但是如果我不知道我需要使用的所有不安全域怎么办? 在Info.plist

中使用下列键
<key>NSAppTransportSecurity</key>
<dict>
<!--Include to allow all connections (DANGER)-->
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>

< a href = " http://ste。vn/2015/06/10/ configuration -app-transport-security-ios-9-osx-10-11/">更多细节你可以从这个链接得到

编译@adurdin和@User给出的答案

添加关注你的信息。plist,将localhost.com更改为您对应的域名,您也可以添加多个域名:

<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSExceptionDomains</key>
<dict>
<key>localhost.com</key>
<dict>
<key>NSIncludesSubdomains</key>
<false/>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<false/>
<key>NSExceptionRequiresForwardSecrecy</key>
<true/>
<key>NSExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
<key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
<false/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<true/>
<key>NSThirdPartyExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
<key>NSRequiresCertificateTransparency</key>
<false/>
</dict>
</dict>
</dict>
</plist>

你的信息。Plist必须是这样的:

enter image description here

如果你只是想禁用本地开发服务器的应用程序传输策略,那么以下解决方案可以很好地工作。它是有用的,当你不能,或它是不切实际的,设置HTTPS(例如,当使用谷歌应用程序引擎开发服务器)。

正如其他人所说,ATP绝对不应该在生产应用中被关闭。

1)使用不同的plist进行调试

复制你的Plist文件和NSAllowsArbitraryLoads。使用这个Plist进行调试。

XCode Debug

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

2)排除本地服务器

或者,您可以使用单个plist文件并排除特定的服务器。但是,看起来你不能排除ip4地址,所以您可能需要使用服务器名(在系统首选项->共享中找到,或在您的本地DNS中配置)。

<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>server.local</key>
<dict/>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
</dict>

上面的配置不适合我。我尝试了很多组合键,这一个工作得很好:

enter image description here

<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>mydomain.com</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
</dict>
</dict>

跟着

我已经解决了在info.plist中添加一些键。 我所遵循的步骤是:

  1. 打开我的Projects info.plist文件

  2. 添加了一个名为NSAppTransportSecurity的Key作为Dictionary

  3. 添加了一个名为NSAllowsArbitraryLoads的子键作为Boolean,并将其值设置为YES,如下图所示。 李enter image description here < / >

清理项目,现在一切都像以前一样运行良好。

Ref 链接

我已经解决为plist文件。

  1. 添加一个NSAppTransportSecurity: Dictionary。
  2. 添加名为“NSAllowsArbitraryLoads”的子键作为布尔值:YES

enter image description here

以下是对我有效的方法:

<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<false/>
<key>NSExceptionDomains</key>
<dict>
<key><!-- your_remote_server.com / localhost --></key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSExceptionRequiresForwardSecrecy</key>
<true/>
</dict>
<!-- add more domain here -->
</dict>
</dict>

我只是想补充这一点来帮助别人,节省一些时间:

如果你正在使用:CFStreamCreatePairWithSocketToHost。确保你的host和你的.plist是一样的,或者如果你有单独的socket域,只需要在那里添加它。

CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)/*from .plist*/, (unsigned int)port, &readStream, &writeStream);

希望这对你有帮助。欢呼。:)