从iOS中调用的函数返回结果到JavaScript中WkWebView中的调用函数

klh5stk1  于 2023-06-28  发布在  Java
关注(0)|答案(4)|浏览(179)

我们从JavaScript调用了iOS中的一个函数,即

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??
        }
    }

有人能告诉我怎么做吗??
我知道我可以使用evaluateJavascript来回调另一个方法,但由于一些限制,我必须从同一个方法返回结果。

cu6pst1q

cu6pst1q1#

下面是一种方法:
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
}

斯威夫特:

func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
    if(message.name == "callbackHandler") {
        print("JavaScript is sending a message \(message.body)")
        webView.evaluateJavaScript("callNativeCodeReturn(0)")
    }
}

当然这不是很优雅和不同步...
还有另一种使用promise的方法,你可以在这里找到更多关于它的信息:http://igomobile.de/2017/03/06/wkwebview-return-a-value-from-native-code-to-javascript/

yeotifhr

yeotifhr2#

iOS 14+添加了“didReceive:replyHandler”参数,该参数可以包含“reply”对象或“errorMessage”。这个'replyHandler'实际上是上述'evaluateJavaScript'异步回调的正式实现:
WKScriptMessageHandlerWithReply interfacedidReceive:replyHandler的Apple文档
有关使用此'replyHandler'的示例,请参阅此StackOverflow帖子:iOS 14 API WKScriptMessageHandlerWithReply

ubof19bj

ubof19bj3#

如果你需要从Swift中异步获取JS中的数据,你也可以使用localStorage
在Swift中:

webView.evaluateJavaScript("localStorage.setItem(\"mykey\",\"myval\")")

在JS中:

let myval = localStorage.getItem('mykey')
irlmq6kh

irlmq6kh4#

您可以给予WebViewJavascriptBridge库,看看它是否符合您的需要。
https://github.com/marcuswestin/WebViewJavascriptBridge

相关问题