30
votes

Is there a way to get the FULL URL loaded by a WKWebView for every request?

webView:didFinishNavigation:

Works only for mainFrame navigations and does not provide a URL request parameter.

How do I get the FULL URL just like in UIWebViewDelegate's

webViewDidFinishLoad:webView

...which gets invoked after any loading finishes and you can get the full request URL from the webView parameter.

It's nice that WKWebView's URL property saves the work that needs to be done to extract a UI-friendly base URL, but it's a huge loss we can't get the full one!

I have tried using

webView:decidePolicyForNavigationAction:decisionHandler:

...but it produces different results for URLs compared to what a UIWebView's request property holds after finishing the load of a page.

3
Would you not use the WKNavigationDelegate for this by looking at the webViews request for each request in something like webView:didStartProvisionalNavigation:? developer.apple.com/library/IOs/documentation/WebKit/Reference/…:Popeye
WKWebView does not have "request" property like UIWebView. Or is there any way to get the request from the WKNavigation object?i-konov
Well, the WKNavigationAction does have a request property of type NSURLRequestleviathan
It is not always what you might need. Read further on the discussion and you can find out why. I guess I marked this question as answered anywyai-konov

3 Answers

24
votes

You can get URL for a newly requested Webpage by "navigationAction.request.URL" in decidePolicyForNavigationAction delegate method.

func webView(webView: WKWebView, decidePolicyForNavigationAction navigationAction: WKNavigationAction, decisionHandler: (WKNavigationActionPolicy) -> Void) {
   if let urlStr = navigationAction.request.URL?.absoluteString{
      //urlStr is what you want, I guess.
   }
   decisionHandler(.Allow)
}
20
votes

First, I think you are confusing NSURL and NSURLRequest. The first is readily accessibly via webView.URL and it does actually give you the full URL of whatever was loaded. Assuming that where you say URL you mean NSURL.

If that is not what you meant, for example if you wanted to see the redirect chain or the response headers, then I'm afraid the answer is that you cannot get to tht specific information via the WKWebView.

You will have to fall back to UIWebView where you can intercept requests relatively easily and see the full request/response.

10
votes

This is Yuichi Kato's answer for Swift 4. It retrieves the full URL from the request property of the navigation action in the webView(_:decidePolicyFor:decisionHandler:) method of WKNavigationDelegate.

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
    if let urlStr = navigationAction.request.url?.absoluteString {
        //urlStr is what you want
    }

    decisionHandler(.allow)
}

Don't forget to conform your class to WKNavigationDelegate and set your web view's delegate accordingly:

class WebViewController: UIViewController, WKNavigationDelegate

[...]

webView.navigationDelegate = self