6

我使用 WKWebView 加载我的网页。当用户单击网页中的按钮时,我的网页将打开一个自定义架构 URL(例如 asfle://download?media_id=1)。而我使用KVO观察WKWebView的URL属性来获取URL。它在 iOS 9 中运行良好,但在 iOS 10 中不起作用。我无法获取 url。我使用 Xcode 8,swift 2.3。

override func viewDidLoad() {
        super.viewDidLoad()

        webView.addObserver(self, forKeyPath: "URL", options: .New, context: nil)
    }

override func observeValueForKeyPath(keyPath: String?,
                                  ofObject object: AnyObject?,
                                           change: [String : AnyObject]?,
                                                  context: UnsafeMutablePointer<Void>)
    {
        print("url:\(webView.URL)")
    }

在 iOS 9 中,它可以打印 url。但在 iOS 10 中,仅打印网站的 url,当用户触摸网页中的按钮时,不会打印任何内容。

4

3 回答 3

11

你仍然可以观察WKWebViewurl属性,只要确保对返回的观察有一个强引用:

class ViewController: UIViewController {
    var webView: WKWebView!
    var urlObservation: NSKeyValueObservation?

    override func viewDidLoad() {
        super.viewDidLoad()

        // ...Initialize web view.
        webView = WKWebView(frame: view.bounds, configuration: WKWebViewConfiguration())
        webView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
        view.addSubview(webView)

        // Add observation.
        urlObservation = webView.observe(\.url, changeHandler: { (webView, change) in
            NSLog("Web view URL changed to \(webView.url?.absoluteString ?? "Empty")")
        })
    }
}

另外,如果您打算在观察闭包中使用它,请不要忘记捕获self,否则您将获得一个保留周期。weak

于 2017-12-16T15:10:09.233 回答
4

我找到了解决方案。不使用 KVO,而是使用委托来检测打开的 URL。

override func viewDidLoad() {
        super.viewDidLoad()

        webView.navigationDelegate = self
    }

func webView(webView: WKWebView, decidePolicyForNavigationAction navigationAction: WKNavigationAction, decisionHandler: (WKNavigationActionPolicy) -> Void) {
    print("url:\(navigationAction.request.URL)")
    decisionHandler(.Allow)
    }
于 2016-11-02T03:58:31.663 回答
2

我找到了可选的解决方案。我遇到了同样的问题并更改了这一行

        webview.addObserver(self, forKeyPath: #keyPath(WKWebView.estimatedProgress), options:.new, context: nil)
于 2017-02-10T11:44:25.393 回答