使用WKWebView可以在JavaScript和Swift/Obj-C本机代码之间进行同步通信吗?
这些是我尝试过但失败的方法.
方法1:使用脚本处理程序
WKWebView接收JS消息的新方法是使用userContentController:didReceiveScriptMessage:从JS调用的委托方法window.webkit.messageHandlers.myMsgHandler.postMessage('What's the meaning of life, native code?')
.这种方法的问题是在执行本机委托方法时,JS执行没有被阻止,所以我们不能通过立即调用webView.evaluateJavaScript("something = 42", completionHandler: nil).
示例(JavaScript)
var something;
function getSomething() {
window.webkit.messageHandlers.myMsgHandler.postMessage("What's the meaning of life, native code?"); // Execution NOT blocking here :(
return something;
}
getSomething(); // Returns undefined
Run Code Online (Sandbox Code Playgroud)
示例(Swift)
func userContentController(userContentController: WKUserContentController, didReceiveScriptMessage message: WKScriptMessage) {
webView.evaluateJavaScript("something = 42", completionHandler: nil)
}
Run Code Online (Sandbox Code Playgroud)
方法2:使用自定义URL方案
在JS中,重定向使用window.location = "js://webView?hello=world"调用本机 WKNavigationDelegate方法,其中可以提取URL查询参数.但是,与UIWebView不同,委托方法不会阻止JS执行,因此立即调用evaluateJavaScript将值传递回JS也不起作用.
示例(JavaScript)
var something;
function getSomething() {
window.location …Run Code Online (Sandbox Code Playgroud) 您可能知道,Android的WebView有一个名为的方法addJavascriptInterface(),它将Android JAVA对象导入Javascript上下文.
问题是,iOS上有没有相同的东西?