在iOS 9中禁用应用内浏览器的ATS?

iOS 9引入了App Transport Security(ATS)来鼓励使用安全连接。

这很好,但如果我的应用程序有一个内置的Web浏览器,用户应该能够用来连接到任何网站? 例如,Facebook应用程序允许故事包含到外部网站的链接。 当用户点击这样一个链接,而不是启动Safari,它启动一个应用程序内的浏览器。

如何在不启用全局NSAllowArbitraryLoads标志的情况下获得相同的行为?

我希望强制执行https使用的所有好处,但是希望在我的内部浏览器中禁用此检查。 在一个理想的世界里,苹果允许我在UIWebView上指定一个属性来允许它加载不安全的URL,而不是全部或者全部。 我无法将每个域名列入白名单,因为我不知道我的用户将加载哪些url。 我正在寻找一个与iOS 8兼容的解决scheme。

在这种情况下,您需要通过将NSAllowsArbitraryLoads设置为true来禁用ATS。 如果您具有可以支持HTTPS的特定URL(例如您在UIWebView之外的应用中使用的服务器或API服务器),则可以创build一个例外,并将NSExceptionsAllowsInsecureHTTPLoads设置为false

而不是启用NSAllowsArbitraryLoads ,更安全的解决scheme是有条件地使用 SFSafariViewController,它允许任意加载。

如果该类存在,然后呈现它,否则,呈现您自己的UIViewController(其中包含一个UIWebView)。

 UIViewController *webBrowser; if ([SFSafariViewController class] != nil) { webBrowser = [[SFSafariViewController alloc] initWithURL:url]; } else { webBrowser = [[ABCWebBrowserController alloc] initWithURL:url]; } [self presentViewController:webBrowser animated:YES completion:nil];