Наблюдение за асинхронными вызовами postMessage из JS в WKWebView
У меня проблемы с наблюдением postMessage
события в моем родном коде от асинхронного обратного вызова функции JavaScript.
Свифт Код
webView
хранится как переменная синглтона, в котором находится этот код, поэтому не должно быть проблем с его освобождением из памяти. Это все еще там, если я запускаю это несколько раз.
// After wkwebview loaded successfully
let functionString = "loadAccount(\"136E32E5-D82C-4F5D-8F2A-FF1041E99231\");"
webView.configuration.userContentController.add(self, name: "callback")
webView.evaluateJavaScript(functionString) { (value, error) in
// we can ignore this because the method returns nil when finished with the synchonous part
}
... Later on
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
log.debug(message.body)
// Prints only:
// Will load account
// Will load account x2
}
Примечание. Загруженный аккаунт никогда не печатается.
Javascript
function loadAccount(id) {
webkit.messageHandlers.callback.postMessage("Will load account");
webkit.messageHandlers.callback.postMessage("Will load account x2");
console.log("Will load account")
console.log("Will load account x2")
server.loadAccount(id)
.catch(NotFoundError, function (error) {
webkit.messageHandlers.callback.postMessage("Failed to load account");
console.log("Failed to load account", error)
})
//If there was no error, load up-to-date information on your account.
.then(function() {
webkit.messageHandlers.callback.postMessage("Loaded account");
console.log("Loaded account")
})
}
Эта функция работает нормально с терминала и выводит следующее после закомментирования webkit.messageHandlers
звонки
Will load account
Will load account x2
Loaded account
Есть ли что-то, что может остановить выполнение кода JS, прежде чем произойдет обратный вызов?
РЕДАКТИРОВАТЬ:
Если я добавлю семафор в webView.evaluateJavaScript
и задержать его на 5 секунд или около того - что дает время асинхронного кода JS для разрешения - Loaded account
сообщение будет получено после возврата обработчика завершения. Проблема в том, что мне нужно заблокировать основной поток, чтобы дать ему время на разрешение. По понятным причинам я не хочу этого делать. Я до сих пор не могу узнать, завершится ли он или нет, и если мой семафор не будет ждать достаточно долго, он не вызовет мой обработчик сообщений.