Arquitectura de PhoneGap/Cordova
OJO: Todo lo que voy a contar está basado en la versión para Android de Cordova. Supongo que, en líneas generales, será similar en el resto de versiones (iOS, BlackBerry, etc.).La arquitectura global de Cordova es algo así:
Arquitectura de PhoneGap/Cordova
Toda la funcionalidad existente en Cordova (GPS, acelerómetro, lista de contactos, …) está implementada como un plugin, con su parte Javascript y su parte nativa.
Podemos usar el mismo sistema que los plugins de Cordova para añadir nuevas funcionalidades. Para eso necesitaremos:
- Crear la parte Javascript del plugin, que será el interface disponible para nuestra aplicación web.
- Crear la parte nativa del plugin, que será invocada desde el código Javascript y contendrá la implementación de la funcionalidad.
Creando el interface en Javascript
El código que se necesita para crear el plugin en Javascript es el siguiente:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| var GoTo = function() {};GoTo.prototype.location = function(address, successCallback, failureCallback) { return PhoneGap.exec( successCallback, failureCallback, 'GoTo', // Nombre con el que está registrado el plugin Java 'location', // Acción invocada [address]);};cordova.addConstructor(function() { cordova.addPlugin("goTo", new GoTo());}); |
GoTo que expone un único método location que podremos invocar indicando la dirección a la queremos navegar y dos callbacks que serán invocadas de forma asíncrona cuando se complete la invocación, una para el caso de que todo funcione, successCallback, y otra por si hay algún problema, failureCallback.La implementación del método usa
PhoneGap para lanzar, a
través de Cordova, la invocación de la parte nativa del plugin. Para
pasar parámetros hacia la parte nativa usaremos un array que será
serializado como JSON.Por último, debemos añadir a cordova el plugin, lo que hacemos con el último fragmento de código:
1
2
3
| cordova.addConstructor(function() { cordova.addPlugin("goTo", new GoTo());}); |
goTo al objeto plugins y podremos usarlo fácilmente desde Javascript:
1
| plugins.goTo.location("Plaza Mayor, Madrid, España"); |
Implementando la parte nativa
Para implementar la parte nativa habrá que usar el lenguaje nativo del dispositivo. En el caso de Android, esto implica escribir una clase Java, que en nuestro ejemplo tendrá el siguiente aspecto:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| public class GoToPlugin extends Plugin { @Override public PluginResult execute(String action, JSONArray data, String callbackId) { try { Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse("google.navigation:q=" + data.getString(0))); this.ctx.startActivity(i); return new PluginResult(Status.OK); } catch (Exception e) { System.err.println(e.getStackTrace()); return new PluginResult(Status.ERROR); } }} |
Plugin en cuyo método execute debemos implementar la funcionalidad del plugin. Los parámetros de
execute incluyen:- La acción a realizar. En este caso sólo tenemos una,
location, pero podríamos tener varias y en elexecuterealizar distintas acciones en función del valor del parámetro. - Los parámetros de la acción, que recibimos encapsulados en un array
JSON. En nuestro caso el array tiene un único elemento que es un
Stringcon la dirección a la que queremos dirigirnos. - El id de las callback asociadas a la invocación. En este ejemplo no lo utilizamos.
Intent para indicar que queremos navegar a una ubicación y dejamos al sistema que inicie ese Intent, con lo que buscará la aplicación asociada y la activará.Para registrar el plugin en Cordova es necesario modificar el fichero
/res/xml/plugins.xml del proyecto de Eclipse y añadir nuestro plugin:
1
2
3
4
5
| <?xml version="1.0" encoding="utf-8"?><plugins> ... <plugin name="GoTo" value="koalite.cordova.GoToPlugin"/></plugins> |
plugins.xml es el nombre que debemos usar luego desde Javascript al usar el método PhoneGap.exec(...). Conclusiones
Cuando se desarrollan aplicaciones sobre plataformas no nativas es fundamental tener algún mecanismo para poder ejecutar código nativo y acceder a funcionalidades que no estén cubiertas por el framework que estás utilizando. Creedme, he padecido mucho con .NETCF y sé de lo que hablo. Llega un momento en que Platform Invoke se convierte en uno de tus mejores amigos.En Cordova la creación de plugins para salir del mundo HTML+JS+CSS y llegar hasta el dispositivo físico es francamente sencillo y está muy bien resuelto, lo que da mucha tranquilidad. No hay nada peor que saber que la plataforma para la que estás desarrollando soporta algo pero tu lenguaje no, y con el sistema de plugins de Cordova es sencillo remediar esa situación cuando se presenta
No hay comentarios:
Publicar un comentario