Artículo Desactualizado, no utilices jQuery Mobile,
más bien usa Ionic Framework! :D
Este artículo esta enfocado en explicar como gracias al framework gratis y de código abierto PhoneGap, el cuál también se conoce como Apache Cordova, logramos hoy en día desarrollar aplicaciones móviles para diversas plataformas como iOS, Android, Blackberry, Windows Phone, Palm WebOS, Bada y Symbian mediante las tecnologías HTML, CSS y Javascript. Posteriormente observaremos como integrar el servicio Mobile Services de Windows Azure con nuestras aplicaciones.
PhoneGap es un producto de código abierto (creado por la empresa nitobi la cual fue adquirida por la empresa Adobe) que fue donado a la Fundación Apache, de ahí que se conoce con el nombre de Cordova. Este producto fue pensado para correr aplicaciones nativas en diversas plataformas con un mismo código fuente.
Una breve introducción: Aplicaciones Empresariales con PhoneGap.
Cada aplicación se ejecuta dentro de un componente WebView en una envoltura de una aplicación nativa y mediante la librería de Javascript puede interactuar con diversas características del dispositivo, gracias a los enlaces que proporciona la API. Ver documentación http://docs.phonegap.com/.
Para compilar nuestras aplicaciones existen diversos medios, entre ellos se destaca el Servicio en la Nube PhoneGap Build el cual hace parte del paquete de servicios Adobe Creative Cloud. Entre otras opciones para compilar por nosotros mismos tenemos Android SDK (ver ejemplo http://www.youtube.com/watch?v=8l80rKwaTeg), Xcode para iOS, BlackBerry WebWorks, Nokia Web Tools, Windows Phone SDK, etc.
PhoneGap Build
Gracias a este Servicio en línea que nos brinda la empresa Adobe podemos compilar nuestros archivos HTML, CSS y Javascript que compone nuestra aplicación. Para realizar esto existen diversas maneras:
Para acceder a este servicio es necesario obtener una cuenta en https://build.phonegap.com/.
Configurar la aplicación
La configuración más básica de nuestras aplicaciones, si estamos utilizando PhoneGap Build, se puede realizar mediante la misma página, en la configuración de nuestra aplicación. También existe una herramienta para realizar la configuración de nuestra aplicación por si no deseamos y no es necesario realizarla manualmente http://aj-software.com/configap/. En todos los casos se esta generando un archivo config.xml con los datos que nosotros mismos estemos proporcionando, así como los permisos que requerirá nuestra aplicación.
Emuladores
Si deseamos emplear emuladores para ejecutar nuestras aplicaciones ya compiladas en el PC, ver aquí http://www.mobilexweb.com/emulators.
También existe una excelente extensión para Chrome la cual te permite emular desde el navegador tu aplicación sin haberse aún compilado, Apache Ripple. Ver ejemplos con la extensión: http://emulate.phonegap.com/
- Creando nuestra primera aplicación móvil con PhoneGap
Entramos a la página de PhoneGap y procedemos a dar Click en Instalar PhoneGap.
Como observaremos PhoneGap desde la versión 3.0 cambió y ya se puede instalar como un módulo de Node.Js, para poder crear mediante la línea de comandos la estructura de nuestras aplicaciones y posteriormente compilarlas.
Por lo cuál, si no lo tenemos instalado entraremos a la página para descargarlo. El automáticamente reconocerá nuestro Sistema Operativo y procederá a bajar la última versión disponible.
Cuando ya este instalado, procedemos a abrir la consola Node.js command prompt.
Nos ubicaremos en la ruta donde estarán los archivos de nuestra nueva aplicación.
Como explican en la página de instalación de PhoneGap, para crear una nueva aplicación procedemos a escribir en la consola el siguiente comando. Donde myapp será el nombre que le quieras dar a la carpeta de tu aplicación (Es el comando más básico que hay, mi recomendación es ver la documentación en la página de PhoneGap).
Con esto ya tendremos los archivos iniciales para trabajar con PhoneGap.
Ahora, nosotros nos ubicaremos en la carpeta www, en donde estarán los archivos que nosotros creemos y editemos, los cuales compondrán nuestra aplicación.
Podemos observar que tenemos una estructura simple para nuestro desarrollo, esta se puede modificar perfectamente pero así como esta por defecto es muy limpia, parecida a la que nos aporta la plantilla Boilerplate. Borramos el html “spec” y la carpeta con el mismo nombre, los cuales son utilizados para realizar pruebas unitarias a nuestro código Javascript mediante el Framework Jasmine.
El contenido ubicado en nuestro archivo index.html es por defecto el que se verá al iniciar nuestra aplicación y así como un Sitio Web, puedes tener múltiples páginas html. El archivo config.xml como se explicó previamente tendrá la configuración de nuestra aplicación, permisos que nosotros necesitemos de la API para acceder a las características del dispositivo. Ver documentación en la página de PhoneGap.
En este ejemplo voy a usar jQuery Mobile, pero no es necesario emplear ningún Framework (mejor opción en cuanto al rendimiento).
Además existen muchas otras buenas opciones que se pueden emplear, como:
Ahora nos dirigimos al Index.html en nuestro editor de código preferido.
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="utf-8" /><!-- Segun el lenguaje -->
- <meta name="format-detection" content="telephone=no" /><!-- iOS desactiva la deteccion automatica de posibles numeros de telefono en un documento web-->
- <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width, height=device-height, target-densitydpi=device-dpi" /><!-- Configura la visualizacion de la pagina -->
- <link rel="stylesheet" type="text/css" href="css/index.css" /><!-- Nuestra hoja de estilos -->
- <title>Mi primera Aplicacion</title>
- </head>
- <body>
- <!-- Aqui va el contenido -->
- <script type="text/javascript" src="phonegap.js"></script><!-- Al compilar se agregara el Javascript de PhoneGap adecuado a la plataforma -->
- <script type="text/javascript" src="js/index.js"></script><!-- Nuestro Javascript -->
- <script type="text/javascript">
- app.initialize();//Inicializamos los Eventos de nuestra app
- </script>
- </body>
- </html>
Procedemos a descargar jQuery Mobile, mi recomendación es no bajar todos los temas que vienen por defecto sino ir a la sección de temas y elegir uno solo para personalizarlo a nuestro gusto.
Procedemos a pegar los archivos en la carpeta “css” de nuestra aplicación, además de seguir el procedimiento indicado en el código html del ejemplo con respecto al css, por lo cual también debemos de bajar el jquery.mobile.structure-1.3.2.min.css. Recordar limpiar el index.css o en su defecto borrarlo.
Ahora descargamos la versión reducida de jQuery Mobile (Excepto si deseas cambiar el javascript, lo cual es poco probable). Aunque mi recomendación es que al terminar de desarrollar tu aplicación, procedas a ejecutar el download builder tool para seleccionar únicamente las características que implementaste y descargar la versión más reducida, esto con el fin de mejorar el rendimiento de la aplicación.
Ahora procedemos a descargar el Javascript a la carpeta “js”, tanto la librería jQuery como la librería jQuery Mobile.
Ahora ya tenemos todo listo, es solo empezar a diseñar nuestras páginas, un breve ejemplo.
index.html
- <!DOCTYPE html>
- <html>
- <head>
- <!-- Segun el lenguaje -->
- <meta charset="utf-8" />
- <!-- iOS desactiva la deteccion automatica de posibles numeros de telefono en un documento web-->
- <meta name="format-detection" content="telephone=no" />
- <!-- Configura la visualizacion de la pagina -->
- <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width, height=device-height, target-densitydpi=device-dpi" />
- <!-- jQuery Mobile y jQuery -->
- <link href="css/myapp.min.css" rel="stylesheet" />
- <link href="css/jquery.mobile.structure-1.3.2.min.css" rel="stylesheet" />
- <script src="js/jquery-1.9.1.min.js"></script>
- <script src="js/jquery.mobile-1.3.2.min.js"></script>
- <!-- Nuestra hoja de estilos -->
- <link rel="stylesheet" type="text/css" href="css/index.css" />
- <title>Mi primera Aplicacion</title>
- </head>
- <body>
- <!-- Aqui va el contenido -->
- <div data-role="page" id="index" data-theme="a">
- <header data-role="header" data-position="fixed">
- <h1>Nicholls</h1>
- <a href="#contact" data-transition="slide" data-role="button">Contactar</a>
- </header>
- <section data-role="content">
- <ul data-role="listview" data-inset="true">
- <li>
- <img src="img/nicholls.jpg" alt="Hola!" />Juan David Nicholls
- </li>
- </ul>
- <div data-role="collapsible-set">
- <div data-role="collapsible" data-collapsed="false">
- <h2>Extracto</h2>
- <p>
- Desarrollador de Software y Aplicaciones Web. Front-end HTML5, CSS3, Javascript(Jquery), Jquery Mobile, PhoneGap y Back-end ASP.NET , NodeJS
- </p>
- </div>
- <div data-role="collapsible" data-collapsed="true">
- <h2>Experiencia</h2>
- <p>
- Desarrollador de Software en Pacifica, julio de 2012 hasta la actualidad.
- </p>
- </div>
- </div>
- <div id="contacts" class="ui-grid-a">
- <div class="ui-block-a">
- <a href="#" data-role="button" id="beep">Sonar</a>
- </div>
- </div>
- </section>
- <footer data-role="footer" data-position="fixed">
- <h1>2013</h1>
- </footer>
- </div>
- <div data-role="page" id="contact" data-add-back-btn="true">
- <div data-role="header" data-position="fixed">
- <h1>Nicholls</h1>
- </div>
- <div data-role="content">
- <label for="nombre">Nombre</label>
- <input type="text" name="nombre" id="nombre" />
- <label for="email">Email</label>
- <input type="email" name="email" id="email" />
- <label for="asunto">Asunto</label>
- <input type="text" name="asunto" id="asunto" />
- <label for="message">Mensaje</label>
- <textarea id="message" name="message"></textarea>
- </div>
- <footer data-role="footer" class="ui-bar" data-position="fixed">
- <div data-role="controlgroup" data-type="horizontal">
- <a id="sendmessage" href="#" data-icon="check" data-role="button">Aceptar</a>
- <a href="#index" data-icon="delete" data-role="button">Cancelar</a>
- </div>
- </footer>
- </div>
- <!-- Al compilar se agregara el Javascript de PhoneGap adecuado a la plataforma -->
- <script type="text/javascript" src="phonegap.js"></script>
- <!-- Nuestro Javascript -->
- <script type="text/javascript" src="js/index.js"></script>
- <!-- Aqui estara mas adelante el llamado a la API que nos brindara acceso a nuestros Mobile Services de Windows Azure -->
- <script type="text/javascript">
- app.initialize();//Inicializamos los Eventos de nuestra app
- </script>
- </body>
- </html>
Nuestro Javascript.
index.js
- var app = {
- // Application Constructor
- initialize: function() {
- this.bindEvents();
- },
- // Bind Event Listeners
- bindEvents: function () {
- document.addEventListener('deviceready', this.onDeviceReady, false);
- },
- // deviceready Event Handler
- onDeviceReady: function () {
- navigator.notification.alert("Tu aplicacion a inicializado con exito.", function () {
- }, "Bienvenido", "Aceptar");
- document.getElementById("beep").addEventListener("click", app.Beep, false);
- document.getElementById("sendmessage").addEventListener("click", app.SendMessage, false);
- },
- Beep: function () {
- navigator.notification.beep(1);
- },
- SendMessage: function () {
- if ($("#nombre").val().replace(/ /g, "") == "") {
- navigator.notification.alert("Ingrese su Nombre.", function () {
- }, "Alerta", "Aceptar");
- return;
- }
- if (!/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test($("#email").val())) {
- navigator.notification.alert("Ingrese su Email.", function () {
- }, "Alerta", "Aceptar");
- return;
- }
- if ($("#asunto").val().replace(/ /g, "") == "") {
- navigator.notification.alert("Ingrese su Asunto.", function () {
- }, "Alerta", "Aceptar");
- return;
- }
- if ($("#message").val().replace(/ /g, "") == "") {
- navigator.notification.alert("Ingrese su Mensaje.", function () {
- }, "Alerta", "Aceptar");
- return;
- }
- //Aqui estara el codigo para conectarnos a nuestro Mobile Service e insertar los datos
- }
- };
Previsualización
La página del Contactar guardará los registros con el Servicio de Windos Azure, Mobile Services que explicaré más adelante en este artículo.
Siempre te recomiendo minificar todos tus Javascript antes de compilar tu aplicación. Para esto existe una muy buena herramienta llamada Grunt.js
La cual te permite realizar muchas tareas importantes como concatenar, reducir, validar, remover código, etc. Esta la explicaré en artículos posteriores.
Antes de compilar nuestras aplicaciones procederemos a configurarlas según la plataforma, en este ejemplo estoy haciendo uso de las notificaciones y probaré en un Android, por lo cual esta es mi configuración:
config.xml
- <?xml version='1.0' encoding='utf-8'?>
- <widget id="com.phonegap.nicholls" version="1.0.0" xmlns="http://www.w3.org/ns/widgets" xmlns:gap="http://phonegap.com/ns/1.0">
- <name>Nicholls</name>
- <description>
- Esta es mi primera aplicacin.
- </description>
- <author email="jdnichollsc@hotmail.com" href="http://nicholls.azurewebsites.net/">
- Juan David Nicholls
- </author>
- <feature name="http://api.phonegap.com/1.0/device" />
- <feature name="Notification">
- <param name="android-package" value="org.apache.cordova.Notification" />
- </feature>
- <icon src="icon.png" />
- <icon gap:density="ldpi" gap:platform="android" src="res/icon/android/icon-36-ldpi.png" />
- <icon gap:density="mdpi" gap:platform="android" src="res/icon/android/icon-48-mdpi.png" />
- <icon gap:density="hdpi" gap:platform="android" src="res/icon/android/icon-72-hdpi.png" />
- <icon gap:density="xhdpi" gap:platform="android" src="res/icon/android/icon-96-xhdpi.png" />
- <gap:splash gap:density="ldpi" gap:platform="android" src="res/screen/android/screen-ldpi-portrait.png" />
- <gap:splash gap:density="mdpi" gap:platform="android" src="res/screen/android/screen-mdpi-portrait.png" />
- <gap:splash gap:density="hdpi" gap:platform="android" src="res/screen/android/screen-hdpi-portrait.png" />
- <gap:splash gap:density="xhdpi" gap:platform="android" src="res/screen/android/screen-xhdpi-portrait.png" />
- </widget>
Para compilar nuestras aplicaciones procedemos a escribir en la consola el siguiente comando. Donde android es el nombre de la plataforma en la que queramos compilar nuestra aplicación. Si no puede compilarla localmente con este comando, buscará compilarla de manera remota con el servicio PhoneGap Build.
- Windows Azure Mobile Services
La verdad no me enfocaré en explicar detalladamente este servicio debido a los excelente artículos que pueden encontrar en el Blog Chalalo Land, por lo cual solo mostraré el procedimiento que seguí:
Ingresamos a nuestro Portal de Windows Azure y procedemos a crear un nuevo Servicio Móvil.
Entramos en la sección de Datos de nuestro Servicio Móvil y procedemos a crear una nueva Tabla.
Nos dirigimos al administrador de nuestra Base de Datos.
En diseñar Editamos nuestra Tabla y agregamos las columnas que necesitemos.
Cerramos Sesión y nos dirigimos de nuevo a nuestro Servicio Móvil. Procedemos a descargar el ejemplo de código para la Plataforma HTML/Javascript.
Procedemos a copiar el llamado a la API de Windows Azure Mobile Services que viene en el ejemplo y pegarlo en nuestra aplicación.
También entramos al archivo .js del ejemplo y podemos observar como realizar CRUD a la Tabla de nuestra Base de Datos. Nos copiamos el cliente y en este ejemplo solo realizaré una inserción a nuestra Tabla Messages previamente creada.
Ya solo queda compilar nuestra aplicación como lo expliqué previamente y si estamos utilizando el Servicio de PhoneGap Build entramos y descargamos el ejecutable correspondiente a la plataforma que hayamos configurado, en mi caso fue Android por lo cual me baja un .apk y pude ejecutarlo perfectamente en el móvil de un amigo (S4 Mini) :D
a436f577-e819-4a4a-84a2-a54100bdfd38|4|5.0|96d5b379-7e1d-4dac-a6ba-1e50db561b04