Получить текущий полный URL для WKWebView

Есть ли способ получить ПОЛНЫЙ URL, загруженный WKWebView для каждого запроса?

webView:didFinishNavigation:

Работает только для навигации по mainFrame и не предоставляет параметр запроса URL.

Как получить полный URL-адрес, как в UIWebViewDelegate?

webViewDidFinishLoad:webView

... который вызывается после завершения любой загрузки, и вы можете получить полный URL-адрес запроса из параметра webView.

Приятно, что WKWebView URL WKWebView сохраняет работу, которая должна быть выполнена для извлечения удобного для пользователя пользовательского URL-адреса, но это огромная потеря, которую мы не можем получить полностью!

Я попытался использовать

webView:decidePolicyForNavigationAction:decisionHandler:

... но он приводит к разным результатам для URL-адресов по сравнению с тем, что сохраняет свойство request UIWebView после завершения загрузки страницы.

Ответ 1

Во-первых, я думаю, вы путаете NSURL и NSURLRequest. Первый из них легко доступен через webView.URL, и он действительно дает вам полный URL-адрес загруженного. Предполагая, что, где вы говорите, вы имеете в виду NSURL.

Если это не то, что вы имели в виду, например, если вы хотели видеть цепочку перенаправления или заголовки ответов, то я боюсь, что ответ заключается в том, что вы не можете получить конкретную информацию через WKWebView.

Вам придется вернуться к UIWebView, где вы можете легко перехватывать запросы и видеть полный запрос/ответ.

Ответ 2

Вы можете получить URL-адрес для новой запрашиваемой веб-страницы с помощью функции "navigationAction.request.URL" в решении delegateForNavigationAction.

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

Ответ 3

Это ответ Yuichi Kato для Swift 4. Он извлекает полный URL-адрес из свойства request действия навигации в webView(_:decidePolicyFor:decisionHandler:) 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)
}

Не забудьте согласовать свой класс с WKNavigationDelegate и соответствующим образом настроить делегат веб-представления:

class WebViewController: UIViewController, WKNavigationDelegate

[...]

webView.navigationDelegate = self