将 iOS 中被调用函数的结果返回给 JavaScript 中 WkWebView 中的调用函数

Posted

技术标签:

【中文标题】将 iOS 中被调用函数的结果返回给 JavaScript 中 WkWebView 中的调用函数【英文标题】:Return result from called function in iOS to calling function in WkWebView in JavaScript 【发布时间】:2017-07-19 14:27:15 【问题描述】:

我们在 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??
        
    

谁能告诉我怎么做?

我知道我可以使用 evaluateJavascript 来回调另一个方法,但由于某些限制,我必须从同一方法返回结果。

【问题讨论】:

我认为这本质上是 my question a few years ago 的副本。很遗憾,还没有任何答案。 【参考方案1】:

这是一种方法:

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/

【讨论】:

有没有办法将 promise uuid 生成器集成到 Promise 类本身中?如果以透明的方式完成,而不必使用不同的类,而是使用相同的 new Promise(...) 构造函数,那就更好了。 强烈建议不要修改标准 JavaScript 对象的原型。但这是可能的 (w3schools.com/js/js_object_prototypes.asp)【参考方案2】:

iOS 14+ 添加了一个“didReceive:replyHandler”参数,该参数可以包含一个“reply”对象或一个“errorMessage”。这个“replyHandler”实际上是上述“evaluateJavaScript”异步回调的正式实现:

WKScriptMessageHandlerWithReply interface 和 didReceive:replyHandler 的 Apple 文档

有关使用此“replyHandler”的示例,请参阅此 *** 帖子:iOS 14 API WKScriptMessageHandlerWithReply

【讨论】:

【参考方案3】:

您可以试试WebViewJavascriptBridge 库,看看它是否符合您的需求。

https://github.com/marcuswestin/WebViewJavascriptBridge.

【讨论】:

以上是关于将 iOS 中被调用函数的结果返回给 JavaScript 中 WkWebView 中的调用函数的主要内容,如果未能解决你的问题,请参考以下文章

004---IO模型

检查单选按钮是不是在javascript中被选中/未选中的函数[重复]

JS中的map()函数

Boost Asio总结同步通信

iOS - Cordova 如何调用目标 c 函数?

对 ExecuteNonQuery 的 Postgres 函数(通过 npgsql)调用返回 -1 作为受影响行的结果