问题 phoneGap(Cordova)如何在内部工作,特定于iOS


我已经开始为mutliple平台开发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 do what?以及调用如何支持较低层(本机代码层)

提前感谢一堆。


11885
2017-10-12 10:52


起源



答案:


诀窍很简单:

有一个webview。这会显示您的应用。 webview将处理所有导航事件。

如果浏览器导航到:

file:///!gap_exec 

要么

gap://

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

伪url示例:

gap://echoplugin/echothistext?Hello World

这将导致phonegap寻找 echoplugin 然后打电话给 echothistext 发送文本的方法 "Hello World" 到(本机)插件。

更新

从本机到javascript的方式是(或可能是)加载a javascript: url进入webview。

具体实现有点复杂,因为javascript必须向本机代码发送回调id。可能会有多个本机呼叫同时运行。但实际上这根本不是魔术。只是一个数字,以获得正确的javascript回调正确的JSON。

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


12
2017-11-09 21:52



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


答案:


诀窍很简单:

有一个webview。这会显示您的应用。 webview将处理所有导航事件。

如果浏览器导航到:

file:///!gap_exec 

要么

gap://

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

伪url示例:

gap://echoplugin/echothistext?Hello World

这将导致phonegap寻找 echoplugin 然后打电话给 echothistext 发送文本的方法 "Hello World" 到(本机)插件。

更新

从本机到javascript的方式是(或可能是)加载a javascript: url进入webview。

具体实现有点复杂,因为javascript必须向本机代码发送回调id。可能会有多个本机呼叫同时运行。但实际上这根本不是魔术。只是一个数字,以获得正确的javascript回调正确的JSON。

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


12
2017-11-09 21:52



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


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

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

Cordova来源iOSExec

那里有很多值得学习的地方。


4
2018-01-03 11:38



我相信你是对的,并且看到你的回答让我从错误的兔子洞里走了太多时间。查看我对以上@ Christian-kuetbach的回复,以获得10,000英尺的视角 - premiumFrye