我们使用 PhoneGap 来使用移动设备的本机功能。内部如何运作?我们如何能够从 JavaScript 方法访问 PhoneGap 的实现类?有人可以解释一下吗?
4 回答
我对 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 节点。
我不完全确定,但这里是信息教程。这是一个很好的起点。
源代码是公开可用的,因此可以检查它是如何实现的,这在每个平台上都是不同的,因此您无法获得涵盖所有操作系统的单一答案。在 iOS 上,它使用 UIWebView 完成,可以通过使用专有 url 方案强制更改浏览器位置来调用本机代码。此更改会导致调用本机代码中的方法,该方法可以检查 url 方案和传递的参数,然后执行一些相关处理。然后有一种在 iOS 中从 Objective-C 调用 Javascript 的方法,可以用来将结果传递回 Javascript 端。
整个详细过程太长,无法在此处的答案中描述。
当然,它在其他平台上的实现方式是不同的。
这种机制可以在 API 后面抽象出来,这样 PhoneGap 应用程序就不会意识到特定平台实现细节的差异。
为什么不在 PhoneGap 论坛上提问,或者如果您需要很多详细信息,请查看源代码。
这也是一个很好的:http: //blog.quadnode.com/2011/12/05/phonegap-how-does-it-work/