所以,昨晚发布的iOS新测试版SDK有“应用传输安全”,鼓励开发者使用https而不是http。原则上,这是一个好主意,我已经在我们的登台/生产环境中使用了https。然而,当iOS应用程序连接到我笔记本电脑上运行的web服务时,我在本地开发环境中没有设置https。
从今天早上的一些测试来看,即使您提供http URL, URL加载系统也会决定使用https。有人知道如何禁用这种行为吗——即使只是针对特定的url ?
所以,昨晚发布的iOS新测试版SDK有“应用传输安全”,鼓励开发者使用https而不是http。原则上,这是一个好主意,我已经在我们的登台/生产环境中使用了https。然而,当iOS应用程序连接到我笔记本电脑上运行的web服务时,我在本地开发环境中没有设置https。
从今天早上的一些测试来看,即使您提供http URL, URL加载系统也会决定使用https。有人知道如何禁用这种行为吗——即使只是针对特定的url ?
请看苹果的信息。请参考完整的细节(感谢@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>
如果你的应用没有一个好的理由,你可能会面临被拒绝的风险:
Setting NSAllowsArbitraryLoads to true will allow it to work, but Apple was very clear in that they intend to reject apps who use this flag without a specific reason. The main reason to use NSAllowsArbitraryLoads I can think of would be user created content (link sharing, custom web browser, etc). And in this case, Apple still expects you to include exceptions that enforce the ATS for the URLs you are in control of. If you do need access to specific URLs that are not served over TLS 1.2, you need to write specific exceptions for those domains, not use NSAllowsArbitraryLoads set to yes. You can find more info in the NSURLSesssion WWDC session. Please be careful in sharing the NSAllowsArbitraryLoads solution. It is not the recommended fix from Apple.
- 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>
欲了解更多细节,请点击此链接。
编译@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必须是这样的:
如果你只是想禁用本地开发服务器的应用程序传输策略,那么以下解决方案可以很好地工作。它是有用的,当你不能,或它是不切实际的,设置HTTPS(例如,当使用谷歌应用程序引擎开发服务器)。
正如其他人所说,ATP绝对不应该在生产应用中被关闭。
1)使用不同的plist进行调试
复制你的Plist文件和NSAllowsArbitraryLoads。使用这个Plist进行调试。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
2)排除本地服务器
或者,您可以使用单个plist文件并排除特定的服务器。然而,它看起来不像你可以排除IP 4地址,所以你可能需要使用服务器名(在系统首选项->共享中找到,或在您的本地DNS中配置)。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>server.local</key>
<dict/>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
</dict>
上面的配置不适合我。我尝试了很多组合键,这一个工作得很好:
<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中添加了一些键来解决它。 我遵循的步骤是:
打开我的项目信息。plist文件 添加了一个名为NSAppTransportSecurity的Key作为字典。 添加了一个名为NSAllowsArbitraryLoads的子键作为布尔值,并将其值设置为YES,如下图所示。
清理项目,现在一切都像以前一样运行良好。
参考链接。
我已经解决为plist文件。
添加一个NSAppTransportSecurity: Dictionary。 添加名为“NSAllowsArbitraryLoads”的子键作为布尔值:YES
以下是对我有效的方法:
<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。确保你的主机与你的。plist中的主机相同,或者如果你有单独的套接字域,就把它添加到那里。
CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)/*from .plist*/, (unsigned int)port, &readStream, &writeStream);
希望这对你有帮助。欢呼。:)