Мы вызвали функцию в iOS из javascript, т.е.
var data = webkit.messageHandlers.callbackHandler.postMessage("Hello from JavaScript");
Я хочу назначить возвращаемое значение в переменной данных из вызываемого метода в iOS.
Код iOS:
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
if(message.name == "callbackHandler") {
print("JavaScript is sending a message \(message.body)")
how to send data back??
}
}
может кто-нибудь, пожалуйста, скажите мне, как это сделать?
Я знаю, что я могу использовать javascript для вызова другого метода, но из-за какого-то ограничения мне нужно вернуть результат из того же метода.
Вот один из подходов:
Javascript:
function callNativeCode() {
webkit.messageHandlers.callbackHandler.postMessage("Hello from JavaScript");
}
// this function will be later called by native code
function callNativeCodeReturn(returnedValue) {
// do your stuff with returned value here
}
Swift:
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
if(message.name == "callbackHandler") {
print("JavaScript is sending a message \(message.body)")
webView.evaluateJavaScript("callNativeCodeReturn(0)")
}
}
Конечно, это не очень элегантно, а не синхронно...
Существует другой подход с обещаниями, вы можете узнать об этом подробнее: http://igomobile.de/2017/03/06/wkwebview-return-a-value-from-native-code-to-javascript/
Promise
? Еще лучше, если сделать это прозрачным способом, не используя другой класс, а используя тот же new Promise(...)
.
Вы можете дать библиотеке WebViewJavascriptBridge
попробовать и посмотреть, соответствует ли она вашим потребностям.