获取 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。
很高兴WKWebView
的URL
属性节省了提取 UI 友好的基本 URL 所需的工作,但我们无法获得完整的 URL,这是一个巨大的损失!
我尝试过使用
webView:decidePolicyForNavigationAction:decisionHandler:
...但是与完成页面加载后 UIWebView
的 request
属性所持有的结果相比,它会为 URL 产生不同的结果。
【问题讨论】:
你不会通过查看webView
s 对每个请求的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】:首先,我认为您混淆了NSURL
和NSURLRequest
。第一个可通过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= 等等。
这里有很多关于将NSURLProtocol
与WKWebView
结合使用的问题。不幸的是,因为网络调用发生在一个单独的沙盒进程中,你不能再使用这个技巧了。如果您需要对 Web 视图发出的请求具有该级别的访问权限,那么您唯一的选择是改用 UIWebView
。【参考方案3】:
这是 Swift 4 的 Yuichi Kato's answer。它从 WKNavigationDelegate
的 webView(_: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的主要内容,如果未能解决你的问题,请参考以下文章
UIPrintInteractionController 总是显示当前的 WKWebView 而不是 iFrame 内容