WKWebView。 didStartProvisionalNavigation未调用

时间:2016-11-21 14:25:04

标签: ios swift webkit wkwebview

我在我的应用中使用WKWebView,一切正常,直到用户转到money.cnn.com。对于此网站的主页,一切都很好,但当用户离开主页并转到例如http://money.cnn.com/2016/11/21/news/dubai-trump-golf-course-developer/index.html?iid=hp-toplead-intl或此网站上的任何其他页面时,委托方法didStartProvisionalNavigationdidCommitNavigation不叫。但我需要这些方法来检测导航的开始。 decidePolicyForNavigationAction在一开始被调用,但它被多次调用,我觉得使用这种方法并不是一个完美的解决方案。所以我的问题是:在这种情况下我能做些什么?在那个网站上有什么特别的东西可以使WKWebView调用它的委托方法,在这种情况下可能是一个可靠的解决方案?谢谢

2 个答案:

答案 0 :(得分:2)

我不太了解网站开发,但在我看来,这是money.cnn.com网站的JavaScript问题。似乎网站页面之间的转换和它们的加载是在JavaScript的帮助下进行的。该JavaScript与本机WKWebView处理程序冲突。

但是!您可以在页面开头使用处理程序注入自己的JavaScript。当页面开始打开时,脚本将首先运行。

完整示例代码

import UIKit
import WebKit

class ViewController: UIViewController, WKNavigationDelegate, WKScriptMessageHandler {

    var webView = WKWebView()
    let scriptName = "GetUrl"

    override func viewDidLoad() {
        super.viewDidLoad()

        let contentController = WKUserContentController();
        let script = "webkit.messageHandlers.\(scriptName).postMessage(document.URL)"
        let userScript = WKUserScript(source: script, injectionTime: WKUserScriptInjectionTime.atDocumentStart, forMainFrameOnly: true)
        contentController.addUserScript(userScript)
        contentController.add(self, name: scriptName)

        let config = WKWebViewConfiguration()
        config.userContentController = contentController

        webView = WKWebView(frame:  UIScreen.main.bounds, configuration: config)
        webView.navigationDelegate = self
        view.addSubview(webView)
    }

    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
        if message.name == scriptName {
            if let url = message.body as? String {
                if url.contains("http://money.cnn.com/") {
                    print("!!! \(url)")
                }
            }
        }
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        loadUrl(string: "http://money.cnn.com/2016/11/21/news/dubai-trump-golf-course-developer/index.html?iid=hp-toplead-intl")
    }

    func loadUrl(string: String) {
        if let url = URL(string: string) {
            webView.load(URLRequest(url: url))
        }
    }
}

的Info.plist

添加Info.plist传输安全设置

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

enter image description here

结果

enter image description here

答案 1 :(得分:0)

将委托设置为:

webView.navigationDelegate = self