如何在使用WKWebView时捕获重定向URL,就像在提交用户名和密码或其他一些数据时网页重定向到另一个页面一样。我需要捕获重定向的URL。 WKNavigationDelegate中是否有任何方法可以覆盖?
答案 0 :(得分:18)
使用此WKNavigationDelegate
方法
public func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Swift.Void)
{
if(navigationAction.navigationType == .other)
{
if navigationAction.request.url != nil
{
//do what you need with url
//self.delegate?.openURL(url: navigationAction.request.url!)
}
decisionHandler(.cancel)
return
}
decisionHandler(.allow)
}
希望这有帮助
答案 1 :(得分:1)
尝试了所有解决方案后,终于可以使用Swift 5和WKWebView为我工作。此解决方案为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()
}
答案 2 :(得分:1)
Swift 5 Boom
非常简单的方法
func webView(_ webView: WKWebView, didReceiveServerRedirectForProvisionalNavigation navigation: WKNavigation!) {
if let url = webView.url?.absoluteString{
print("url = \(url)")
}
}
答案 3 :(得分:0)
归功于 Sven: https://forums.developer.apple.com/thread/117073
如果您遇到WebView无法打开PDF文件或仅URL不能解析的情况,因为WebView的重定向URL无法通过,则可以使用WKUIDelegate
函数{{1} },以捕获失败的呼叫并再次加载请求,如:
webView(_:createWebViewWith:for:windowFeatures:)
}
答案 4 :(得分:0)
对我来说,使用 decidePolicyFor
导航委托的方法无效。
由于WKNavigationDelegate的方法不起作用
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void)
仅在重新加载整页时被调用。 为了能够捕获所有WKWebView的请求URL更改,必须在WKWebView的URL属性上放置一个键值观察器。
第一,在viewDidLoad中添加:
webView.addObserver(self, forKeyPath: "URL", options: .new, context: nil)
第二,添加observeValue方法
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == #keyPath(WKWebView.url) {
// Whenever URL changes, it can be accessed via WKWebView instance
let url = webView.url
}
}
答案 5 :(得分:0)
使用此 WKNavigationDelegate 方法。我从 sourceFrame.request 得到了重定向 url
public func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Swift.Void) {
let urlString = navigationAction.sourceFrame.request.url?.absoluteString ?? ""
print("\(urlString)")
decisionHandler(.allow)
}