Capture Redirect Url In Wkwebview In Ios
Answer :
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:
The
WKNavigationDelegatefunctionwebView(_:decidePolicyFor:decisionHandler:)is called for the original URL request.WKWebView'sURLproperty is set to the original URL.The
WKNavigationDelegatefunctionwebView(_:didStartProvisionalNavigation:)is called for the original URL request.WKWebView'sURLproperty is set to the original URL.The
WKWebView'sURLproperty is updated by WebKit to the redirection URL. (You'll only know about this if you are key-value observing the property.)The
WKNavigationDelegatefunctionwebView(_:decidePolicyFor:decisionHandler:)is called for the redirected URL request.WKWebView'sURLproperty is then redirection URL.The
WKNavigationDelegatefunctionwebView(_:didReceiveServerRedirectForProvisionalNavigation:)is called.WKWebView'sURLproperty is the redirection 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.
Comments
Post a Comment