Я использую WKWebView
и хочу получать уведомление, когда сайт полностью загружен. Метод webView:didFinishNavigation
WKNavigationDelegate
уволен, когда document.readyState
либо interactive
, либо complete
, и я хочу быть уверенным, что сайт был полностью загружен. Я придумал решение, которое использует JavaScript-инъекцию. Вот мой MWE:ScriptMessageHandler не всегда вызывается на самом устройстве, отлично работает на симуляторе
import UIKit
import WebKit
class ViewController: UIViewController, WKScriptMessageHandler, WKNavigationDelegate {
var webView: WKWebView!
@IBOutlet weak var loadLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
let contentController = WKUserContentController()
let scriptPath = NSBundle.mainBundle().pathForResource("script", ofType: "js")!
let scriptString = try! String(contentsOfFile: scriptPath)
let script = WKUserScript(source: scriptString, injectionTime: .AtDocumentStart, forMainFrameOnly: true)
contentController.addUserScript(script)
contentController.addScriptMessageHandler(self, name: "readyHandler")
let configuration = WKWebViewConfiguration()
configuration.userContentController = contentController
webView = WKWebView(frame: CGRect.zero, configuration: configuration)
webView.navigationDelegate = self
loadLabel.text = nil
}
@IBAction func loadWebsite() {
webView.loadRequest(NSURLRequest(URL: NSURL(string: "http://stackoverflow.com")!))
loadLabel.text = "Loading..."
}
func userContentController(userContentController: WKUserContentController, didReceiveScriptMessage message: WKScriptMessage) {
print("message received")
loadLabel.text = "Complete"
}
}
И это содержание script.js
файла:
document.onreadystatechange = function() {
if(document.readyState === "complete"){
webkit.messageHandlers.readyHandler.postMessage("");
}
}
userContentController:didReceiveScriptMessage
метод всегда вызывается на IOS Simulator, но и на реальном устройстве (iPhone 6 в моем случае) это не называется в большинстве случаев. Любая идея, что может быть неправильным в отношении этого или каким другим способом проверить, полностью ли загружен сайт?
Does '.AtDocumentEnd' работает? – soflare
@soflare На симуляторе, да, на устройстве, нет. Что более интересно, я тестировал его на другом устройстве (iPhone 5 с iOS 8.4.1), и он отлично работает. Таким образом, это похоже на проблему с самой iOS 9. –
Убедитесь, что: 1. сценарий вставляется; 2. выполняется сценарий; 3. сообщение доставлено. Какой шаг нарушен? Попробуйте подключить webview с помощью Safari и изучить в консоли JS. – soflare