Capture redirect url in wkwebview in ios Capture redirect url in wkwebview in ios swift swift

Capture redirect url in wkwebview in ios


Use this WKNavigationDelegate method

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

Hope this helps


(This answers the slightly more general question of how to detect a URL redirection in WKWebView, which is the search that lead me to this page.)

Short answer

Use WKNavigationDelegate's webView(_:didReceiveServerRedirectForProvisionalNavigation:) function and examine WKWebView's URL property.

Longer answer

There are a couple of places you could detect a server-side redirect.

On iOS 10.3.3 and iOS 11.0, the sequence of events I observe when loading a URL that gets redirected by the server is:

  1. The WKNavigationDelegate functionwebView(_:decidePolicyFor:decisionHandler:) is called for theoriginal URL request. WKWebView's URL property is set to theoriginal URL.

  2. The WKNavigationDelegate function webView(_:didStartProvisionalNavigation:) is called for theoriginal URL request. WKWebView's URL property is set to theoriginal URL.

  3. The WKWebView's URL property is updated by WebKit to the redirection URL. (You'll only know about this if you are key-valueobserving the property.)

  4. The WKNavigationDelegate function webView(_:decidePolicyFor:decisionHandler:) is called for theredirected URL request. WKWebView's URL property is thenredirection URL.

  5. The WKNavigationDelegate function webView(_:didReceiveServerRedirectForProvisionalNavigation:) iscalled. WKWebView's URL property is theredirection URL.

(Note: On the iOS 11.0 simulator I have seen steps 3 and 4 reversed, with the URL property unchanged in webView(_:decidePolicyFor:decisionHandler:), which actually seems like a sensible ordering, but I haven't observed this on a device.)

It seems like the webView(_:didReceiveServerRedirectForProvisionalNavigation:) is built explicitly for the purpose of detecting redirects so is probably the preferred option, although the redirect could be possibly be inferred at steps 3 or 4 but only if you can be sure that there are no other causes of navigational change.


After trying all the solutions, finally this one works for me using Swift 5 and WKWebView.This solution implements KVO for Swift

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