iOS9不会从安全页面加载不安全的资源(SSL / HTTPS)

时间:2015-09-08 11:40:05

标签: ios http ssl uiwebview ios9

我正在尝试使用https:// URL将页面加载到iOS9上的UIWebView中。加载的页面包括CSS和来自不安全服务器的图像。

E.g。页面已加载: https ://www.example.com/ ,其中包含样式表 http ://www.example.com /style.css 和图片 http ://www.example.com/image.jpg

如果原始页面是通过不安全连接(常规http)加载的,那么一切正常。 iOS8上的所有内容都可以通过HTTPS和HTTP工作。

我确实在应用程序PLIST文件中将 NSAppTransportSecurity 设置为 NSAllowsArbitraryLoads

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

虽然通过HTTPS加载页面时,图像加载正常,但CSS文件不加载。似乎 UIWebView 阻止从安全页面加载不安全的资源。

是否有任何 UIWebView 的设置允许通过不安全的连接加载CSS?

6 个答案:

答案 0 :(得分:17)

这与ATS无关。 WebKit强制执行混合内容策略,当通过https提供主机页面时,该策略禁止访问某些“活动”内容(JS,CSS等),而不是通过不安全的连接加载。

如果您在检查器中检查您的页面,您将在错误面板中看到此报告。

跟进:您无法关闭混合内容阻止功能。允许不安全的CSS或JS会将整个页面的安全性降低到安全性最低的资源的安全性。如果你必须通过http加载css / js的解决方案是通过http加载整个页面。这样,用户看到的UI正确反映了内容的安全性。

答案 1 :(得分:12)

在info.plist中,您需要添加以下App Transport Security密钥:

NSAppTransportSecurity                                      Dictionary
    NSAllowsArbitraryLoads                                  Boolean       YES
    NSExceptionDomains                                      Dictionary    
        **YOUR-DOMAIN-HERE**                                Dictionary
            NSExceptionAllowsInsecureHTTPLoads              Boolean       YES
            NSIncludesSubdomains                            Boolean       YES
            NSThirdPartyExceptionAllowsInsecureHTTPLoads    Boolean       YES

希望这对你有用。

答案 2 :(得分:5)

在iOS9版本中修订了

App Transport Security 。现在,您的应用程序可以安全地从不安全的连接。 iOS强制进行安全连接。在你的情况下这可能是冲突。

来自 Apple documentation

  

如果您的应用需要向不安全的域发出请求,则必须在应用的Info.plist文件中指定此域

所以我认为这会在为网页加载.css文件时出现问题。

请尝试在info.plist中指定您的域名并检查是否已加载.css个文件。

修改

Spotlight:您需要在info.plist中添加更多密钥。

查看此密钥NSThirdPartyExceptionAllowsInsecureHTTPLoads,这允许服务域不受开发人员控制,并通过传递不安全资源向传输层添加例外。

App Transport Security 添加密钥的结构如下:

enter image description here

有关所有按键的详细信息和说明,请查看此注释 - App Transport Security Technote

答案 3 :(得分:0)

On Xcode 8.3.3(8E3004b)

已更改为

Allow Arbitrary Loads in Web Content&gt; YES&gt; DefaultControllerComponents

enter image description here

答案 4 :(得分:0)

下面的过程使我可以在WKWebView中打开不安全的内容。

  1. 首先,我在信息的 App Transport Security Settings 词典中添加了允许Web内容中的任意负载=是允许任意负载中的YES 。 plist。 enter image description here
  2. 我在wkwebview委托方法下面添加了

    func webView(_ webView:WKWebView,didReceive挑战:URLAuthenticationChallenge,complementHandler:@转义(URLSession.AuthChallengeDisposition,URLCredential?)->无效){     completeHandler(.useCredential,URLCredential(trust:Challenge.protectionSpace.serverTrust!)) }

    对于第二步,不要忘记将代理注册为:

    覆盖func viewDidLoad(){ super.viewDidLoad() self.webView.navigationDelegate =自我 }

答案 5 :(得分:-1)

我使用webkit工具,但是我无法打开ssl不允许的链接(某些https链接),并且它通过此代码在swift4上工作(您必须先声明委托)

override func viewDidLoad() {
    super.viewDidLoad()

    let url = URL(string: currentAttach.fileUrl!)
    let req = URLRequest(url:url!)
    self.webView!.load(req)
    self.webView.navigationDelegate = self

    }
}

extension ViewController: WKNavigationDelegate{

    //MARK:- WKNavigationDelegate
    //For Allow SSL https
    func webView(_ webView: WKWebView, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
        completionHandler(.useCredential, URLCredential(trust: challenge.protectionSpace.serverTrust!))
    }

    func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) {
        print(error.localizedDescription)
    }

    func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
        print("Strat to load")
        startLoading()
    }

    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        print("finish to load")
        stopLoading()
    }

}