iOS 9 ... WebView是否免除了应用传输安全例外规则(ATS)的限制,以阻止不安全的HTTP主机?

23
在iOS 9中,除非特定的主机名被列入白名单,否则Apple将阻止应用程序使用不安全的HTTP连接。http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/。关于WebView是否可以免除这些规则,还是我们仍然需要将浏览器打开的主机名列入白名单,包括给定页面上的所有链接?我不确定这是我们的责任还是可以免除的。

这可能解释了ATS背后的原因-https://medium.com/@Mrugraj/app-transport-security-b7910c4fc70f - Mrug
4个回答

28

SFSafariViewController可以显示没有NSAppTransportSecurity密钥的HTTP页面。

UIWebViewWKWebView需要上述提到的NSAppTransportSecurity密钥才能显示HTTP页面。


1
你有这方面的来源或实际确认吗?因为这不是@Scooter通过SFSafariViewController获得的经验。 - Ben Guild
我尝试了这个项目(它没有NSAppTransportSecurity密钥)https://github.com/MShahmeer/SFSafariViewController-Test .. 然后将其更改为加载UIWebView和WKWebView。 UI和WK不支持HTTP,但SafariViewController支持。使用Xcode 7.0 beta 3(7A152u)。使用模拟器(还没有iOS 9设备)。 - cannyboy
我有过类似的经历,在这里找到了我的问题的答案:http://stackoverflow.com/questions/32993320/raise-exception-on-app-transport-security/32994542#32994542。即使您将一个域添加为UIWebView中加载的异常(我不能对其他两个进行评论,因为我没有尝试过),如果该域请求其他不安全的源,则它也会在UIWebView内阻止这些请求。 - Manu Kanthan

11

根据苹果的指导,我已在我的应用程序的.plist文件中插入了以下内容:

<key>NSAppTransportSecurity</key>
<dict>
     <!--Include to allow all connections - with and without SSL (DANGEROUS)-->
     <key>NSAllowsArbitraryLoads</key>
     <true/>
</dict>

当我尝试加载我的webView(从HTTPS服务器加载),我会得到以下错误并且它无法加载:

NSURLSession/NSURLConnection HTTP加载失败(kCFStreamErrorDomainSSL,-9813)

看来不仅他们没有豁免权,即使你在.plist中做了正确的添加,它们也无法工作。


1
你有机会尝试过新的“SFSafariViewController”吗?我想知道它是否被豁免了。 - Ben Guild
对我来说仍然无法正常工作。应用程序的编写方式是直接从我的Web服务器下载.pdf文件到UIWebView中显示。Web服务器需要基本身份验证,我之前在应用程序中使用NSURLSession提供了身份验证。但在iOS 9下,某些事情发生了变化,UIWebView不再被授予访问权限。我实现的解决方法是将.pdf文件简单地下载到文档目录中,然后使用本地URL加载UIWebView。它可以正常工作,但我仍然希望知道为什么旧的做法已经停止工作。 - Scooter
好的。不过我不确定如何避免任意加载。我怀疑任何网站都不会完全使用TLS 1.2,这是App Transport Security正在寻找的内容。在我的私人服务器上,我已经配置了Apache仅使用TLS 1.2,但除非我设置任意加载标志,否则仍然会出现问题。总体而言有点令人沮丧。 - Scooter
我遇到了同样的问题,报告在这里:http://stackoverflow.com/questions/31937811/ios-another-error-using-app-transport-security-ats-9813 - ICL1901
1
David,这个链接已经失效了。你能否更新一下它?谢谢! - Scooter
显示剩余3条评论

8

这个问题最初是关于iOS 9的; 然而,根据苹果公司的文档

从iOS 10.0及更高版本开始,支持以下子键:

  • NSAllowsArbitraryLoadsInWebContent
  • ...

使用NSAllowsArbitraryLoadsInWebContent,这样您就不需要为WebView可能加载的每个页面设置白名单。

保留NSAllowsArbitraryLoads以保持与iOS 9的向后兼容性,并在Xcode 8项目Info.plist中启用新设置: Enable ATS in project


0
如果您的应用程序(例如第三方网络浏览器)需要加载任意内容,苹果提供了一种完全禁用ATS的方法,但我认为您最好谨慎使用此功能:
<key>NSAppTransportSecurity</key>
    <dict>
        <!--Include to allow all connections (DANGER)-->
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接