Лучше использовать WKWebView для достижения этой цели, поскольку, как вы упомянули, UIWebViewDelegate устарела.
Вот простой пример для мониторинга состояния загрузки WKWebView с помощью KVO.
import WebKit
class ViewController: UIViewController, WKUIDelegate {
private var webView: WKWebView!
override func loadView() {
let webConfiguration = WKWebViewConfiguration()
webView = WKWebView(frame: .zero, configuration: webConfiguration)
webView.uiDelegate = self
view = webView
webView.addObserver(self, forKeyPath: "loading", options: .new, context: nil)
}
override func viewDidLoad() {
super.viewDidLoad()
let myURL = URL(string: "http://www.apple.com")
let myRequest = URLRequest(url: myURL!)
webView.load(myRequest)
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
guard let keyPath = keyPath, let change = change else { return }
switch keyPath {
case "loading":
if let loading = change[.newKey] as? Bool {
print("Is webview loading: \(loading)")
}
default:
break
}
}
deinit {
webView.removeObserver(self, forKeyPath: "loading")
}
}