在ios中的wkwebview中捕获重定向URL

时间:2017-08-10 04:12:05

标签: ios objective-c swift uiwebview wkwebview

如何在使用WKWebView时捕获重定向URL,就像在提交用户名和密码或其他一些数据时网页重定向到另一个页面一样。我需要捕获重定向的URL。 WKNavigationDelegate中是否有任何方法可以覆盖?

6 个答案:

答案 0 :(得分:18)

使用此WKNavigationDelegate方法

public func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Swift.Void)
    {
        if(navigationAction.navigationType == .other)
        {
            if navigationAction.request.url != nil
            {
                //do what you need with url
                //self.delegate?.openURL(url: navigationAction.request.url!)
            }
            decisionHandler(.cancel)
            return
        }
        decisionHandler(.allow)
    }

希望这有帮助

答案 1 :(得分:1)

尝试了所有解决方案后,终于可以使用Swift 5和WKWebView为我工作。此解决方案为Swift实现了KVO

var webView: WKWebView?
var webViewObserver: NSKeyValueObservation?

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    webView = WKWebView(frame: self.view.bounds)
    webViewObserver = webView?.observe(\.url, options: .new, changeHandler: {
        (currentWebView, _) in
        //      Here you go the new path
        currentWebView.url
    })
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    webViewObserver?.invalidate()
}

答案 2 :(得分:1)

Swift 5 Boom

非常简单的方法

func webView(_ webView: WKWebView, didReceiveServerRedirectForProvisionalNavigation navigation: WKNavigation!) {
    if let url = webView.url?.absoluteString{
        print("url = \(url)")
    }
}

答案 3 :(得分:0)

归功于 Sven: https://forums.developer.apple.com/thread/117073

如果您遇到WebView无法打开PDF文件或仅URL不能解析的情况,因为WebView的重定向URL无法通过,则可以使用WKUIDelegate函数{{1} },以捕获失败的呼叫并再次加载请求,如:

webView(_:createWebViewWith:for:windowFeatures:)

}

答案 4 :(得分:0)

对我来说,使用 decidePolicyFor导航委托的方法无效

由于WKNavigationDelegate的方法不起作用

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

仅在重新加载整页时被调用。 为了能够捕获所有WKWebView的请求URL更改,必须在WKWebView的URL属性上放置一个键值观察器。

第一,在viewDidLoad中添加:

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

第二,添加observeValue方法

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        if keyPath == #keyPath(WKWebView.url) {
            // Whenever URL changes, it can be accessed via WKWebView instance
            let url = webView.url
        }
    }

答案 5 :(得分:0)

使用此 WKNavigationDelegate 方法。我从 sourceFrame.request 得到了重定向 url

public func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Swift.Void) {
        let urlString = navigationAction.sourceFrame.request.url?.absoluteString ?? ""
        print("\(urlString)")
        decisionHandler(.allow)
 }