如何在iOS 9中启用启用App Transport Security的HTTP URL?

所以,昨天晚上发布的iOS beta SDK已经有了“App Transport Security”,鼓励开发者使用https而不是http。 原则上,这是一个好主意,我已经在分段/生产环境中使用了https。 但是,当iOS应用程序连接到我在笔记本上运行的Web服务时,我没有在本地开发环境中设置https。

从今天上午的一些玩法看来,URL加载系统看起来似乎即使你递交了一个http URL,也决定使用https。 有谁知道如何禁用这种行为 – 即使只是特定的url?

    详细信息请参阅Apple的Info.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> 

    每个例外域的所有密钥都是可选的。 发言者没有详细说明任何关键,但我认为他们都很明显。

    (来源: WWDC 2015会议703,“隐私与您的应用程序” ,30:18)

    如果您的应用有充分的理由这样做,您也可以忽略所有的应用传输安全限制:

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

    如果你的应用没有很好的理由,你可能会被拒绝:

    设置NSAllowsArbitraryLoads为真将允许它工作,但苹果非常清楚,他们打算拒绝使用这个标志的应用程序没有特定的原因。 使用NSAllowsArbitraryLoads我能想到的主要原因是用户创build的内容(链接共享,自定义网页浏览器等)。 在这种情况下,苹果公司仍然希望您包含强制执行A​​TS的例外情况,以控制您所控制的url。

    如果您确实需要访问不通过TLS 1.2提供的特定URL,则需要为这些域编写特定的例外,而不是将NSAllowsArbitraryLoads设置为yes。 您可以在NSURLSesssion WWDC会话中find更多信息。

    请小心共享NSAllowsArbitraryLoads解决scheme。 这不是从苹果推荐的修复程序。

    – kcharwood (谢谢@ marco-tolman)

    正如接受的答案提供了所需的信息,有关使用和禁用App Transport Security的更多信息, 可以在这里find更多信息 。

    对于每个域的例外,将这些添加到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> 

    欲了解更多的细节,你可以从这个链接。

    跟着这个

    我已经通过在info.plist中添加一些键来解决这个问题。 我遵循的步骤是:

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

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

    3. 添加一个名为NSAllowsArbitraryLoads的子项,并将其值设置为YES ,如下图所示。 在这里输入图像描述

    清理项目,现在一切正常运行。

    Ref 链接 。

    我已经解决了作为plist文件。

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

    在这里输入图像描述

    如果您只想禁用本地开发服务器的应用程序传输策略,则以下解决scheme可以正常工作。 如果您无法设置HTTPS(例如,在使用Google App Engine dev服务器时),那么这很有用。

    正如其他人所说,ATP绝对不能closures生产应用程序。

    1)使用不同的plist进行debugging

    复制您的Plist文件和NSAllowsArbitraryLoads。 使用此Plist进行debugging。

    XCode调试

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

    2)排除本地服务器

    或者,您可以使用一个plist文件并排除特定的服务器。 但是, 看起来您不能排除IP 4地址,所以您可能需要使用服务器名称(可在系统预置 – >共享中find,或在本地DNS中configuration)。

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

    上面的configuration对我不起作用。 我尝试了很多键组合,这一个工作正常:

    在这里输入图像描述

     <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> 

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

    将以下内容添加到您的info.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> 

    您的info.plist必须如下所示:

    在这里输入图像描述

    以下是对我有用的东西:

     <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与您在.plisthost相同,或者如果您有独立的套接字域,请将其添加到那里。

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

    希望这是有帮助的。 干杯。 🙂