30

有没有办法让WKWebView每个请求都加载完整的 URL?

webView:didFinishNavigation:

仅适用于mainFrame导航,不提供 URL 请求参数。

我如何获得完整的 URL,就像在UIWebViewDelegate's

webViewDidFinishLoad:webView

...在任何加载完成后都会调用它,您可以从webView参数中获取完整的请求 URL。

很高兴WKWebView'sURL属性节省了提取 UI 友好的基本 URL 所需的工作,但我们无法获得完整的 URL,这是一个巨大的损失!

我试过使用

webView:decidePolicyForNavigationAction:decisionHandler:

...但是与完成页面加载后UIWebView的属性相比,它会为 URL 产生不同的结果。request

4

3 回答 3

24

您可以通过 decisionPolicyForNavigationAction 委托方法中的“navigationAction.request.URL”获取新请求网页的 URL。

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)
}
于 2016-05-04T10:23:33.447 回答
20

首先,我认为您很困惑NSURL并且NSURLRequest. 第一个很容易通过它访问webView.URL,它实际上为您提供了已加载内容的完整 URL 。假设您所说的URL是指NSURL.

如果这不是您的意思,例如,如果您想查看重定向链或响应标头,那么恐怕答案是您无法通过WKWebView.

您将不得不退回到UIWebView可以相对轻松地拦截请求并查看完整请求/响应的位置。

于 2015-03-12T19:58:31.823 回答
12

这是Yuichi Kato 对 Swift 4 的回答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并相应地设置您的 Web 视图的委托:

class WebViewController: UIViewController, WKNavigationDelegate

[...]

webView.navigationDelegate = self
于 2018-05-15T13:31:33.843 回答