使用KVO观察WKWebView的URL属性在iOS 10中不起作用

我使用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) { print("url:\(webView.URL)") } 

在iOS 9中,它可以打印url。 但是在iOS 10中只有网站的url被打印出来,当用户触摸网页上的按钮时,没有任何内容被打印出来。

您仍然可以观察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 ,否则您将获得保留周期。

我找到了解决方案。 而不是使用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) } 

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

  webview.addObserver(self, forKeyPath: #keyPath(WKWebView.estimatedProgress), options:.new, context: nil)