using KVO to observe WKWebView's URL property not work in iOS 10

若如初见. 提交于 2019-12-07 15:26:32

问题


I use WKWebView to load my webpage. When user click a button in webpage, my webpage will open a custom schema URL (e.g. asfle://download?media_id=1). And I use KVO to observe WKWebView's URL property to get the URL. It works well in iOS 9, but it doesn't work in iOS 10. I can't get the url. I use 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)")
    }

In iOS 9, it can print url. But in iOS 10 only the website's url get printed, when user touch the button in webpage, nothing get printed.


回答1:


You can still observe WKWebView's url property, just be sure to hold a strong reference to the returned observation:

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")")
        })
    }
}

Also, don't forget to capture self as weak in observation closure if you plan to use it there, as otherwise you will get a retain cycle.




回答2:


I found the solution. Instead of using KVO, use delegate to detect opening 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)
    }



回答3:


I found the optional solution.I have get same problem and change this line

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


来源:https://stackoverflow.com/questions/40371573/using-kvo-to-observe-wkwebviews-url-property-not-work-in-ios-10

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!