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 是做什么的?以及调用如何传播到较低层(本机代码层)

提前感谢一堆。

4

2 回答 2

13

诀窍很简单:

有一个网页视图。这将显示您的应用程序。webview 将处理所有导航事件。

如果浏览器导航到:

file:///!gap_exec 

或者

gap://

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

伪网址示例:

gap://echoplugin/echothistext?Hello World

这将导致 phonegap 查找echoplugin并调用该echothistext方法以将文本发送"Hello World"到(本机)插件。

更新

从本机返回到 javascript 的方法是(或可能是)将javascript:url 加载到 webview 中。

具体实现稍微复杂一些,因为 javascript 必须向本机代码发送回调 ID。可能有多个本地调用同时运行。但事实上,这根本不是魔法。只需一个数字即可将正确的 JSON 传递给正确的 javascript-callback。

平台和javascript之间有不同的通信方式。对于 Android,有三到四种不同的网桥。

于 2012-11-09T21:52:14.677 回答
4

我也试图更详细地解决这个问题。基本上iOS端有2种方法可以帮助......

从消息来源看来,cordova 使用 webView:shouldStartLoadWithRequest:... 发送了一条“READY”消息,然后使用第二条消息获取结果,但我不确定。

Cordova 源 iOSExec

那里有很多东西要学。

于 2013-01-03T11:38:35.017 回答