2012-10-12 226 views
11

He comenzado a desarrollar aplicaciones html para plataformas multiples. Hace poco escuché sobre Cordova 2.0 (PhoneGap) y desde entonces tengo curiosidad por saber cómo funciona el puente. Después de mucho código caminaba, vi que el Exec.js es el código donde llamada de JS -> Nativo sucede¿Cómo funciona phoneGap (Cordova) internamente, iOS específica

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 quieren entender cómo funciona, cuál es el concepto que aquí, lo que hace de archivos: ///! gap_exec o gap: // ready do? y cómo la llamada propgate a las capas más bajas (capas de código nativas)

muchas gracias por adelantado.

Respuesta

12

El truco es fácil:

Hay una vista web. Esto muestra tu aplicación. La vista web manejará todos los eventos de navegación.

Si el navegador se utilizan para navegar:

file:///!gap_exec 

o

gap:// 

la vista web cancelará la navegación. Todo detrás de estas cadenas se vuelve a utilizar como identificador, para obtener el plugin/plugin-método y parámetros concretos:

pseudo-url ejemplo:

gap://echoplugin/echothistext?Hello World 

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

actualización

El camino de regreso de nativos de Javascript es (o puede ser) la carga de una url javascript: a la vista web.

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

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

+0

Me di cuenta de esto hace mucho tiempo. Pero tu respuesta es correcta. Gracias – 2ndlife

+0

podría actualizar su respuesta, si todavía está siguiendo cordova? Parece que el ejecutor inyecta un iframe con src = "gap: // ready" y ese es el único js ... entonces CDVViewController.m intercepta todas las solicitudes para 'gap' con shouldStartLoadWithRequest luego CDVCommandQueue.m usa stringByEvaluatingJavaScriptFromString para obtener la cola de comandos js . – premiumFrye

+0

@Christian Kuetbach: Dijo que "podría haber más de una llamada nativa ejecutándose al mismo tiempo". Mi situación es exactamente la misma. Necesito llamar a un método de complemento nativo más de una vez al mismo tiempo. También quiero pasar una respuesta del complemento nativo (como resultado del complemento mediante el ID de devolución de llamada) para cada llamada a un complemento desde JavaScript. No estoy seguro de cómo se comporta Córdoba en este contexto. He hecho una pregunta por separado para este propósito. Si es posible, ¿podría mirar este http://stackoverflow.com/q/32139534/2035845. –

4

Estoy tratando de resolver esto con más detalle, también. Básicamente hay 2 métodos en el lado IOS que puede ayudar ...

De las fuentes que parece Cordova envía una "READY" mensaje usando web View: shouldStartLoadWithRequest: ... y luego recoge los resultados con el segundo mensaje, pero no estoy seguro.

Cordova Sources iOSExec

Hay mucho que aprender allí.

+0

Creo que tienes razón, y ver tu respuesta me salvó de ir al agujero de conejo equivocado durante demasiadas horas. Mira mi respuesta a @ Christian-kuetbach arriba para una perspectiva de 10,000 pies – premiumFrye

Cuestiones relacionadas