【问题标题】:Get the current full URL for WKWebView获取 WKWebView 的当前完整 URL
【发布时间】:2014-10-13 14:36:03
【问题描述】:

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

webView:didFinishNavigation:

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

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

webViewDidFinishLoad:webView

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

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

我尝试过使用

webView:decidePolicyForNavigationAction:decisionHandler:

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

【问题讨论】:

  • 你不会通过查看webViews 对每个请求的webView:didStartProvisionalNavigation: 之类的请求来使用WKNavigationDelegate 吗? developer.apple.com/library/IOs/documentation/WebKit/Reference/…:
  • WKWebView 没有像 UIWebView 这样的“请求”属性。或者有什么方法可以从 WKNavigation 对象获取请求?
  • 好吧,WKNavigationAction 确实有一个 NSURLRequest 类型的请求属性
  • 它并不总是您可能需要的。进一步阅读讨论,您可以找出原因。我想我已将此问题标记为已回答

标签: wkwebview wknavigationdelegate


【解决方案1】:

您可以通过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)
}

【讨论】:

    【解决方案2】:

    首先,我认为您混淆了NSURLNSURLRequest。第一个可通过webView.URL 轻松访问,它实际上为您提供了已加载内容的完整 URL。假设您说 URL 的地方是指NSURL

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

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

    【讨论】:

    • 非常感谢 Stefan 的帮助,但认为您没有理解我的案例或 WKWebView 课程。 webView.URL 为您提供 - 这是应该反映在用户界面中的 URL。这是不包含路径、查询等的 UI 友好 URL 字符串。完整我的意思不是包含所有部分的 URL,即来自与 Web 视图中加载的网页交互时自动生成的请求的 URL。我找到了一种使用新导航委托协议的方法。 WKWebView 比 UIWebView 好很多,我鼓励你深入了解它
    • 我还是不明白你说的 full URL 是什么意思。我正在打印webView.URL 作为测试,我看到它包含所有位,路径,查询,片段等。我很好奇你缺少什么信息?
    • 还要注意webView.URL与用户界面无关。它不是 UI 友好的字符串,而是一个完整的NSURL 实例,反映了当前在WKWebView 中加载的页面。
    • 我的错!我今天做了一些研究和测试,问题似乎是 WKWebView 没有报告非主机上的加载完成。您可以从导航委托的决定方法中获取请求 URL,但它们重定向到的内容......您必须更深入地使用 URL 协议,或者您可以使用窗口对象的 JavaScript 评估。我的问题的根源是我需要加载 URL 的所有元素,但它只显示诸如 youtube.com 之类的内容。没有手表?v= 等等。
    • 这里有很多关于将NSURLProtocolWKWebView 结合使用的问题。不幸的是,因为网络调用发生在一个单独的沙盒进程中,你不能再使用这个技巧了。如果您需要对 Web 视图发出的请求具有该级别的访问权限,那么您唯一的选择是改用 UIWebView
    【解决方案3】:

    这是 Swift 4 的 Yuichi Kato's answer。它从 WKNavigationDelegatewebView(_:decidePolicyFor:decisionHandler:) 方法中的导航操作的 request 属性中检索完整 URL。

    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
    

    【讨论】:

    • 在 Swift 5 上类似。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    • 2020-11-06
    • 1970-01-01
    • 2019-09-24
    • 1970-01-01
    • 1970-01-01
    • 2016-06-27
    相关资源
    最近更新 更多