【发布时间】:2020-08-13 17:04:41
【问题描述】:
我尝试在 WKWebView 加载之前捕获即将加载的 url。基于文档decidePolicyFor navigationAction (WKNavigationDelegate) 应该可以完成这项工作,但我的问题是在加载新 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 的内容显示了一段时间,然后错误页面出现在屏幕上,如果我关闭它,最后一个可见的网页来自禁止链接模式。
在将链接实际加载到 webView 之前,有什么方法可以了解链接吗?
我正在使用 Xcode 11.2.1 和 Swift 5.0
【问题讨论】:
-
一些评论,因为它可能会以某种方式帮助您:我怀疑可能还有其他事情发生,可能与您正在使用的网页有关。我们在我们的应用程序中使用相同的模式(据我所知),对我们来说,如果满足
.cancel条件,则不会执行重定向,并且不会显示新内容。所以我可以确认这个设置,原则上,正如你最初预期的那样工作。另外(为了测试基本设置)如果您只是将decisionHandler(.cancel); return放在委托函数中,如果您仍然可以看到任何内容加载,我会感到非常惊讶。祝你好运! -
您是否尝试过 webView
didCommitNavigation功能,因为它不能正常工作?您也可以尝试设置webView.isOpaque = false和webView.backgroundColor = UIColor.clear,直到您确认该URL 未被禁止。 -
提供更多细节。你加载哪个网址?什么是禁止的 URL 模式?您在加载的 URL 中单击哪个链接来体验错误?
-
在这里工作正常。 Xcode 11.4 / iOS 13.4。所以我假设这是在其他代码中,或者过滤器不匹配所有 url。尝试在返回 .allow 大小写之前记录 url。如果您提供您使用的 URL 和应该过滤掉的 URL,则可以进行更深入的测试。
-
@Gamma 感谢您的评论,您是对的,网页有问题,因为所有网址都是相对的而不是绝对的,请参阅下面的回答。