获取WKWebView的当前完整URL

i-k*_*nov 21 wkwebview wknavigationdelegate

有没有办法让WKWebView每个请求加载一个FULL URL ?

webView:didFinishNavigation:
Run Code Online (Sandbox Code Playgroud)

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

如何获得完整的URL只是喜欢UIWebViewDelegate

webViewDidFinishLoad:webView
Run Code Online (Sandbox Code Playgroud)

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

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

我试过用

webView:decidePolicyForNavigationAction:decisionHandler:
Run Code Online (Sandbox Code Playgroud)

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

Yui*_*ato 17

您可以通过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)
}
Run Code Online (Sandbox Code Playgroud)


Ste*_*ntz 14

首先,我认为你是混乱NSURLNSURLRequest.第一个是可以随时访问的webView.URL,它确实为您提供了所有加载的完整URL.假设你说URL的意思NSURL.

如果这不是你的意思,例如,如果你想看到重定向链或响应标题,那么我担心的答案是你无法通过它获得具体的信息WKWebView.

您将不得不回到UIWebView可以相对容易地拦截请求的位置并查看完整的请求/响应.

  • 好吧,我的错!我今天做了一些研究和测试,问题似乎是 WKWebView 没有报告非主框架上的加载完成。您可以从导航委托的决定方法中获取请求 URL,但它们重定向到的内容...您必须更深入地了解 URL 协议,或者您可以使用 window 对象的 JavaScript 评估。我的问题的根源是我需要加载的 URL 的所有元素,但它只显示像 youtube.com 这样的东西。没有手表?v=等等。 (2认同)

Tam*_*gel 7

这是Yuichi Kato对Swift 4 的回答.它从方法中request的导航动作的属性中检索完整的URL .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)
}
Run Code Online (Sandbox Code Playgroud)

不要忘记将您的班级WKNavigationDelegate与您的班级相符并相应地设置您的Web视图的委托:

class WebViewController: UIViewController, WKNavigationDelegate

[...]

webView.navigationDelegate = self
Run Code Online (Sandbox Code Playgroud)