在使用WKWebView时,如何捕获重定向url,就像网页在提交用户名、密码或其他数据时重定向到另一个页面一样。我需要捕获重定向的url。WKNavigationDelegate中有什么方法可以重写吗?
发布于 2017-08-10 04:14:14
使用此WKNavigationDelegate
方法
public func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Swift.Void) {
if(navigationAction.navigationType == .other) {
if let redirectedUrl = navigationAction.request.url {
//do what you need with url
//self.delegate?.openURL(url: redirectedUrl)
}
decisionHandler(.cancel)
return
}
decisionHandler(.allow)
}
希望这能有所帮助
发布于 2017-09-22 01:11:25
(这回答了一个稍微笼统一些的问题,即如何在WKWebView中检测URL重定向,这是将我带到这个页面的搜索。)
短答案
使用WKNavigationDelegate
的webView(_:didReceiveServerRedirectForProvisionalNavigation:)
函数,检查WKWebView
的URL
属性。
更长的答案
有几个地方可以检测到服务器端重定向。
在iOS 10.3.3和iOS 11.0上,我在加载服务器重定向的URL时观察到的事件顺序是:
WKNavigationDelegate
请求,调用webView(_:decidePolicyFor:decisionHandler:)
函数。WKWebView
的URL
属性设置为原始URL。WKNavigationDelegate
请求,调用webView(_:didStartProvisionalNavigation:)
函数。WKWebView
的URL
属性设置为原始URL。WKWebView
的URL
属性由WebKit更新为重定向URL。(只有当您是观察该属性的键值时,您才会知道这一点。)webView(_:decidePolicyFor:decisionHandler:)
请求调用webView(_:decidePolicyFor:decisionHandler:)
函数。然后WKWebView
的URL
属性是重定向URL。WKNavigationDelegate
函数webView(_:didReceiveServerRedirectForProvisionalNavigation:)
。WKWebView
的URL
属性是重定向URL。(注意:在iOS 11.0模拟器上,我看到步骤3和步骤4发生了逆转,URL
属性在webView(_:decidePolicyFor:decisionHandler:)
中保持不变,这似乎是一种合理的排序,但我还没有在设备上观察到这一点。)
webView(_:didReceiveServerRedirectForProvisionalNavigation:)
似乎是为检测重定向而显式构建的,因此可能是首选选项,尽管可以在步骤3或4中推断重定向,但前提是您必须确保没有其他导致导航更改的原因。
发布于 2020-10-30 20:45:28
在尝试了所有的解决方案之后,这个解决方案最终适用于我使用Swift 5,而WKWebView.This解决方案实现了Swift的KVO
var webView: WKWebView?
var webViewObserver: NSKeyValueObservation?
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
webView = WKWebView(frame: self.view.bounds)
webViewObserver = webView?.observe(\.url, options: .new, changeHandler: {
(currentWebView, _) in
// Here you go the new path
currentWebView.url
})
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
webViewObserver?.invalidate()
}
https://stackoverflow.com/questions/45604336
复制相似问题