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

Есть ли способ получить полный URL-адрес, загруженный WKWebView за каждый запрос?

webView:didFinishNavigation:

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

Как я могу получить полный URL-адрес, как в UIWebViewDelegate"s

webViewDidFinishLoad:webView

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

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

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

webView:decidePolicyForNavigationAction:decisionHandler:

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

3 ответа

Решение

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

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

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

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

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

Это ответ Юичи Като на 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
Другие вопросы по тегам