Как работает phoneGap (Cordova), специфическая для iOS

Я начал разрабатывать 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";

Но хотите понять, как это работает, каково здесь понятие, что делает файл:///! gap_exec или gap://ready do? и как вызов прогневается на нижние уровни (нативные уровни кода)

благодарит кучу заранее.

Ответ 1

Трюк прост:

Существует веб-просмотр. Это отображает ваше приложение. Веб-просмотр будет обрабатывать все события навигации.

Если браузер переходит к:

file:///!gap_exec 

или

gap://

веб-просмотр отменяет навигацию. Все, что находится за этими строками, повторно используется как идентификатор, чтобы получить конкретный плагин/метод-плагин и параметр:

Пример псевдо-url:

gap://echoplugin/echothistext?Hello World

Это заставит phonegap искать echoplugin и вызвать метод echothistext для отправки текста "Hello World" в (родной) плагин.

Обновление

Обратный путь от native к javascript (или может быть) загружает URL-адрес javascript: в веб-просмотр.

Конкретная реализация немного сложнее, потому что javascript должен отправить обратный код на собственный код. Одновременно может работать более одного нативного вызова. Но на самом деле это совсем не магия. Просто номер, чтобы получить правильный JSON с правильным javascript-обратным вызовом.

Существуют разные способы связи между платформой и javascript. Для Android существует три или четыре разных моста.

Ответ 2

Я пытаюсь понять это более подробно. В принципе, на стороне iOS есть 2 метода, которые могут помочь...

Из источников кажется, что cordova отправляет сообщение "READY" с помощью webView: shouldStartLoadWithRequest:... и затем получает результаты со вторым сообщением, но я не уверен.

Кордова Источники iOSExec

Там многое можно узнать.