Получить текущий полный 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