PhoneGap(Cordova)在iOS系统中的内部工作原理是什么?

12

我已经开始为多个平台开发HTML应用程序。最近,我听说了Cordova 2.0(PhoneGap),自那以后我一直很好奇桥梁是如何工作的。 经过大量代码漫步,我发现Exec.js是从JS-> Native调用发生的代码。

execXhr = execXhr || new XMLHttpRequest();
        // Changeing this to a GET will make the XHR reach the URIProtocol on 4.2.
        // For some reason it still doesn't work though...
        execXhr.open('HEAD', "file:///!gap_exec", true);
        execXhr.setRequestHeader('vc', cordova.iOSVCAddr);
        if (shouldBundleCommandJson()) {
            execXhr.setRequestHeader('cmds', nativecomm());
        }
        execXhr.send(null);
    } else {
        execIframe = execIframe || createExecIframe();
        execIframe.src = "gap://ready";

但是想要理解它是如何工作的,这里的概念是什么,file:///!gap_exec或者gap://ready是什么?调用是如何传播到更低层次(本地代码层)的呢?

提前感谢您的帮助。

2个回答

13

这个技巧非常简单:

有一个 Webview,它会显示您的应用程序。Webview 将处理所有导航事件。

如果浏览器导航到:

file:///!gap_exec 
或者
gap://

Webview将取消导航。这些字符串后面的所有内容都被重新用作标识符,以获取具体的插件/插件方法和参数:

伪URL示例:

gap://echoplugin/echothistext?Hello World

这将使得 PhoneGap 查找一个名为 echoplugin 的插件,并调用 echothistext 方法,向 (native) 插件发送文本 "Hello World"

更新

从 native 到 javascript 的返回方式是(或可能是)在 webview 中加载一个 javascript: 的 URL。

具体实现有点复杂,因为 javascript 必须向 native 代码发送回调 ID。可能会有多个 native 调用同时运行。但事实上,这并不是什么魔法,只是一个数字,以便将正确的 JSON 发送到正确的 javascript 回调中。

有不同的方法来在平台和 javascript 之间通信。对于 Android,有三到四个不同的桥接方法。


我很久以前就想到了这个。但是你的答案是正确的。谢谢。 - 2ndlife
如果您仍在使用Cordova,能否更新您的回复?看起来exec会注入一个src="gap://ready"的iframe,这是唯一的js代码...然后CDVViewController.m拦截对'gap'的所有请求与shouldStartLoadWithRequest,然后CDVCommandQueue.m使用stringByEvaluatingJavaScriptFromString获取js命令队列。 - premiumFrye
@Christian Kuetbach:你说过“可能会有多个本地调用同时运行”。我的情况完全一样。我需要同时调用一个本地插件方法多次。我还想从JavaScript为每个插件调用传递来自本地插件的响应(使用回调ID作为插件结果)。我不确定Cordova在这种情况下的行为如何。我已经为此目的提出了一个单独的问题。如果可能的话,你能否请看一下http://stackoverflow.com/q/32139534/2035845。 - Rashmi Ranjan mallick

4

我相信你是对的,看到你的答案让我避免了再花费太多时间走错路。请查看我对@Christian-kuetbach的回复,以获取一万英尺的视角。 - premiumFrye

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接