来自外部源的iframe内容未加载到iOS的本地HTML文件中

时间:2019-04-09 15:37:57

标签: ios swift wkwebview

我在iOS应用程序中快速创建了一个本地HTML文件。将该HTML文件加载到WKWebView中,如下所示:

let url = Bundle(identifier: myIdentifier).url(forResource: "localHtmlFile", withExtension: "html")
let htmlFormatString = try String(contentsOf: url)
loadHTMLString(string: htmlFormatString, baseURL: nil)

HTML页面包含一个iframe,我希望它可以加载外部页面:

<div>Test</div>
<iframe src="https://www.somepage.com"></iframe>

本地HTML文件已成功加载,因为我可以在div中看到Test文本。 iframe也已创建,但为空。如果我使用Safari Developer Tools进行调试,则只有一个空白的html页面,但未加载任何内容。另外,根本不会执行对该网址的网络请求。

但是,如果我使用<script src="https://url-to-some-js">插入外部JavaScript文件,则JS代码将成功加载,因此不会出现网络问题。另外,如果我直接使用webView.load(URLRequest(url: url))加载url,则可以正常工作。仅在iframe中,它不起作用。

如何使iframe成为可在iOS WKWebView中使用的外部资源?这是被iOS完全阻止还是我必须配置其他东西?

2 个答案:

答案 0 :(得分:4)

基于一些谷歌搜索,看来您需要为webView使用委托方法以允许外部站点。具体来说,请通过以下建议的实现来实现webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void)

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {

    guard let requestURL = navigationAction.request.url?.absoluteString else { return }

    if requestURL.contains("somepage.com") {
        decisionHandler(.allow)
    }
    else {
        // You don't need to cancel here, but you can implement your own logic here
        decisionHandler(.cancel)
    }
}

答案 1 :(得分:2)

在具有本地HTML文件和远程iFrame的桌面浏览器上执行此操作会导致一些安全问题,因此,我希望您在此处遇到同样的问题。

您可以将本地内容移动到远程服务器吗?它不必与iframe内容相同,尽管这会使您的生活更轻松。

如果您有很多本地数据,则可以向包含本地数据JSON对象的父页面发送POST请求。