Я пытаюсь проанализировать некоторые метаданные HTML из стороннего URL;однако, я не получаю полные данные HTML, пока некоторые сценарии Javascript не будут выполнены в WKWebView
.
Так что я пытался определить, когда WKWebView
полностью загрузил веб-страницу с Javascriptно, к сожалению, я не смог.
Вот что я попробовал:
- Я попытался использовать
WKUserContentController
и обработал метод протокола, но это не сработало, потому что метод протоколавыполняется только тогда, когда он получает сообщение сценария, а не после его завершения. - Я попытался добавить наблюдателя для
WKWebView
estimatedProgress
, но estimatedProgress
вернул 1,0 до завершения загрузки сценариев JS. - Я пытался использовать
WKNavigationDelegate
метод протокола webView(_ webView: WKWebView, didFinish navigation: WKNavigation!)
, но это по сути то же самое, что и добавление наблюдателя. - Я также пытался использовать метод
WKWebView
evaluateJavaScript
в методе observeValue
чтобы проверить оба: document.readyState == \"interactive\"
document.readyState == \"completed\"
, но это тоже не сработало, потому что оно выполнялось до JSзагрузка завершена.
код
ВотОда последнего подхода, который я пытался и не работал:
Инициализация WKWebView
let webView = WKWebView(frame: self.view.frame)
webView.addObserver(self, forKeyPath: "estimatedProgress", options: .new, context: nil)
webView.load(URLRequest(url: url))
webView.navigationDelegate = self
self.view.addSubview(webView)
Обработка наблюдателя
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == "estimatedProgress" {
if let webView = object as? WKWebView, webView.estimatedProgress > 0.5 {
print(webView.estimatedProgress)
webView.evaluateJavaScript("document.readyState == \"interactive\"") { (isLoaded, err) in
print(isLoaded)
if let loaded = isLoaded as? Bool, loaded == true {
print("completely done loading with JS")
}
}
}
}
}
Результат, который я получаю при выполнении метода evaluateJavaScript
, равен false
, потому что он выполняется слишком рано.Но я пытаюсь позволить наблюдателю продолжать, пока isLoaded
не станет правдой.