因此,昨晚发布的iOS测试版SDK新增了"App Transport Security",鼓励开发者使用https而不是Http.原则上,这是一个很好的 idea ,而且我已经在我们的试运行/生产环境中使用了https.但是,当iOS应用程序连接到我在笔记本电脑上运行的Web服务时,我没有在本地开发环境中设置https.
从今天早上的一些情况来看,URL加载系统似乎会决定使用https,即使您给它一个http URL.有没有人知道如何禁用此行为--即使只针对特定的URL?
因此,昨晚发布的iOS测试版SDK新增了"App Transport Security",鼓励开发者使用https而不是Http.原则上,这是一个很好的 idea ,而且我已经在我们的试运行/生产环境中使用了https.但是,当iOS应用程序连接到我在笔记本电脑上运行的Web服务时,我没有在本地开发环境中设置https.
从今天早上的一些情况来看,URL加载系统似乎会决定使用https,即使您给它一个http URL.有没有人知道如何禁用此行为--即使只针对特定的URL?
有关详细信息,请参见Apple's Info.plist reference(感谢@gnasher729).
您可以在信息中为特定域添加例外.普利斯特:
<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 session 703, “Privacy and Your App”-30:18)
如果你的应用有充分的理由这样做,你也可以用一个密钥忽略所有应用传输安全限制:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
如果你的应用程序没有很好的理由,你可能会面临被拒绝的风险:
将NSAllowsAriraryLoads设置为true将允许它工作,但苹果非常明确地表示,他们打算拒绝没有特定原因使用此标志的应用程序.我能想到的使用NSAllowsAriraryLoads的主要原因是用户创建的内容(链接共享、自定义Web浏览器等).在这种情况下,Apple仍然希望您包含对您控制的URL执行ATS的例外.
如果您确实需要访问未通过TLS 1.2提供的特定URL,则需要为这些域编写特定的异常,而不是使用NSAllowsArbitraryLoads设置为yes.您可以在NSURLSession WWDC会话中找到更多信息.
请小心分享NSAllowsArbitraryLoads解决方案.这不是苹果推荐的解决方案.
-kcharwood(谢谢@Marco-Tolman)