是否可以从 Javascript 调用 Swift 函数/回调? 在Android中可以使用JavaVoidCallbacks,Swift中有类似的东西吗?现在我使用 JavaScriptCore,我可以从 Swift 调用 javascript 函数。
是的,你可以。
请参考本教程:https://www.raywenderlich.com/124075/javascriptcore-tutorial
您对“公开本机代码”段落感兴趣
在obj-c中非常简单。您只需使用 jsContext 作为普通字典即可做到这一点。
context[@"functionName"] = ^ <#returnType#> (<#parameters#>) {
<#Your code#>
}
希望有帮助。
我也有同样的问题。当我看到这个问题的答案时,我尝试使用 JavaScriptCore 从 JS 端调用 Swift 方法。我可以将 Swift 或 JS 方法注入 JSContext。但是,在我的情况下,注入 JSContext 的方法无法访问。
我在 iOS 本机应用程序的 ViewController 中使用 WKWebView 作为 HTML 查看器。我使用这种视图控制器在我的应用程序中呈现一些帮助信息。经过几天的努力,我终于找到了一种替代方法来实现 Swift 和 JS 的交互。策略是使用 WKScriptMessageHandler 作为 Swift 和 JS 之间的网关。有关详细操作方法,请参阅这个好博客。另一篇博客,使用 WebKit 从 Swift 调用 WKWebView JavaScript 和从 JavaScrip 调用 Swiftt,提供了另一个示例案例,非常有用。
根据我的经验,
WKScriptMessageHandler
基于非常优雅的结构。通过WKUserContentController
,您在 JS 和 Swift 之间设置了消息网关。这将允许 JS 回调消息到 Swift。必须实现 WKWebViewConfiguration
的委托、带有 Web 视图的视图控制器或我的自定义类,以接收带有数据的 JS
消息调用。消息可以采用 JSON
字符串作为参数来传递数据。在 Swift 方面,通过使用类似的 JSContext
语法(例如 evaluateJavaScript
)来指定 JS 带有数据的函数。
顺便说一句,有人告诉我,就我而言,JavaScriptCore 是基于 Java 虚拟机的。可能存在性能问题并可能带来安全风险。苹果已经在 WKWebView 中禁用了 JavaScriptCore 的功能。
我的 Xcode 是版本 13.4,Swift 是 5。
我就此写了一篇博客:在 Swift 和 JS 之间建立一座桥梁
在 Swift 中,我发现最简单的方法是在 Javascript 中创建一个网关对象,例如使用evaluateScript(),然后向该对象添加函数:
let gateway = jsContext.objectForKeyedSubscript("gateway" as NSString)
let p: @convention(block) (Int, Double) -> () = { h, ms in
return self.swift_method(h, ms)
}
gateway!.setObject(p, forKeyedSubscript: "swift_method" as NSString)
之后你可以在Javascript中调用gateway.swift_method()。
大多数类型转换是自动的。我在 lambda 中使用了 Int、Double、String 和 [Int] 类型作为参数和/或返回类型。