¿Cómo funciona phoneGap (Cordova) internamente, específico de iOS?

He comenzado a desarrollar aplicaciones html para plataforms múltiples. Hace poco escuché acerca de Cordova 2.0 (PhoneGap) y desde entonces tengo curiosidad por saber cómo funciona el puente. Después de mucho caminar por el código, vi que el Exec.js es el código donde se llama desde JS -> Native happens

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"; 

Pero quiero entender cómo funciona eso, ¿cuál es el concepto aquí, qué file: ///! Gap_exec o gap: // ¿listo? y cómo llama la puerta de acceso a las capas inferiores (capas de código nativo)

Muchas gracias de antemano.

El truco es fácil:

Hay una vista web. Esto muestra su aplicación. La vista web se encargará de todos los events de navigation.

Si el browser navega a:

 file:///!gap_exec 

o

 gap:// 

la vista web cancelará la navigation. Todo lo que está detrás de estas cadenas se reutiliza como un identificador, para get el complemento y el método concreto y el parámetro:

Ejemplo de pseudourl:

 gap://echoplugin/echothistext?Hello World 

Esto hará que phonegap busque un echoplugin y llame al método echothistext para enviar el text "Hello World" al complemento (nativo).

actualizar

El return de nativo a javascript es (o puede ser) cargar javascript: url en la vista web.

La implementación concreta es un poco más compleja, porque el javascript tiene que enviar un ID de callback al código nativo. Podría haber más de una llamada nativa ejecutándose al mismo time. Pero, de hecho, esto no es magia en absoluto. Solo un número para get el JSON correcto al javascript-callback correcto.

Existen diferentes forms de comunicarse entre la plataforma y el javascript. Para Android hay tres o cuatro puentes diferentes.

Estoy intentando entender esto con más detalle también. Básicamente hay 2 methods en el lado iOS que pueden ayudar …

  • – webView: shouldStartLoadWithRequest: navigationType: y
  • – stringByEvaluatingJavaScriptFromString: script

De las fonts parece que Cordova envía un post "READY" usando webView: shouldStartLoadWithRequest: … y luego recoge los resultados con el segundo post, pero no estoy seguro.

Cordova Fuentes iOSExec

Hay mucho que aprender allí.