17

我们使用 PhoneGap 来使用移动设备的本机功能。内部如何运作?我们如何能够从 JavaScript 方法访问 PhoneGap 的实现类?有人可以解释一下吗?

4

4 回答 4

9

我对 Cordova iOS 如何将消息传递给 WebView 做了一些深入研究。这是将消息从 iOS 传递到 JavaScript 的方法。

该类UIWebView有一个名为 的方法stringByEvaluatingJavaScriptFromString

如果您查看 iOS Cordova 项目中的一些文件,它们会将 JavaScript 作为要执行到该函数的字符串传递,例如CDVPlugin.m

我不知道 iOS 是编写一个新的 DOM 节点(类似<script>alert('from iOS');</script>)还是通过 Safari 中的一个特殊钩子执行 JavaScript。我相信后者,在这方面,上面引用的文档说:

每个顶级入口点的 JavaScript 执行时间限制为 10 秒。如果您的脚本执行超过 10 秒,则 Web 视图将停止执行该脚本。这很可能发生在代码中的随机位置,因此可能会导致意想不到的后果。施加此限制是因为 JavaScript 执行可能会导致主线程阻塞,因此当脚本运行时,用户无法与网页交互。

JavaScript 分配也限制为 10 MB。如果超过 JavaScript 的总内存分配限制,Web 视图会引发异常。

我不知道如果不对 UIWebView 的内部状态进行一些特殊访问,他们实际上是如何施加这些限制的,所以我怀疑他们只是在插入一个新的 DOM 节点。

于 2012-07-05T14:50:01.440 回答
5

我不完全确定,但这里是信息教程。这是一个很好的起点。

于 2012-05-29T18:42:19.087 回答
4

源代码是公开可用的,因此可以检查它是如何实现的,这在每个平台上都是不同的,因此您无法获得涵盖所有操作系统的单一答案。在 iOS 上,它使用 UIWebView 完成,可以通过使用专有 url 方案强制更改浏览器位置来调用本机代码。此更改会导致调用本机代码中的方法,该方法可以检查 url 方案和传递的参数,然后执行一些相关处理。然后有一种在 iOS 中从 Objective-C 调用 Javascript 的方法,可以用来将结果传递回 Javascript 端。

整个详细过程太长,无法在此处的答案中描述。

当然,它在其他平台上的实现方式是不同的。

这种机制可以在 API 后面抽象出来,这样 PhoneGap 应用程序就不会意识到特定平台实现细节的差异。

为什么不在 PhoneGap 论坛上提问,或者如果您需要很多详细信息,请查看源代码。

于 2012-05-29T20:37:25.607 回答
0

这也是一个很好的:http: //blog.quadnode.com/2011/12/05/phonegap-how-does-it-work/

于 2012-08-28T01:51:37.157 回答