Наблюдение за асинхронными вызовами 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 сообщение будет получено после возврата обработчика завершения. Проблема в том, что мне нужно заблокировать основной поток, чтобы дать ему время на разрешение. По понятным причинам я не хочу этого делать. Я до сих пор не могу узнать, завершится ли он или нет, и если мой семафор не будет ждать достаточно долго, он не вызовет мой обработчик сообщений.

0 ответов

Другие вопросы по тегам