Я хочу использовать асинхронную функциональность, предлагаемую WKWebView вне веб-просмотра. Параметр контекста JS не обеспечивает функциональность асинхронности.
В WKWebView я пишу свою логику следующим образом.
func swiftFunc1() {
webView.evaluateJavaScript("jsFunc1(), completionHandler: nil)
}
В коде javascript я отправляю сообщение Swift
function jsFunc1() {
window.webkit.messageHandlers.myMsg.postMessage("call swiftFunc2");
}
Затем быстрый код может вызвать соответствующий обратный вызов JS как часть обработки сообщения.
Но это зависит от того, является ли веб-просмотр передним планом. Если я хочу использовать логику JS независимо от веб-просмотра, JContext — это вариант. Я пытался следовать
func swiftFunc1() {
myCtxt = JSContext()
exportedToJS = exportToJS() //confirms to JSExport and uses @objc
myCtxt.setObject(exportedToJS.self, forKeyedSubscript: "swiftIface")
myFunc = myCtxt.objectForKeyedSubscript("jsFunc1")
myFunc.callWithArguments(nil)
}
Теперь в коде javascript я не могу отправить сообщение в swift. Если я попытаюсь вызвать быструю функцию следующим образом, код застрянет навсегда.
function jsFunc1() {
swiftIface.swiftFunc2() // This creates a deadklock
}
Как я могу добиться любого из следующих действий без «возврата» из вызываемой функции Javascript jsFunc1()?
Либо опубликуйте сообщение для быстрого, чтобы он мог принять соответствующие меры
Или вызовите быструю функцию, чтобы было выполнено соответствующее действие