获取 WKWebView 的当前完整 URL

Posted

技术标签:

【中文标题】获取 WKWebView 的当前完整 URL【英文标题】:Get the current full URL for WKWebView 【发布时间】: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 类型的请求属性 它并不总是您可能需要的。进一步阅读讨论,您可以找出原因。我想我已将此问题标记为已回答 【参考方案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 上类似。

以上是关于获取 WKWebView 的当前完整 URL的主要内容,如果未能解决你的问题,请参考以下文章

WKWebView 设置自定义UserAgent正确姿势

WKWebView 设置自定义UserAgent正确姿势

UIPrintInteractionController 总是显示当前的 WKWebView 而不是 iFrame 内容

如何获取 WKWebView 上指定位置的信息?

滚动视图中的 WKWebView

如何从 WKWebView 启用和获取 cookie?