gpt4 book ai didi

ios - WKWebView decidePolicyFor 在页面加载后被调用

转载 作者:行者123 更新时间:2023-12-01 16:05:38 27 4
gpt4 key购买 nike

我尝试在加载之前在 WKWebView 中捕获即将加载的 url。根据文件 decidePolicyFor navigationAction (WKNavigationDelegate) 应该可以完成这项工作,但我的问题是这个委托(delegate)是在加载新 url 之后调用的,而不是在此之前。

这是我写的扩展。

extension MyWebViewController: WKNavigationDelegate {

public func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {

guard let navigationURL = navigationAction.request.url else {
decisionHandler(.allow)
return
}

let forbiddenUrlPattern = Configuration.current.links.forbiddenUrlPattern
if forbiddenUrlPattern.matches(url: navigationURL) {
decisionHandler(.cancel)
showFullScreenError(error: .forbidden)
return
}

// Default policy is to allow navigation to any links the subclass doesn't know about
decisionHandler(.allow)
}
}

*PS 匹配扩展检查模式,它工作正常。现在的问题是 forbiddenUrl 的内容在调用此委托(delegate)函数之前显示了一段时间,然后错误页面出现在屏幕上,如果我关闭它,最后一个可见的网页来自禁止链接模式。

在将链接实际加载到 webView 之前,有什么方法可以了解该链接吗?

我正在使用 Xcode 11.2.1 和 Swift 5.0

最佳答案

我在这里写下了我找到的答案,它也可能对其他人有帮助。经过大量的努力,我发现如果 url 是相对的(不是绝对 url),decisionHandler 将不会被调用。那么为什么 decisionHandler 在加载该页面后被调用呢?我找到的答案是:当我们有像 href:"/foo/ba" 这样的 url 时,调用该 url 后,它将加载并解析为 www.domain.com/foo/ba 然后才调用 desicionHandler
另外 didCommit 只在我想在 webView 中第一次加载 url 时调用一次。

所以对我有帮助的解决方案是向 webView 添加一个观察者

webView.addObserver(self, forKeyPath: "URL", options: [.new,.old], context: nil)

override open func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
/// This observer is in addition to the navigationAction delegate to block relative urls and intrrupt them and do native
/// action if possible.
if let newValue = change?[.newKey] as? URL, let oldValue = change?[.oldKey] as? URL, newValue != oldValue {
let forbiddenUrlPattern = Configuration.current.links.forbiddenUrlPattern
if forbiddenUrlPattern.matches(url: newValue) {
showFullScreenError(error: .forbidden)
return
}

/// These two action needed to cancel the webView loading the offerDetail page.
/// otherwise as we stop loading the about to start process webView will show blank page.
webView.stopLoading()
///This is small extension for make webView go one step back
webView.handleBackAction(sender: newValue)
return
}
}
}

因此,除了 decisionHandler 之外,此观察者还将涵盖任何人想要收听并在需要时采取行动的绝对和相对 URL。

关于ios - WKWebView decidePolicyFor 在页面加载后被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61504681/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com