在 iOS 应用程序中嵌入 JavaScript 引擎

Posted

技术标签:

【中文标题】在 iOS 应用程序中嵌入 JavaScript 引擎【英文标题】:Embed a JavaScript engine in an iOS application 【发布时间】:2011-07-16 02:57:45 【问题描述】:

我想知道是否有人成功地将 javascript 引擎/解释器移植到 ios。我正在编写一个 iPhone 游戏,我想使用 Javascript 作为高级脚本语言(AI、游戏玩法等),但要做到这一点,我需要将 JS 引擎编译为静态库并将其链接到我的 iPhone OS 的 ObjectiveC 程序。我正在研究一些候选 JS 引擎,但我找不到任何成功的案例。

这是我希望用于 iOS 的 js 引擎

google 的 V8 javascript 引擎 Mozilla 的 SpiderMonkey

另一种方法是使用UIWebView's Javascript 回调接口,但这需要将整个UIWebView 加载到内存中,我听到的经验是它通常性能很慢。

感谢是否有人有类似的这样做经验或知道任何参考!

[更新] 正如 Kostis 所说,Apple 在 WWDC 2013 中引入了JavascriptCore

【问题讨论】:

出于任何原因不想使用 JavaScriptCore (webkit.org/projects/javascript/index.html)。听起来它可以构建为静态库并提供 Obj-C 绑定。 嗨 Justin,WebKit 中的 JavaScriptCore 源代码可以在 Mac OS X 上构建,但是,为 iOS 构建它似乎并不简单,但我稍后会试一试 嗨 Denny,你有没有为 iOS 准备好任何东西?? 【参考方案1】:

您可能对以下两个项目感兴趣:

    JavaScriptCore-iOS iMonkey

绝对可以在您的 iOS 应用程序中构建和发布 JavaScript 引擎,请参阅http://www.phoboslab.org/log/2011/04/ios-and-javascript-for-real-this-time。钛也这样做:https://github.com/appcelerator/webkit_titanium/tree/master/Source/JavaScriptCore。 另见http://www.phoboslab.org/log/2011/06/javascriptcore-project-files-for-ios。

我还制作了一个小应用程序,展示如何在 iOS 上使用 JSC:https://github.com/jfahrenkrug/AddressBookSpy

享受吧。

【讨论】:

请注意,JavaScriptCore 似乎是 LGPL v2,这对于闭源 iOS 应用程序来说是有问题的,除非您提供 .o 文件,以便有人可以将您的应用程序与不同版本的 JavaScriptCore 库重新链接(询问您的律师,这不是法律建议)。 “如果您将程序与库链接,您必须向接收者提供完整的目标文件,以便他们在对库进行更改并重新编译后将它们与库重新链接。” 感谢 Johannes,我从不知道有一个按钮可以实现 :-0 。感谢大家!我很惊讶这里有很多好的答案。至于嵌入的进度,我遵循了您对 JavaScriotCore-iOS 项目的建议,是的,我能够在 iOS 上编译和运行本机 javascript 解释器。 重新获得许可,可能值得 ping 开发人员看看这是否是他们真正想要的模型。因为它是为 iOS 设计的,所以分发 .o 似乎是一个奇怪的限制。【参考方案2】:

对于未来的观众来说,现在有 JavaScriptCore 框架,在新的 iOS 7 中引入。它很神奇!包装,从/到 JS/Objective-C 的值,调用函数,回调,一切!

不幸的是,目前的文档真的很差。您可以从WWDC 2013 event 中找到演示文稿,并在头文件中找到更多信息(cmd+单击 Xcode 中的头文件名)。互联网上也有一些教程只是复制了 WWDC 演示文稿中的人所做的事情。

我已经将它用于我的一个项目,它真的很强大。我唯一不喜欢的是它通过值将对象从 JS 传递到 ObjC,即引用丢失了。可能有解决方法,但如果没有适当的文档,我找不到任何东西。

希望这会对某人有所帮助:)

【讨论】:

【参考方案3】:

看看嵌入了 JavaScriptCore 的开源项目Ejecta。它提供 HTML5 画布 API,并使用 OpenGL 和 OpenAL。

【讨论】:

【参考方案4】:

如果您最终希望将游戏移植到 iOS 以外的其他平台(或者您有其他原因避免使用 Apple 的专有接口),您可以使用 MuJS。它是一个小型库,提供易于嵌入和扩展的 JavaScript 解释器。

【讨论】:

以上是关于在 iOS 应用程序中嵌入 JavaScript 引擎的主要内容,如果未能解决你的问题,请参考以下文章

我们可以在 Node JS 应用程序中使用带有 ejs(嵌入式 javascript)的 socket.io 而不是 html 页面吗?

我们可以在Node JS应用程序中使用socket.io和ejs(嵌入式javascript)而不是html页面吗?

嵌入在 WKWebView 加载的 HTML 文件中的 JavaScript 是不是可以访问?

如何在 iOS 应用程序 WkWebView 中调试 javascript?

嵌入在 html 中的 javascript 未在 wkwebview 中运行

在 SFSafariViewController 中嵌入 Javascript