慷慨大方的火腿肠 · .net core ...· 5 月前 · |
怕老婆的小蝌蚪 · 【MapReduce】Streaming ...· 1 年前 · |
鼻子大的炒粉 · VUE滚动条插件——vue-happy-sc ...· 1 年前 · |
文雅的炒粉 · vba子过程或函数未定义_“子过程或函数未定 ...· 1 年前 · |
在使用WKWebView时,如何捕获重定向url,就像网页在提交用户名、密码或其他数据时重定向到另一个页面一样。我需要捕获重定向的url。WKNavigationDelegate中有什么方法可以重写吗?
使用此
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)
}
希望这能有所帮助
(这回答了一个稍微笼统一些的问题,即如何在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中推断重定向,但前提是您必须确保没有其他导致导航更改的原因。
Sven的学分: https://forums.developer.apple.com/thread/117073
如果您所面临的情况是您的WebView没有打开PDF文件,或者只是url解析为空,因为WebView的重定向URL无法通过,您可以使用
WKUIDelegate
函数
webView(_:createWebViewWith:for:windowFeatures:)
捕获失败的调用并再次加载请求,如下所示:
extension WebViewWrapper: WKUIDelegate {
func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
if navigationAction.targetFrame == nil || navigationAction.targetFrame?.isMainFrame == false {
webView.load(navigationAction.request)
return nil
}
}
对我来说,使用
decidePolicyFor
导航代表的方法
不起作用。
因为WKNavigationDelegate的方法不起作用
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void)
只有在有完整页面重新加载时才会调用。为了能够捕获所有WKWebView的请求URL更改,必须在WKWebView的URL属性上放置一个键值观察者。
First ,在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
}
在尝试了所有的解决方案之后,这个解决方案最终适用于我使用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()
}
使用此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)")