Ich möchte die Async-Funktionalität von WKWebView außerhalb der Webansicht angeboten verwenden. Die JS-Kontextoption stellt die Async-Funktionalität nicht bereit.Async-Kommunikation von Swift und Javascriptcore
In WKWebView, schreibe ich meine Logik wie folgt.
func swiftFunc1() {
webView.evaluateJavaScript("jsFunc1(), completionHandler: nil)
}
In Javascript Code, den ich eine Nachricht an schnellen
function jsFunc1() {
window.webkit.messageHandlers.myMsg.postMessage("call swiftFunc2");
}
Der SWIFT-Code kann dann den Umgang Nachricht entsprechenden JS Rückruf als Teil nennen.
Aber das hängt davon ab, dass das Webview die Vordergrundansicht ist. Wenn ich die JS-Logik unabhängig von der Webansicht verwenden möchte, ist JSContext die Option. Ich versuchte folgende
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)
}
Jetzt in Javascript-Code kann ich keine Nachricht an swift. Wenn ich versuche, eine schnelle Funktion wie folgt aufzurufen, bleibt der Code für immer hängen.
function jsFunc1() {
swiftIface.swiftFunc2() // This creates a deadklock
}
Wie kann ich eine der folgenden ohne „Rückkehr“ von der gerufenen Javascript-Funktion jsFunc1() erreichen?
Entweder eine Nachricht an swift veröffentlichen, so dass es
entsprechende Maßnahmen ergreifen können Oder eine schnelle Funktion aufrufen, so dass die entsprechenden Maßnahmen ergriffen werden
Danke für die Antwort. Aber bedeutet das, dass ich nur Blöcke/Schließungen benutzen sollte, um das zu umgehen? JSExport kann diese Art von Aufrufsequenz nicht verarbeiten, oder? – Amruta
Es sollte auch mit JSExport möglich sein. Vielleicht, wenn ich morgen Zeit habe, kann ich versuchen, ein Beispiel zu geben. – snailmensch
Ich freue mich darauf! – Amruta