Я написал ответ, который нашел здесь, что он может помочь кому-то еще. После большой борьбы я узнал, что decisionHandler
не будет вызван, если URL-адрес является относительным (не абсолютным URL-адресом). Так почему decisionHandler
вызвали после загрузки этой страницы? я нашел ответ: когда у нас есть URL-адреса, такие как href:"/foo/ba"
, то после вызова этого URL-адреса он будет загружен и разрешен как www.domain.com/foo/ba
, и только тогда будет вызван desicionHandler
.
Также didCommit
вызывается только один раз, когда я хотел впервые загрузить URL в webView.
, поэтому решение помогло мне добавить наблюдателя в 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-адреса, которые каждый хочет выслушать и принять меры, если это необходимо.