<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>alfonsomarin</title>
	<atom:link href="http://alfonsomarin.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://alfonsomarin.com</link>
	<description></description>
	<lastBuildDate>Tue, 13 Sep 2016 13:39:14 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.4.19</generator>
	<item>
		<title>Geolocalización con Apache Cordova / Phonegap: posicionamiento, seguimiento en background y geofence</title>
		<link>http://alfonsomarin.com/geolocalizacion-con-apache-cordova-phonegap-posicionamiento-seguimiento-en-background-y-geofence/</link>
					<comments>http://alfonsomarin.com/geolocalizacion-con-apache-cordova-phonegap-posicionamiento-seguimiento-en-background-y-geofence/#comments</comments>
		
		<dc:creator><![CDATA[alfonso]]></dc:creator>
		<pubDate>Tue, 13 Sep 2016 13:39:14 +0000</pubDate>
				<category><![CDATA[Desarrollo Móvil]]></category>
		<category><![CDATA[cordova]]></category>
		<category><![CDATA[phonegap]]></category>
		<guid isPermaLink="false">http://alfonsomarin.com/?p=1128</guid>

					<description><![CDATA[<p>Entre los sensores que incorpora de serie cualquier smartphone hoy día, sin duda alguna destaca el sensor GPS como el que más funcionalidades extra puede dotar a nuestras aplicaciones. Desde mi punto de vista es de lo mejor que se ha incorporado a un teléfono móvil después de la cámara. En este artículo quiero analizar [&#8230;]</p>
<p>La entrada <a rel="nofollow" href="http://alfonsomarin.com/geolocalizacion-con-apache-cordova-phonegap-posicionamiento-seguimiento-en-background-y-geofence/">Geolocalización con Apache Cordova / Phonegap: posicionamiento, seguimiento en background y geofence</a> se publicó primero en <a rel="nofollow" href="http://alfonsomarin.com">alfonsomarin</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Entre los sensores que incorpora de serie cualquier smartphone hoy día, sin duda alguna destaca el sensor GPS como el que más funcionalidades extra puede dotar a nuestras aplicaciones. Desde mi punto de vista es de lo mejor que se ha incorporado a un teléfono móvil después de la cámara.</p>
<p>En este artículo quiero analizar distintos usos de posicionamiento que pueden requerir nuestras aplicaciones y ver cómo podemos conseguirlos cuando estamos desarrollando nuestra aplicación con Apache Cordova o PhoneGap.</p>
<p>Como funcionalidades asociadas a la localización pueden enumerarse muchas, pero podríamos decir que todas ellas están basadas en los siguientes escenarios:</p>
<ul>
<li><b>Posicionamiento puntual</b>: es cuando necesitamos saber las coordenadas longitud y latitud del usuario de forma puntual, por ejemplo para adjuntarlas a una foto, un formulario, consultar una API que nos devuelva datos geolocalizados, etc.</li>
<li><b>Seguimiento del usuario en primer plano</b>: es cuando necesitamos monitorizar la posición del usuario mientras usa la aplicación porque probablemente esté moviéndose y necesitemos actualizarla en la interfaz de nuestra aplicación, probablemente actualizando dicha posición en un mapa. Un ejemplo claro de esto sería el juego Pokemon Go o Glas aplicaciones de mapas de Apple y Google.</li>
<li><b>Seguimiento del usuario en background</b>: es cuando necesitamos monitorizar completamente la ubicación del usuario, esté usando o no nuestra aplicación. En este escenario sería el sistema operativo quien se encargaría de ir ejecutando periódicamente nuestra aplicación para informarle de la posición del usuario.</li>
<li><b>Geofence</b>: aplicaciones que únicamente necesitan saber cuando el usuario pasa por ciertas zonas más o menos amplias, donde el sistema operativo únicamente avisará a nuestra aplicación si pasa por alguna de estas zonas.</li>
</ul>
<p>Para poder abordar estos escenarios, vamos a ver los siguientes posibilidades:</p>
<ul>
<li>API HTML5</li>
<li>Plugin oficial de Apache Cordova de Geolocalización</li>
<li>Plugin para Geolocalización en background</li>
<li>Plugin para Geofence.</li>
</ul>
<h2>Posicionamiento agresivo y consumo de batería.</h2>
<p>Antes de continuar me gustaría comentar el principal problema asociado a los sensores GPS, especialmente cuando se hace seguimiento de la posición del usuario: el incremento en el consumo de energía y por tanto la reducción de su autonomía del dispositivo.</p>
<p>Hay que tener en cuenta que a día de hoy no es estrictamente necesario asociar sensores GPS a la posibilidad de obtener la localización del usuario, pues es posible realizar geolocalización mediante el uso de <a href="https://en.wikipedia.org/wiki/Wi-Fi_positioning_system" target="_blank">posicionamiento Wifi</a> o posicionamiento basado en triangulación de estaciones de repetición móviles.  Este tipo de localización no es tan exacta como la localización basada en sensores, pero su impacto en la batería es prácticamente nulo en comparación a la activación de GPS.</p>
<p>En este contexto, se suele hablar de posicionamiento agresivo el realizado por sensores GPS, el cual es muy exacto pero consume mucha batería, y posicionamiento no agresivo al realizado mediante triangulación wifi o repetidor, el cual puede no ser tan exacto aunque su consumo es muy reducido. En general es deseable hacer uso de posicionamiento agresivo únicamente cuando necesitemos un alto grado de exactitud en la posición del usuario.</p>
<h2>API W3C HTML5 de Geolocalización</h2>
<p>Con HTML5 podemos obtener la posición de un usuario desde el navegador web gracias a la<a href="https://dev.w3.org/geo/api/spec-source.html"> API de Geolocalización</a> definida por el W3C. Fue una de las primeras APIs incluidas en el conjunto de especificaciones de HTML5 y por tanto su <a href="http://caniuse.com/#feat=geolocation">disponibilidad</a> en los navegadores actuales es bastante alta.</p>
<p>Es una API muy sencilla que que expone los siguientes métodos accesibles desde window.navigator.geolocation:</p>
<ul>
<li><i>getCurrentPosition</i>: obtiene las coordenadas actuales del dispositivo sobre el que se ejecuta la aplicación.</li>
<li><i>watchPosition</i>: Monitorizar la posición del dispositivo, de forma que cada variación de coordenadas nos sea notificada.</li>
<li><i>clearWatch</i>: indicamos que ya no queremos seguir monitorizando y que cesen las llamadas de notificación de cambio de posición.</li>
</ul>
<p>Esta API nos simplifica mucho la vida porque nos independiza de los complicados escenarios que puede haber detrás de la geolocalización, pues nos garantiza que se nos devolverá la “mejor” localización posible, en caso de poder obtener una. Si el dispositivo tiene sensores GPS, wifi o señal de radio los utilizará para obtener la posición en base a ellos, donde únicamente podremos saber la calidad o el nivel de precisión de dicha señal.</p>
<p>Veamos qué información podemos obtener a través de esta API. La función <i>getCurrentPosition</i> tiene la siguiente definición:</p>
<pre lang="javascript">window.navigator.geolocation.getCurrentPosition(successCallback, errorCallback, options)
</pre>
<p>Como vemos, se trata de una función asíncrona donde le pasaremos una función a ejecutar en caso de éxito, una función a ejecutar en caso de fracaso, y un objeto con algunas opciones de configuración. En caso de éxito, a la función successCallback se le pasará un objeto con los siguientes datos:</p>
<ul>
<li><strong>longitude</strong>: coordenada de longitud</li>
<li><strong>latitude</strong>: coordenada de latitud</li>
<li><strong>altitude</strong>: altitud en metros, o null si el dispositivo no es capaz de calcularla</li>
<li><strong>accuracy</strong>: nivel de exactitud de coordenadas, especificada en metros. A más metros menos exactitud</li>
<li><strong>altitudeAccuracy</strong>: exactitud en la altitud, también en metros.</li>
<li><strong>heading</strong>: dirección en la que se mueve el dispositivo, en grados centígrados. Si el dispositivo está quieto será NaN o null si el dispositivo no es capaz de obtener dicha información</li>
<li><strong>speed</strong>: velocidad en metros por segundo.</li>
</ul>
<p>Como opciones, comentar que solo tendremos 3 a definir:</p>
<ul>
<li><strong>enableHightAccuracy</strong>: booleano indicando si deseamos activar la geolocalización precisa. En la mayoría de implementaciones esto se traduce en hacer uso del GPS, es decir, si deseamos geoposicionamiento agresivo o no agresivo.</li>
<li><strong>timeout</strong>: tiempo máximo definido en milisegundos para invocar a successCallback con la información de posicionamiento. Si se supera, se invocará errorCallback.</li>
<li><strong>maximumAge</strong>: podremos indicar si admitimos valores de posicionamiento cacheados y el tiempo máximo permitido para dichos valores. Lo definimos también en milisegundos</li>
</ul>
<p>Si aparte de conocer la posición del dispositivo deseamos hacerle un seguimiento, podremos hacer uso de la función watchPosition:</p>
<pre lang="javascript">
var watch_id = navigator.geolocation.watchPosition(successCallback, errorCallback, options)
</pre>
<p>Como vemos es muy parecida a getCurrentPosition, pero en vez de llamar una única vez a successCallback, se invocará cada vez que se registre un cambio de coordenadas en el dispositivo.</p>
<p>Por otra parte, gracias al identificador que devuelve esta función podremos cancelar la operación de seguimiento invocando a la función <i>clearPosition</i>(watch_id).</p>
<p>Como vemos, la información de posicionamiento que podemos obtener con esta API es más que suficiente para un gran número de escenarios e incluso podremos definir si deseamos posicionamiento preciso o no, lo cual como ya hemos visto nos permitirá ahorrar batería.</p>
<h2>Plugin PhoneGap/Apache Cordova de Geolocalización</h2>
<p>Como he comentado, la API HTML5 de geoposicionamiento se encuentra prácticamente en todos los navegadores actuales, pero no siempre fue así y es posible que todavía existan usuarios con navegadores obsoletos .</p>
<p>Por este motivo, cuando trabajamos bajo Apache Cordova / Phonegap es recomendable instalar el plugin de geolocalización, el cual se encarga de implementar la API definida por el W3C en aquellos dispositivos donde no esté disponible una implementación del navegador.</p>
<p>Si vas a usar geolocalización en tu aplicación, te recomiendo que instales este plugin ejecutando:</p>
<pre>
cordova plugin add cordova-geolocation-plugin
</pre>
<h2>Geolocalización en background</h2>
<p>Si lo que deseamos es realizar un seguimiento constante del dispositivo incluso si la aplicación pasa a ejecutarse en segundo plano, no será suficiente con el uso de las APIs comentadas. Uno de los problemas que encontramos en aplicaciones desarrolladas con Apache Cordova / PhoneGap es que no son capaces de ejecutar código en segundo plano. Una vez que la aplicación pasa a ejecutarse en segundo plano se detiene completamente la ejecución JavaScript del WebView, por lo que no podremos seguir capturando la posición del usuario.</p>
<p>Una primera aproximación para poder solventar este problema sería hacer uso de algún plugin que nos permitiese ejecutar código en segundo plano, como por ejemplo <a href="https://github.com/katzer/cordova-plugin-background-mode">cordova-plugin-background-mode</a>. Sin embargo, dicho plugin no será válido si queremos desarrollar sobre iOS y queremos publicar nuestra app en la App Store, ya que iOS tiene muy restringido qué funcionalidades pueden ejecutarse en segundo plano. Solo nos valdrá para aplicaciones que queramos off-store o empresariales.</p>
<p>La solución pasa por hacer uso de un plugin específico de geoposicionamiento en segundo plano:<a href="https://github.com/mauron85/cordova-plugin-background-geolocation">cordova-plugin-background-geolocation</a>. Este plugin nos permitirá seguir capturando la posición del usuario incluso si la aplicación pasa a segundo plano, tanto en iOS como en Android, y está optimizado para hacer un uso eficiente del posicionamiento y evitar que nuestra aplicación consuma excesiva batería. También nos servirá para geolocalizar en primer plano de una forma más eficiente, aunque para primer plano podremos seguir usando las APIs ya comentadas.</p>
<p>Con este plugin podremos definir una función JavaScript que se llamará cada vez que se registre un cambio significativo en las coordenadas del dispositivo. El sistema operativo se encargará de arrancar nuestra aplicación en segundo plano y llamará a dicha función para que procese la información de posicionamiento.</p>
<p>El plugin no solo es capaz de llamar a la función callback definida, sino que además será capaz de enviar por POST la posición registrada a una URL que definamos. Si no es capaz de enviarla en repetidos intentos (porque el dispositivo está sin cobertura, por ejemplo), las irá guardando en un buffer local hasta un máximo configurable y volverá a intentarlo enviando todas las coordenadas de posición acumuladas.</p>
<p>Lo primero que tendríamos que hacer sería instalar el plugin en nuestro proyecto:</p>
<pre>
cordova plugin add cordova-plugin-mauron85-background-geolocation
</pre>
<p>Hay que comentar que el plugin ya incluye las modificaciones necesarias en los proyectos para pedir los permisos correspondientes tanto en iOS como en Android para poder realizar geoposicionamiento en segundo plano.</p>
<p>Vamos a ver un ejemplo básico para ver cómo podríamos usar el plugin:</p>
<pre lang="javascript">
//como cualquier llamada a plugins Cordova/Phonegap, 
//deben hacerse tras el evento deviceready
document.addEventListener('deviceready', onDeviceReady, false);

function onDeviceReady () {
  //Esta es la función que se invocará en cada registro de posicionamiento en segundo plano
  var callbackFn = function(location) {
    console.log('[js] Posición en background:  ' + location.latitude + ',' + location.longitude);
    // Aquí incluímos lo que queramos hacer con la información, incluso enviarla
    // a un servidor si queremos.
    // jQuery.post(url, JSON.stringify(location));

    // Debemos informar que hemos terminado para que el sistema operativo
    // cierre ordenadamente nuestra aplicación
    backgroundGeolocation.finish();
  };

  var failureFn = function(error) {
    console.log('Error');
  };

  // Configuramos el plugin, indicando nuestra función callback y algunas opciones
  backgroundGeolocation.configure(callbackFn, failureFn, {
      desiredAccuracy: 10,
      stationaryRadius: 20,
      distanceFilter: 30,
      interval: 60000
  });

  // Activamos la geolocalización en segundo plano
  backgroundGeolocation.start();

  // Si en algún momento queremos pararla, podemos indicarlo con stop()
  backgroundGeolocation.stop();
}
</pre>
<p>A la hora de configurar el plugin mediante la función configure, podremos especificar algunos parámetros que nos permitirán ajustar la precisión y la frecuencia de los registros de posicionamiento, la URL a la que queremos que se envíen los registros o el máximo número de registros que se almacenarán el buffer que hemos comentado antes. Aquí hay que tener en cuenta que cuanto más frecuencia y precisión deseemos, más penalizaremos la batería de los dispositivos que ejecuten nuestra aplicación.</p>
<h2>Geofencing</h2>
<p>Por último, veremos un caso especial de geoposicionamiento en segundo plano, llamado Geofencing. Consiste en generar notificaciones de usuario cada vez que éste entre o salga (según queramos) de una determinada area circular, definida por unas coordenadas y un radio de amplitud en metros.</p>
<p>Personalizando y adaptando el plugin anterior podríamos implementar sin problemas un esquema de geofencing, pero si únicamente queremos hacer <i>tracking</i> de dispositivos para esta finalidad, probablemente nos interese conocer un plugin específico para esto: <a href="https://www.npmjs.com/package/cordova-plugin-geofence">cordova-plugin-geofence</a></p>
<p>Este plugin nos permitirá definir tantas zonas a monitorizar como queramos, indicando la longitud, latitud y radio de acción en metros de cada una de ellas. Indicaremos los datos de la notificación que queremos que se genere así como cuando queremos que se genere, si al entrar, al salir o en ambos casos.</p>
<p>Para probarlo, añadimos el plugin a nuestro proyecto</p>
<pre>
cordova add plugin cordova-plugin-geofence
</pre>
<p>Posteriormente lo primero que haremos será inicializar el plugin:</p>
<pre lang="javascript">
document.addEventListener('deviceready', function () {
  // window.geofence is now available
  window.geofence.initialize().then(function () {
    console.log("Successful initialization");
  }, function (error) {
    console.log("Error", error);
  });
}, false);
</pre>
<p>Una vez hecho esto, podremos ir añadiendo areas a monitorizar con la función addOrUpdate:</p>
<pre lang="javascript">
window.geofence.addOrUpdate({
  id: 'area1', //Identificador único que se asignará al área
  latitude: 37.663354, //Coordenada de latitud del centro del área
  longitude: -1.7042037, //Coordenada de longitud del centro del área
  radius: 300, //Radio del área en metros
  transitionType: TransitionType.ENTER, //Tipo de transición que deseamos: 1 - Entrada, 2 - Salida, 3 - Ambas
  notification: {
    id: 1, //id numérico de la notificación, opcional
    title: 'Entrando en Area', //Título de la notificación
    text: 'Has entrado en el área', //Texto de la notificación
  }
}).then(function () {
  console.log('Área añadida');
}, function (reason) {
  console.log('Fallo al añadir área', reason);
});
</pre>
<p>El plugin ofrece otras funciones para poder consultar las áreas de monitorización que tenemos definidas así como poder eliminarlas. Hay que tener en cuenta que una vez establecida un área, se dispararán las notificaciones mientras que ésta esté definida y no la borremos. Incluso si reiniciamos el dispositivo.</p>
<h2>Conclusión</h2>
<p>Hemos visto distintas herramientas que tenemos a nuestra disposición para poder implementar distintas funcionalidades asociadas al geoposicionamiento en nuestros proyectos Cordova /PhoneGap, y según lo que queramos hacer nos vendrán mejor unas u otras.</p>
<p>Creo que el principal factor a tener en cuenta es encontrar el equilibrio entre la precisión necesaria para cumplir con el cometido de nuestra aplicación y el consumo de energía que ello requerirá. Si hacemos un uso excesivo o muy agresivo del posicionamiento penalizaremos considerablemente la vida útil de la batería en los dispositivos donde ejecutemos nuestra aplicación, lo cual no suele gustar mucho a los usuarios y por tanto</p>
<p>La entrada <a rel="nofollow" href="http://alfonsomarin.com/geolocalizacion-con-apache-cordova-phonegap-posicionamiento-seguimiento-en-background-y-geofence/">Geolocalización con Apache Cordova / Phonegap: posicionamiento, seguimiento en background y geofence</a> se publicó primero en <a rel="nofollow" href="http://alfonsomarin.com">alfonsomarin</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>http://alfonsomarin.com/geolocalizacion-con-apache-cordova-phonegap-posicionamiento-seguimiento-en-background-y-geofence/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>Recursos para diseño de aplicaciones móviles</title>
		<link>http://alfonsomarin.com/recursos-para-diseno-de-aplicaciones-moviles/</link>
					<comments>http://alfonsomarin.com/recursos-para-diseno-de-aplicaciones-moviles/#comments</comments>
		
		<dc:creator><![CDATA[alfonso]]></dc:creator>
		<pubDate>Mon, 29 Aug 2016 19:48:39 +0000</pubDate>
				<category><![CDATA[Desarrollo Móvil]]></category>
		<guid isPermaLink="false">http://alfonsomarin.com/?p=1117</guid>

					<description><![CDATA[<p>No me considero un buen diseñador. No es que no me guste el diseño, al contrario, me encanta y cada día intento aprender más trucos y técnicas que me permitan dar un aspecto más atractivo a mis aplicaciones, pero reconozco que lo mío es la implementación y el desarrollo de funcionalidades, y en muchas ocasiones cuando [&#8230;]</p>
<p>La entrada <a rel="nofollow" href="http://alfonsomarin.com/recursos-para-diseno-de-aplicaciones-moviles/">Recursos para diseño de aplicaciones móviles</a> se publicó primero en <a rel="nofollow" href="http://alfonsomarin.com">alfonsomarin</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>No me considero un buen diseñador. No es que no me guste el diseño, al contrario, me encanta y cada día intento aprender más trucos y técnicas que me permitan dar un aspecto más atractivo a mis aplicaciones, pero reconozco que lo mío es la implementación y el desarrollo de funcionalidades, y en muchas ocasiones cuando tengo que enfrentarme a cuestiones de diseño entro en modo bloqueo donde la falta de ideas me hace perder mucho tiempo.</p>
<p>Si a tí te pasa algo parecido y no puedes contar con los servicios de un diseñador profesional, quiero compartir contigo algunos trucos y recursos que yo utilizo y que me ayudan a coger ideas a la hora de definir el aspecto visual de una aplicación móvil.</p>
<h2><b>Cuestiones a tener en cuenta</b></h2>
<p>A la hora de diseñar una aplicación desde cero tendremos que centrarnos en dos aspectos principales:</p>
<ul>
<li>El aspecto visual: cómo se visualizarán los componentes, gama de colores principales, aspecto de los botones, menús, tipografía, etc.</li>
<li>Arquitectura y navegación: cómo vamos a distribuir las secciones de nuestra aplicación, cómo será el menú de navegación, y en general todo lo que tenga que ver con la experiencia de usuario (UX).</li>
</ul>
<p>Los recursos que voy a comentar en este post están más orientados al primer punto, es decir a la definición del aspecto visual. Sin embargo algunos nos darán ideas sobre elementos de interfaz de usuario que podamos utilizar para definir la arquitectura de la aplicación y mejorar la experiencia de usuario.</p>
<p>En general buscaremos un estilo y un aspecto visual que nos sea útil en cualquier plataforma sobre la que desarrollemos, pues somos multiplataforma y queremos que nuestra aplicación se vea igual de  bien en cualquier dispositivo. Sin embargo, debemos intentar que nuestra aplicación haga uso en la medida de lo posible de los patrones de diseño recomendados en cada plataforma. Un ejemplo típico es el uso de botones explícitos para ir atrás en iOS que no deberíamos usar en Android, o el típico botón de “más acciones” representado por un icono de tres puntos verticales en Android, o que en iOS los paneles tabulados suelen incluir los iconos en la parte inferior de la pantalla y Android en la parte superior.</p>
<h2><b>1. Galerías de patrones de diseño</b></h2>
<p>Existen varias páginas web que recopilan distintos patrones de diseño agrupándolos por categorías y mostrando ejemplos encontrados en aplicaciones reales. Son una fuente de inspiración fenomenal pues nos permiten analizar las soluciones que han dado distintos diseñadores a distintas secciones típicas que podamos encontrar en una aplicación, como son los menús de navegación, las páginas de perfil, los listados o calendarios.</p>
<ul>
<li><strong><a title="iOS patterns" href="http://ios-patterns.com/" target="_blank">iOS patterns</a></strong>: disponemos de más de 500 patrones encontrados en las versiones de iOS de numerosas aplicaciones. Están centrados en las versiones para smartphone, no encontrando ideas para aplicaciones de tablet.</li>
<li><strong><a href="http://androidniceties.tumblr.com" target="_blank">Android Niceties</a></strong>: parecida a la anterior pero centrada en Android. Es un tumblr que van actualizando con capturas de distintas aplicaciones. Se echa en falta un poco de categorización como hacen otras páginas similares pero podremos usar el sistema de etiquetas para ver ejemplos más segmentados.</li>
<li><strong><a href="http://pttrns.com/" target="_blank">pttrns.com</a></strong>: Esta página me encanta. No solo podremos filtrar por elementos específicos de interfaz de usuario sino que podremos seleccionar la plataforma que nos interesa. Además, no solo se incluyen capturas de aplicaciones para smartphone sino que además podremos ver aplicaciones para tablets o incluso smartwatch (principalmente Apple Watch). Tremendamente recomendable.</li>
<li><strong><a href="http://www.mobile-patterns.com/" target="_blank">Mobile patterns</a></strong>: Aunque podemos seleccionar iOS y Android, básicamente encontraremos ejemplos de iOS, y una vez más solo contempla aplicaciones para smartphone.</li>
<li><strong><a href="http://capptivate.co/" target="_blank">capptivate.co</a></strong>: como novedad esta página web ofrece algunas de las capturas con animación incluída, donde no solo podremos coger ideas sobre aspecto visual sino que además podremos cogerlas sobre animaciones y transiciones entre elementos.</li>
<li><strong><a href="http://pinterest.com" target="_blank">Pinterest</a></strong>: Si de coger ideas se trata, no podía faltar la red social “visual” más popular. En ella buscando con términos como “Mobile UI”, “iOS UI” o “Android UI” encontraremos muchos más ejemplos que nos puedan servir de inspiración.</li>
</ul>
<h2><b>2. Kits de diseño</b></h2>
<p>Otra opción que podemos utilizar es buscar algún Kit UI destinado para móviles que nos den una solución completa a los elementos de interfaz más comunes de una aplicación móvil. Suelen ser diseños que vienen en en formato PSD (Photoshop) o para Sketch (SketchApp). Muestran pantallas completas a modo de capturas donde podremos ver cómo se muestran los elementos que componen el diseño y usarlos en nuestras propias aplicaciones. Muchos de estos kits ofrecen una versión gratuita donde limitan el número de elementos o un número reducido de pantallas, ampliándolas en las versiones de pago.</p>
<p>El problema de estos kits es que, al poder ser adquiridos ya sea gratuitamente o pagando por ellos, no se nos garantiza la exclusividad de los mismos, pudiendo darse el caso en el que nos encontrásemos otras aplicaciones haciendo uso de los mismos.</p>
<p>Por otra parte, hay que tener en cuenta que únicamente nos ofrecen las capturas y como mucho los elementos separados por capas para poderlos “trocear” y usar en nuestra aplicación, pero seremos nosotros quien finalmente los tengamos que “traducir” al lenguaje de maquetación de la plataforma de desarrollo que estemos utilizando. Si por ejemplo estamos haciendo una aplicación web o híbrida, tendremos que traducir todos esos elementos gráficos a HTML5 y CSS.</p>
<p>En las siguientes webs podremos encontrar Kits orientados a aplicaciones móviles:</p>
<ul>
<li><strong><a href="http://freebiesbug.com/psd-freebies/app-design/" target="_blank">freebiesbug.com</a></strong>: en esta web encontraremos numerosos recursos de diseño gratuítos, donde cuentan con una sección específica de kits para aplicaciones móviles. La mayoría de estos kits ofrecen versiones ampliadas de pago y estan disponibles en PSD y/o Sketch.</li>
<li><strong><a href="https://ui8.net/" target="_blank">ui8.net</a></strong>: un buen repositorio donde no solo encontraremos Kits UI sino que disponen de fuentes, iconos y otros recursos de diseño. Son de pago pero muchos a un precio muy económico.</li>
<li><strong><a href="http://www.sketchappsources.com/" target="_blank">sketchappsources.com</a></strong>: si trabajas con la aplicación de diseño SketchApp, encontrarás numerosos kits y recursos compatibles con esta aplicación.</li>
<li><strong>Recopilaciones realizadas en blogs</strong>: muchos blogs especializados en temas de diseño ofrecen recopilaciones de Kits UI gratuitos o de pago como son el caso de them, <a href="https://themefurnace.com/blog/free-ui-kits/" target="_blank">themefurnace.com</a>, <a href="https://envato.com/blog/mobile-ui-kits/" target="_blank">Envato</a>,  o <a href="https://speckyboy.com/2016/01/25/free-mobile-ui-kits-ios-android/" target="_blank">speckyboy.com</a>.</li>
</ul>
<p>Por último, aquí tienes un video donde se puede ver algunas recomendaciones a la hora de utilizar los kits de diseño, en este caso con Photoshop.</p>
<p><iframe width="400" height="225" src="https://www.youtube.com/embed/4GUFKZaTELU?feature=oembed" frameborder="0" allowfullscreen></iframe></p>
<h2>3. Icono principal de la aplicación</h2>
<p>El icono principal de la aplicación, aquel que la identifica y el cual aparecerá en la pantalla de aplicaciones de nuestro dispositivo, es de las partes más delicadas de toda la aplicación, al menos a nivel de diseño. Junto al nombre que le demos a nuestra aplicación jugará un papel crucial a la hora de realizar el marketing y la promoción. Sin embargo, una vez más existen sitios donde podemos recoger algo de inspiración, incluso comprar iconos ya hechos:</p>
<ul>
<li><strong><a href="http://iosicongallery.com/" target="_blank">iOS icon gallery</a></strong>: iconos de aplicaciones iOS, Mac y Apple Watch. Podemos buscar por categorías y por colores.</li>
<li><strong><a href="http://www.iconsfeed.com/" target="_blank">iconsfeed.com</a></strong>: aunque también podemos buscar por categorías, la interfaz es mas cuidada que la anterior donde destaca el sistema de iconos relacionados que podemos ver según elegimos uno.</li>
<li><strong><a href="http://www.iospirations.com" target="_blank">iOSpirations</a></strong>: Otra página centrada en iconos de apps de iOS y Mac.</li>
</ul>
<p>También tenemos algunas utilidades online que nos permitirán generar juegos de iconos para disponer de todos los tamaños necesarios para la publicación de la app.</p>
<ul>
<li><a href="https://makeappicon.com/" target="_blank"><strong>makeappicon.com</strong></a></li>
<li><a href="http://appicon.build/" target="_blank"><b>appicon.build</b></a></li>
</ul>
<h2>4. Juego de Iconos de aplicación</h2>
<p>Aparte del icono principal de la aplicación, normalmente necesitaremos juegos de iconos para usar dentro de la aplicación, aquellos que utilizaremos dentro de botones, pestañas, elementos de menú, etc. En algunas ocasiones si partimos de algún Kit UI, éste ya incorporará algunos que podremos reutilizar.</p>
<p>Yo recomiendo buscar juegos completos de iconos para asegurarnos de tener disponible una gama amplia donde elegir y poder cubrir todas las funcionalidades de nuestra aplicación, y así asegurarnos que siguen una línea de diseño homogénea.</p>
<p>Una vez más encontraremos catálogos de iconos gratuitos o de pago. A continuación indico unos cuantos ejemplos:</p>
<ul>
<li><strong><a href="http://fontawesome.io/" target="_blank">Font Awesome</a></strong>: ampliamente conocida por cualquier desarrollador web, se trata de una fuente open source donde podremos encontrar un catálogo tremendamente completo de iconos para utilizar en nuestras aplicaciones.</li>
<li><a href="http://reinspirit.com/30-packs-de-iconos-para-web-y-movil-gratis/" target="_blank"><strong>Recopilatorio de 30 packs de iconos gratis</strong></a>: esta recopilación de packs me parece muy completa. Échale un vistazo porque encontrarás packs realmente buenos</li>
<li><strong><a href="http://www.flaticon.com/" target="_blank">flaticon.com</a></strong>: otra famosa web donde podremos descargar iconos por separado o por <a href="http://www.flaticon.com/packs" target="_blank">packs</a>.</li>
<li><strong><a href="https://icons8.com/" target="_blank">icons8.com</a></strong>: buscador de con más de 30000 iconos. Podremos descargarlos gratuitamente en tamaño 100&#215;100, tamaño normalmente suficiente para aplicaciones móviles si los utilizamos como complementos de elementos de interfaz (botones, menús, …)</li>
</ul>
<h2>5. Tipografías</h2>
<p>Por último, y no por ello menos importante, debemos seleccionar la tipografía adecuada a utilizar en nuestra aplicación.</p>
<p>Un problema que solemos encontrar si utilizamos Kits UI es que éstos no suelen incorporar las tipografías, de forma que si realmente queremos trasladar esos diseños a componentes de aplicación funcionales (ya sean HTML5 o nativos) tendremos que buscar fuentes similares o directamente descargar las originales, ya sean fuentes libres o de pago.</p>
<p>A continuación muestro algunos repositorios de fuentes, algunas completamente libres y gratuitas y algunas de pago, donde podremos buscar aquella que más se ajuste al diseño que buscamos:</p>
<ul>
<li><strong><a href="http://www.1001freefonts.com/">1001freefonts.com</a></strong></li>
<li><strong><a href="http://www.fontspace.com/">fontspace.com</a></strong></li>
<li><strong><a href="https://fonts.google.com/">fonts.google.com</a></strong></li>
<li><a href="https://fontbundles.net/" target="_blank"><strong>fontbundles.net</strong></a></li>
<li><a href="fontsquirrel.com" target="_blank"><strong>fontsquirrel.com</strong></a></li>
</ul>
<h2>Conclusión</h2>
<p>Como hemos visto, existen multitud de recursos para encontrar inspiración o directamente conseguir buenos diseños a bajo coste. Esta estrategia es ideal para aquellos proyectos propios o aplicaciones para terceros donde queramos reducir presupuesto. Sin embargo, siempre que puedas te recomiendo que uses los servicios de algún profesional que te permita dotar a tu aplicación de ese extra de calidad que aporta un diseño equilibrado y cuidado.</p>
<p>La entrada <a rel="nofollow" href="http://alfonsomarin.com/recursos-para-diseno-de-aplicaciones-moviles/">Recursos para diseño de aplicaciones móviles</a> se publicó primero en <a rel="nofollow" href="http://alfonsomarin.com">alfonsomarin</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>http://alfonsomarin.com/recursos-para-diseno-de-aplicaciones-moviles/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Alternativas para desarrollar aplicaciones móviles multiplataforma</title>
		<link>http://alfonsomarin.com/alternativas-para-desarrollar-aplicaciones-moviles-multiplataforma/</link>
					<comments>http://alfonsomarin.com/alternativas-para-desarrollar-aplicaciones-moviles-multiplataforma/#comments</comments>
		
		<dc:creator><![CDATA[alfonso]]></dc:creator>
		<pubDate>Mon, 22 Aug 2016 05:05:38 +0000</pubDate>
				<category><![CDATA[Desarrollo Móvil]]></category>
		<guid isPermaLink="false">http://alfonsomarin.com/?p=1102</guid>

					<description><![CDATA[<p>A la hora de afrontar el desarrollo de una aplicación móvil es normal que no queramos restringirlo a una única plataforma para tener la máxima presencia posible, y es común querer desarrollarla al menos para las dos plataformas principales: iOS y Android. Si además pudiéramos tenerlas en otras plataformas secundarias como Windows Phone o Blackberry, [&#8230;]</p>
<p>La entrada <a rel="nofollow" href="http://alfonsomarin.com/alternativas-para-desarrollar-aplicaciones-moviles-multiplataforma/">Alternativas para desarrollar aplicaciones móviles multiplataforma</a> se publicó primero en <a rel="nofollow" href="http://alfonsomarin.com">alfonsomarin</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>A la hora de afrontar el desarrollo de una aplicación móvil es normal que no queramos restringirlo a una única plataforma para tener la máxima presencia posible, y es común querer desarrollarla al menos para las dos plataformas principales: iOS y Android. Si además pudiéramos tenerlas en otras plataformas secundarias como Windows Phone o Blackberry, sería excepcional.</p>
<p>El problema es el de siempre: sistemas operativos diferentes con lenguajes de programación diferentes y SDKs diferentes que nos obligan a desarrollar una versión distinta para cada plataforma y que implican una curva de aprendizaje bastante empinada. En estos casos es inevitable hacerse la pregunta de oro: ¿No podría desarrollar una única app que pudiese ejecutarse en cualquier sistema operativo? o al menos en las plataformas principales.</p>
<p>En este post veremos las estrategias que actualmente se usan para el desarrollo multiplataforma: Web App (HTML5), aplicaciones híbridas y aplicaciones pseudo-nativas o compiladas. Veremos cada una de ellas explicando las ventajas e inconvenientes que nos podemos encontrar en cada estrategia. También veremos qué frameworks o librerías podremos usar en cada aproximación.</p>
<h2><b>Aplicaciones HTML5</b></h2>
<p>Gracias a los avances y APIs introducidas con HTML5 existe un gran número de aplicaciones que pueden implementarse haciendo uso únicamente de las APIs HTML5, JavaScript y CSS. Es la tecnología multiplataforma por excelencia ya que todo sistema operativo móvil cuenta con un navegador web, normalmente basado en WebKit lo que asegura una implementación rezonablemente estándar de las APIs HTML5. Incluso Microsoft en sus últimas versiones de Internet Explorer está mejorando el soporte a estas plataformas.</p>
<p>Aunque podríamos incluir en esta estrategia a cualquier web tradicional que haga uso una plantilla adaptativa (responsive), para aplicaciones móviles es recomendable hacer uso de frameworks que ofrezcan <b>componentes de interfaz de usuario especializados para móviles</b> y que se asemejen a los componentes que normalmente ofrecen los SDK nativos para componer las vistas de nuestra aplicación: Vistas, transiciones entre vistas, vistas de navegación, listados de selección, barras de herramientas, componentes de formulario, carruseles de fotos, botones, etc.</p>
<p>Para trabajar con este tipo de framework utilizaremos JavaScript o alguna de sus variantes compiladas como CoffeScript o TypeScript. Suelen estar basados en algún patrón como el de Modelo Vista controlador (MVC) o el Modelo Vista VistaModelo (MVVM) y la idea que persiguen es que toda la arquitectura de la aplicación se monte en el lado del cliente y únicamente se utilice el servidor para la recuperación de datos, normalmente usando JSON.</p>
<p><span style="text-decoration: underline;">Ventajas</span></p>
<ul>
<li>Únicamente necesitamos saber HTML, JavaScript y CSS para abordar cualquier plataforma</li>
<li>Máxima reutilización de código, ya que es la misma app para todos los dispositivos</li>
<li>Mayor número de plataformas soportadas</li>
</ul>
<p><span style="text-decoration: underline;">Desventajas</span></p>
<ul>
<li>No podremos acceder a APIs nativas de cada plataforma o cualquier funcionalidad a la que no pueda acceder el navegador, como por ejemplo las notificaciones Push.</li>
<li>El rendimiento es menor que en las aplicaciones nativas, pues es el navegador web quien realmente está ejecutando la aplicación</li>
<li>Limitaciones de almacenamiento típicos de HTML5, donde normalmente tendremos acceso a 5MB que en muchas aplicaciones no será suficiente.</li>
<li>Capacidad de funcionamiento offline limitada</li>
</ul>
<p>Para desarrollarlas podríamos dos opciones:</p>
<ol>
<li>Usar cualquier framework JavaScript de <i>frontend</i>, como <a href="http://backbonejs.org/" target="_blank">Backbone.js</a>, <a href="https://angularjs.org/" target="_blank">Angular</a>, <a href="https://facebook.github.io/react/" target="_blank">React</a>, <a href="http://emberjs.com/" target="_blank">Ember.js</a>, … junto a algún framework CSS como <a href="http://goratchet.com/" target="_blank">Ratchet</a> o <a href="http://topcoat.io/" target="_blank">TopCoat</a>.</li>
<li>Usar un frameworks que dispongan de un catálogo de componentes especializados en interfaces móviles, como podrían ser <a href="http://ionicframework.com/" target="_blank">Ionic Framework</a>, <a href="https://onsen.io/" target="_blank">Onsen UI</a>, <a href="https://framework7.io/" target="_blank">Framework7</a> o <a href="https://www.sencha.com/products/touch/" target="_blank">Sencha Touch</a>.</li>
</ol>
<p>La primera opción suele estar más enfocada a aplicaciones web adaptativas que deban funcionar en sobremesa y en dispositivo móvil. La segunda opción suele usarse más en aplicaciones únicamente enfocadas a dispositivos móviles y probablemente candidatas a ser encapsuladas como aplicaciones híbridas.</p>
<h2>Aplicaciones Híbridas</h2>
<p>Son aplicaciones HTML5 que encapsulamos en una aplicación nativa. Siguen la misma filosofía que las aplicaciones HTML5 vistas anteriormente pero en vez de ejecutarse en el navegador del dispositivo lo hacen en un componente nativo WebView.</p>
<p>Estas tecnologías no solo se encargan de montar el componente WebView y cargar dentro nuestra aplicación, sino que nos ofrecerá mecanismos para comunicar nuestra aplicación JavaScript con la parte nativa, y así poder ofrecer funcionalidades que dentro de un navegador no podríamos ofrecer, ya que potencialmente podremos acceder cualquier API nativa que nos ofrezca cada SDK. Funcionalidades como las notificaciones Push, las compras dentro de la aplicación o el acceso a los contactos harán uso de este mecanismo para que podamos integrarlas dentro de nuestra aplicación JavaScript.</p>
<p><span style="text-decoration: underline;">Ventajas</span></p>
<ul>
<li>Al ser una aplicación instalable, podremos publicarla en las tiendas de aplicaciones de cada plataforma</li>
<li>Podremos acceder a las APIs nativas desde nuestra aplicación JavaScript, ya sea porque estén soportadas por la plataforma o porque podamos desarrollar un plugin para acceder a ellas</li>
<li>Existen plugins ya desarrollados para acceder a las APIs más importantes, ya sean plugins oficiales o desarrollados por la comunidad</li>
</ul>
<p><span style="text-decoration: underline;">Desventajas</span></p>
<ul>
<li>Si necesitamos una funcionalidad nativa y no existe un plugin para ello, tendremos que aprender a desarrollar la parte nativa de cada plataforma</li>
<li>El rendimiento sigue siendo menor que las aplicaciones nativas, pues aunque nuestra aplicación se ejecuta dentro de un WebView, éste no deja de ser un tipo de navegador más</li>
<li>Es difícil hacer uso de funcionalidades nativas que impliquen componentes visuales. Por ejemplo, si deseamos acceder a las librerías de mapas nativas, estas se ejecutarán en una vista distinta al WebView y por tanto no estará integrada en el sistema de transiciones de nuestra aplicación. Hacer convivir estos componentes con el WebView algunas veces es complicado.</li>
</ul>
<p>En esta categoría el framework por excelencia es <strong><a href="https://cordova.apache.org/" target="_blank">Apache Cordova</a></strong>. La mayoría de frameworks HTML5 ofrecen opciones de integración con Cordova y la cantidad de plugins disponible es muy grande, tanto oficiales como desarrollados por la comunidad. A día de hoy se puede decir que es un estándar de facto y grandes empresas como Adobe, Intel o Microsoft están ayudando a su desarrollo, pues todos ellos disponen de productos que orbitan sobre Apache Cordova (Adobe con <a href="http://phonegap.com/" target="_blank">PhoneGap</a>, Intel con su IDE de desarrollo <a href="https://software.intel.com/es-es/intel-xdk" target="_blank">XDK</a> y Microsoft con su cliente de línea de comandos <a href="https://github.com/Microsoft/TACO" target="_blank">TACO</a>).</p>
<p>&nbsp;</p>
<h2>Aplicaciones pseudo-nativas</h2>
<p>Por último, tendríamos frameworks que generan código nativo a partir de código escrito en otro lenguaje como JavaScript, C#, Python, etc. A las aplicaciones que podamos desarrollar con estos frameworks las llamo pseudo-nativas porque realmente estaremos trabajando con componentes nativos y a todos los efectos nuestra aplicación parecerá nativa, pero la desarrollaremos bajo una única capa de abstracción y lenguaje de programación comunes.</p>
<p>Estos frameworks nos sitúan a un nivel más cercano a la plataforma base y realmente no tendremos limitaciones teóricas a la hora de acceder a cualquier librería o componente nativo ofrecido por cada plataforma soportada. Incluso en algunos casos podremos acceder a las APIs nativas de cada plataforma sin necesidad de escribir plugins o similares, directamente desde nuestro código JavaScript o C#.</p>
<p><span style="text-decoration: underline;">Ventajas</span></p>
<ul>
<li>Podremos generar aplicaciones con componentes visuales nativos, sin las restricciones de las aplicaciones híbridas</li>
<li>Estos frameworks son los que más nos pueden acercar al rendimiento nativo</li>
</ul>
<p><span style="text-decoration: underline;">Desventajas</span></p>
<ul>
<li>Suelen enfocarse principalmente a iOS y Android, dejando de lado a otras plataformas como Windows Phone o Blackberry donde se ofrece un soporte muy residual en el mejor de los casos</li>
<li>Aunque su rendimiento sea similar a las aplicaciones nativas, siempre estarán un paso por detrás ya que siempre existirá la capa intermedia de traducción de código común a código nativo</li>
<li>La cantidad de código común es menor que en las aplicaciones híbridas, especialmente la parte correspondiente a la interfaz de usuario que es donde más diferencias nos podemos encontrar en cada plataforma</li>
<li>Si queremos sacar el máximo rendimiento nuestras aplicaciones, necesitaremos conocer más a fondo las APIs nativas de cada plataforma, lo cual puede incrementar la curva de aprendizaje.</li>
</ul>
<p>Los principales frameworks que podemos situar en esta categoría son los siguientes:</p>
<ul>
<li><strong><a title="Mobile App Development &amp;amp; App Creation Software" href="http://www.xamarin.com" target="_blank">Xamarin</a> (C#)</strong>: adquirido por Microsoft tiene soporte para iOS, Android y Windows Phone. Aunque originalmente fue de pago, tras la compra por parte de Microsoft es posible realizar publicar nuestras aplicaciones sin adquirir licencias de pago.</li>
<li><strong><a title="Mobile App Development Platform" href="http://appcelerator.com" target="_blank">Appcelerator</a> (JavaScript)</strong>: de los primeros frameworks en esta categoría, a día de hoy es necesario adquirir licencias para poder publicar aplicaciones. Soporta iOS, Android y Blackberry.</li>
<li><strong><a title="Cross-Platform Native Development with Javascript" href="https://www.nativescript.org/" target="_blank">NativeScript</a> (JavaScript)</strong>: uno de los frameworks más prometedores pues permite acceso a APIs nativas directamente desde JavaScript. Actualmente soporta iOS y Android aunque están trabajando para poder añadir Windows Phone. Además, podemos hacer uso de Angular 2 para estructurar nuestra aplicación. Completamente Open Source.</li>
<li><strong><a title="&gt;Kivy: Cross-platform Python Framework for NUI Development" href="https://kivy.org/" target="_blank">Kivy</a> (Python)</strong>: su fuerte son las interfaces gráficas, mas orientado a juegos que a aplicaciones tradicionales. Completamente Open Source</li>
<li><strong><a href="https://www.qt.io/" target="_blank">Qt</a> (C++)</strong>: un clásico en el mundo multiplataforma, también soporta iOS, Android, Windows Phone y Blackberry. Salvo que nuestro proyecto sea Open Source, tendremos que adquirir una licencia para poder publicar nuestras aplicaciones.</li>
<li><strong><a title="Unity - Game Engine" href="https://unity3d.com/" target="_blank">Unity</a> (C# y JavaScript)</strong>: motor de videojuegos que nos permitirá</li>
</ul>
<h2>Recomendaciones finales</h2>
<p>Desde mi punto de vista las aplicaciones HTML5 son las más rápidas de desarrollar, y si ya disponemos de conocimientos en desarrollo web nos será muy fácil hacernos con alguno los frameworks comentados especializados en interfaces móviles. Por otra parte probaría Apache Cordova y al menos ojearía el funcionamiento de los plugins oficiales para poder hacer aplicaciones híbridas que puedan publicarse. Solo con esto tendríamos la posibilidad de abordar un gran número de aplicaciones móviles con resultados altamente competitivos.</p>
<p>Después elegiría un framework del último grupo para poder abordar aquellos proyectos que deban ser nativos, ya sea por rendimiento, por requisitos o por limitaciones que encontremos en las aplicaciones híbridas.</p>
<p>Una vez llegados a ese punto, podremos aventurarnos a profundizar en las APIs y SDK nativos de cada plataforma, pues un mejor conocimiento de ellos nos permitirá mejorar nuestros desarrollos pseudo-nativos o el desarrollo de plugins para las aplicaciones híbridas que realicemos.</p>
<p>&nbsp;</p>
<p>La entrada <a rel="nofollow" href="http://alfonsomarin.com/alternativas-para-desarrollar-aplicaciones-moviles-multiplataforma/">Alternativas para desarrollar aplicaciones móviles multiplataforma</a> se publicó primero en <a rel="nofollow" href="http://alfonsomarin.com">alfonsomarin</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>http://alfonsomarin.com/alternativas-para-desarrollar-aplicaciones-moviles-multiplataforma/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Frameworks CSS3 específicos para aplicaciones móviles HTML5</title>
		<link>http://alfonsomarin.com/frameworks-css3-para-aplicaciones-moviles-html5/</link>
					<comments>http://alfonsomarin.com/frameworks-css3-para-aplicaciones-moviles-html5/#respond</comments>
		
		<dc:creator><![CDATA[alfonso]]></dc:creator>
		<pubDate>Mon, 01 Feb 2016 15:25:48 +0000</pubDate>
				<category><![CDATA[Desarrollo Móvil]]></category>
		<guid isPermaLink="false">http://alfonsomarin.com/?p=1062</guid>

					<description><![CDATA[<p>A la hora de desarrollar una aplicación móvil HTML5 es probable que nos decantemos por algún framework especializado como pueden ser Ionic, Sencha Touch o jQuery Mobile. Estos frameworks proporcionan el conjunto de componentes de interfaz de usuario típicos como pueden ser barras de herramientas, sliders, botones, componentes de formulario, etc. Pero a su vez, nos [&#8230;]</p>
<p>La entrada <a rel="nofollow" href="http://alfonsomarin.com/frameworks-css3-para-aplicaciones-moviles-html5/">Frameworks CSS3 específicos para aplicaciones móviles HTML5</a> se publicó primero en <a rel="nofollow" href="http://alfonsomarin.com">alfonsomarin</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>A la hora de desarrollar una aplicación móvil HTML5 es probable que nos decantemos por algún framework especializado como pueden ser <a title="Ionic Framework" href="http://ionicframework.com/" target="_blank">Ionic</a>, <a title="Sencha Touch Framework" href="https://www.sencha.com/products/touch/" target="_blank">Sencha Touch</a> o <a title="jQuery Mobile" href="http://jquerymobile.com" target="_blank">jQuery Mobile</a>. Estos frameworks proporcionan el conjunto de componentes de interfaz de usuario típicos como pueden ser barras de herramientas, sliders, botones, componentes de formulario, etc. Pero a su vez, nos obligan a casarnos con una determinada arquitectura o tecnología. Por ejemplo, Sencha Touch ofrece su propio esquema MVC y manipulador DOM, Ionic se apoya en AngularJS o jQuery Mobile sobre jQuery.</p>
<p>Existen situaciones en las que únicamente necesitamos los elementos de interfaz de usuario, ya sea porque la aplicación sea extremadamente sencilla, tal vez porque únicamente necesitamos un prototipo o porque ya tengamos desarrollada gran parte de la aplicación haciendo uso de un determinado framework JS que implemente su propio esquema MVC o MVVC.</p>
<p>Para esos casos conviene conocer algunos frameworks CSS que básicamente nos proporcionan eso, conjuntos de componentes para definir el aspecto visual de nuestra aplicación que podamos acoplara a cualquier <em>stack</em> de tecnologías que estemos utilizando. Algo similar a <a title="Bootstrap" href="http://getbootstrap.com/" target="_blank">Bootstrap</a> pero especializados en componentes para aplicaciones móviles.</p>
<h2><a title="Ratchet framework" href="http://goratchet.com/" target="_blank">Ratchet</a></h2>
<p><a href="http://goratchet.com/"><img class="alignnone wp-image-1069 size-large" src="http://localhost/business/wp-content/uploads/2016/02/01-ratchet-e1454340315841-1024x271.jpg" alt="Ratchet webpage screenshot" width="940" height="248" srcset="http://alfonsomarin.com/wp-content/uploads/2016/02/01-ratchet-e1454340315841-1024x271.jpg 1024w, http://alfonsomarin.com/wp-content/uploads/2016/02/01-ratchet-e1454340315841-300x79.jpg 300w, http://alfonsomarin.com/wp-content/uploads/2016/02/01-ratchet-e1454340315841-768x203.jpg 768w, http://alfonsomarin.com/wp-content/uploads/2016/02/01-ratchet-e1454340315841.jpg 1039w" sizes="(max-width: 940px) 100vw, 940px" /></a></p>
<p>Desarrollada por algunos de los creadores de Bootstrap y también nacida desde las entrañas de Twitter, Ratchet nos ofrece un conjunto de componentes especializados en interfaces móviles basados en HTML, CSS y JavaScript. Es muy fácil de aprender y permite tanto a diseñadores como a desarrolladores realizar prototipos de una forma muy rápida. Puedes acoplarlo a cualquier tecnología <em>frontend</em> que estés utilizando pues el código que incluye solo afecta a los componentes que proporciona, al estilo de su primo-hermano Bootstrap.</p>
<p>Está en la versión 2 y ofrecen personalizaciones para iOS y para Android, aunque la versión de android no la han actualizado a las nuevas interfaces basadas en material design y esto puede ser un punto en contra. Sin embargo, la versión iOS está muy lograda.</p>
<h2><a title="Topcoat" href="http://topcoat.io/" target="_blank">TopCoat</a></h2>
<p><a href="http://topcoat.io/"><img class="alignnone wp-image-1068 size-full" src="http://localhost/business/wp-content/uploads/2016/02/02-topcoat.jpg" alt="Topcoat" width="1040" height="505" srcset="http://alfonsomarin.com/wp-content/uploads/2016/02/02-topcoat.jpg 1040w, http://alfonsomarin.com/wp-content/uploads/2016/02/02-topcoat-300x146.jpg 300w, http://alfonsomarin.com/wp-content/uploads/2016/02/02-topcoat-768x373.jpg 768w, http://alfonsomarin.com/wp-content/uploads/2016/02/02-topcoat-1024x497.jpg 1024w" sizes="(max-width: 1040px) 100vw, 1040px" /></a></p>
<p>Librería CSS pura que no contiene ningún módulo de script. La principal ventaja de este framework es la optimización del mismo, donde destacan que se trata de uno de los frameworks más rápidos del momento. Dado que las aplicaciones móviles HTML5 pecan en ciertas plataformas de un bajo rendimiento, es interesante plantearnos el uso para la capa visual de un framework CSS bien optimizado para atenuar esos problemas.</p>
<p>Sobre él se han montado otros frameworks HTML5 como onsen.io, con una filosofía similar a Ionic donde usaríamos AngularJS para la arquitectura de la aplicación, aunque recientemente también han incluido el soporte para jQuery.</p>
<p>Tal vez se hecha en falta alguna funcionalidad adicional al estilo de bootstrap donde te da algunos componentes interactivos, pero va como anillo al dedo si lo único que necesitamos es el aspecto visual.</p>
<p>Tiene una versión para aplicaciones web de escritorio y otra versión para aplicaciones móviles, donde para cada una encontraremos dos variantes, una en tonos oscuros y otra en tonos claros. Sin embargo, no encontraremos personalizaciones para plataformas como iOS o Android.</p>
<h2><a title="ChocolateChip-UI" href="http://chocolatechip-ui.com/" target="_blank">ChocolateChip-UI</a></h2>
<p><a href="http://chocolatechip-ui.com/"><img class="alignnone wp-image-1070 size-full" src="http://localhost/business/wp-content/uploads/2016/02/03-chocolatechip-ui.jpg" alt="ChocolateChip-UI" width="1040" height="505" srcset="http://alfonsomarin.com/wp-content/uploads/2016/02/03-chocolatechip-ui.jpg 1040w, http://alfonsomarin.com/wp-content/uploads/2016/02/03-chocolatechip-ui-300x146.jpg 300w, http://alfonsomarin.com/wp-content/uploads/2016/02/03-chocolatechip-ui-768x373.jpg 768w, http://alfonsomarin.com/wp-content/uploads/2016/02/03-chocolatechip-ui-1024x497.jpg 1024w" sizes="(max-width: 1040px) 100vw, 1040px" /></a></p>
<p>Inicialmente puede funcionar con jQuery, pero ellos ofrecen también una «versión especializada» de manejador DOM llamadado ChocolateChipJS y que está optimizado para navegadores móviles. No es una librería CSS pura como podría ser TopCoat pues ofrece widgets funcionales implementados en JavaScript, donde también han creado las versiones en TypeScript.</p>
<p>Sus principales plataformas objetivo son iOS, Android y Windows Phone, para los cuales disponemos de temas especializados para cada una de ellas.</p>
<p>Actualmente el proyecto está un poco parado pues lleva unos meses sin actualizarse, pero</p>
<h2><a title="Framework7" href="http://www.idangero.us/framework7/" target="_blank">Framework7</a></h2>
<p><a href="http://www.idangero.us/framework7/"><img class="alignnone wp-image-1071 size-full" src="http://localhost/business/wp-content/uploads/2016/02/04-framework7.jpg" alt="Framework7" width="1040" height="505" srcset="http://alfonsomarin.com/wp-content/uploads/2016/02/04-framework7.jpg 1040w, http://alfonsomarin.com/wp-content/uploads/2016/02/04-framework7-300x146.jpg 300w, http://alfonsomarin.com/wp-content/uploads/2016/02/04-framework7-768x373.jpg 768w, http://alfonsomarin.com/wp-content/uploads/2016/02/04-framework7-1024x497.jpg 1024w" sizes="(max-width: 1040px) 100vw, 1040px" /></a></p>
<p>Sin duda uno de los frameworks más potentes y el que personalmente más me gusta. No solo proporciona un completo set de componentes UI que imitan a la perfección los componentes nativos de cada plataforma, sino podremos gestionar transiciones entre pantallas, menús contextuales, control de scroll nativo, etc. Dispone de temas para iOS y para Android (Material Design), y como he comentado el nivel de similitud conseguido respecto a los controles originales de cada plataforma es espectacular.</p>
<p>No se trata de una librería CSS pura ya que al menos tendremos que incorporar código JavaScript de inicialización para arrancar las vistas y que pueda funcionar el sistema de transiciones. Sin embargo, este JavaScript es muy limpio y sencillo que podremos acoplar perfectamente a cualquier framework MVC tipo AngularJS, ember, backbone.js, etc. Además, no se apoya en ninguna librería de terceros ya que implementa su propio manipulador DOM optimizado para móviles que han llamado Dom7.</p>
<p>En cuanto pueda escribiré un tutorial sobre este framework porque realmente merece la pena.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>La entrada <a rel="nofollow" href="http://alfonsomarin.com/frameworks-css3-para-aplicaciones-moviles-html5/">Frameworks CSS3 específicos para aplicaciones móviles HTML5</a> se publicó primero en <a rel="nofollow" href="http://alfonsomarin.com">alfonsomarin</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>http://alfonsomarin.com/frameworks-css3-para-aplicaciones-moviles-html5/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Introducción a PhoneGap / Apache Cordova</title>
		<link>http://alfonsomarin.com/introduccion-a-phonegap-apache-cordova/</link>
					<comments>http://alfonsomarin.com/introduccion-a-phonegap-apache-cordova/#comments</comments>
		
		<dc:creator><![CDATA[alfonso]]></dc:creator>
		<pubDate>Tue, 26 Jan 2016 16:53:20 +0000</pubDate>
				<category><![CDATA[Desarrollo Móvil]]></category>
		<guid isPermaLink="false">http://alfonsomarin.com/?p=1049</guid>

					<description><![CDATA[<p>En este artículo quiero hacer una pequeña introducción al estupendo framework PhoneGap, tecnología que llevo usando y exprimiendo varios años y sobre el que he desarrollado numerosas aplicaciones móviles. Si lo tuyo es el desarrollo web y te gusta la programación frontend, te vas a sentir como en casa desarrollando sobre PhoneGap ya que podrás reutilizar [&#8230;]</p>
<p>La entrada <a rel="nofollow" href="http://alfonsomarin.com/introduccion-a-phonegap-apache-cordova/">Introducción a PhoneGap / Apache Cordova</a> se publicó primero en <a rel="nofollow" href="http://alfonsomarin.com">alfonsomarin</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>En este artículo quiero hacer una pequeña introducción al estupendo framework PhoneGap, tecnología que llevo usando y exprimiendo varios años y sobre el que he desarrollado numerosas aplicaciones móviles. Si lo tuyo es el desarrollo web y te gusta la programación <em>frontend</em>, te vas a sentir como en casa desarrollando sobre PhoneGap ya que podrás reutilizar todos tus conocimientos en HTML5, CSS3 y JavaScript.</p>
<p>De momento analizaremos cómo montar nuestro <em>stack</em> de desarrollo para trabajar con PhoneGap, destacando qué elementos debemos instalar y qué posibilidades tenemos para compilar y ejecutar nuestros proyectos en dispositivos o simuladores. No veremos nada de su API interna para poder hacer uso de capacidades nativas no disponibles en HTML5, eso lo dejaré para un segundo artículo. Sin embargo, con lo que veremos en esta introducción podremos encapsular cualquier aplicación HTML5 estándar dentro de una aplicación móvil.</p>
<h2>¿Qué es PhoneGap?</h2>
<p>PhoneGap es un framework que nos permitirá encapsular una aplicación web desarrollada en HTML5, JavaScript y CSS3 en una versión nativa que podremos instalar y/o publicar en distintas plataformas móviles y plataformas de escritorio.</p>
<p>La estrategia que persigue consiste en sustituir el navegador por una vista web (WebView) embebida en una aplicación nativa, haciendo transparente al usuario que realmente es una aplicación web. Además, gracias a librerías puente adicionales (plugins) podremos acceder a ciertas funcionalidades nativas no disponibles en un navegador web estándar a través de APIs JavaScript .</p>
<p>Mira sobre qué cantidad de plataformas podrás crear versiones nativas de tu aplicación:</p>
<p>•    Android<br />
•    Amazon FireOS<br />
•    Windows Phone (7 y 8)<br />
•    BlackBerry 10<br />
•    Firefox OS<br />
•    iOS<br />
•    Ubuntu<br />
•    Windows 8<br />
•    Tizen</p>
<p>Hay que admitir que pocos frameworks multiplataforma te permiten a día de hoy alcanzar a tantas plataformas. Una pasada.</p>
<h2>Aclaración sobre aplicaciones web</h2>
<p>El término «aplicación web» es muy amplio, y conviene aclarar qué tipo de aplicaciones podremos encapsular con PhoneGap. El framework está orientado a aplicaciones web que hagan uso de tecnologías de <em>frontend</em>, es decir, HTML5, CSS3 y JavaScript. No podremos usar tecnologías de servidor como PHP, Ruby o similares dentro de nuestra aplicación PhoneGap ya éste pone a nuestra disposición un mini-navegador (el WebView), no un mini-servidor. Obviamente podremos comunicarnos con servidores externos para obtener datos o incluso vistas HTML5, pero toda la lógica de la aplicación debe estar contenida en el cliente.</p>
<p>Es cierto que también podríamos cargar en el WebView interno de PhoneGap una dirección web cualquiera y así obtendríamos una «versión instalable» de dicha web, pero no es la filosofía de la plataforma ya que el efecto sería el mismo que crear un acceso directo a dicha web, con la salvedad que podríamos publicarlo en tiendas.</p>
<p>Aplicaciones de tipo <a title="Single Page Application" href="https://es.wikipedia.org/wiki/Single-page_application" target="_blank">SPA</a> basadas en tecnologías <em>frontend</em> como por ejemplo <a href="https://angularjs.org/" target="_blank">Angular.js</a>, <a href="http://backbonejs.org/" target="_blank">backbone.js</a> o <a href="http://emberjs.com/" target="_blank">ember.js</a>, encajarían muy bien dentro de una aplicación que pudiera encapsularse con PhoneGap. Sin embargo, lo más común es hacer uso de frameworks HTML5 específicos para móvil como son <a href="http://ionicframework.com/" target="_blank">Ionic</a>, <a href="http://www.idangero.us/framework7/" target="_blank">Framework 7</a> o <a href="https://www.sencha.com/products/touch/" target="_blank">Sencha Touch</a>, pues además nos proporcionarán componentes visuales típicos en interfaces móviles.</p>
<h2><b>Arquitectura de PhoneGap</b></h2>
<p>La arquitectura de PhoneGap podemos dividirla  en dos partes: el <em>kernel</em> y los <em>plugins</em>.</p>
<p>El <em>k</em><em>ernel</em> se encarga básicamente de arrancar la aplicación nativa, crear un WebView y cargar dentro de él nuestra aplicación web. También se encargará de establecer la arquitectura básica de comunicación entre dicho WebView y la parte nativa de la aplicación, para que pueda ser utilizada por parte de los plugins.</p>
<p>Por otra parte, los <em>plugins</em> son componentes que podremos añadir para hacer uso de funcionalidades, servicios y APIs nativas que no son accesibles de forma estándar por un navegador web, expuestas ante nuestra aplicación como funciones JavaScript que podremos usar desde nuestra aplicación web.</p>
<p>Entre los plugins oficiales (mantenidos por los desarrolladores de PhoneGap) podemos encontrar los siguientes:</p>
<p>•    <strong>Battery Status</strong>: Monitorización y consulta de estado de la batería<br />
•    <strong>Camera</strong>: acceso a la cámara y álbum de fotos del dispositivo<br />
•    <strong>Contacts</strong>: acceso, creación y modificación de contactos existentes en el dispositivo<br />
•    <strong>Device</strong>: Información referente al dispositivo (plataforma, versión de S.O., etc.)<br />
•    <strong>Device Motion</strong>: acceso al acelerómetro del dispositivo<br />
•    <strong>Device Orientation</strong>: acceso a la brújula del dispositivo<br />
•    <strong>Dialogs</strong>: mostrar notificaciones en forma de diálogos<br />
•    <strong>FileSystem</strong>: acceso al sistema de ficheros del dispositivo modelado a través del API File de HTML5<br />
•    <strong>File Transfer</strong>: soporte para descargas y subidas de ficheros<br />
•    <strong>Geolocation</strong>: consulta de posición GPS<br />
•    <strong>Globalization</strong>: soporte para representar distintos objetos según su localización<br />
•    <strong>InAppBrowser</strong>: abrir URLs dentro de la propia aplicación sin salir al navegador principal del dispositivo.<br />
•    <strong>Media</strong>: Grabación y reproducción de archivos de audio<br />
•    <strong>Media Capture</strong>: captura de ficheros multimedia mediante las aplicaciones de captura del dispositivo<br />
•    <strong>Network Information</strong>: información sobre el estado de la conexión del dispositivo, si está online u offline o si está mediante Wifi, 3G, etc.<br />
•    <strong>Splashscreen</strong>: control fino sobre el comportamiento de la pantalla de inicio SplashScreen.<br />
•    <strong>Vibration</strong>: hacer que el dispositivo vibre.</p>
<p>También existen numerosos plugins creados por la comunidad que podremos buscar desde <a href="https://plugins.cordova.io" target="_blank">https://plugins.cordova.io</a>, y en última instancia siempre tendremos la posibilidad de crearnos los nuestros propios, aunque en ese caso sí necesitaremos  disponer de conocimientos sobre desarrollo nativo en cada plataforma.</p>
<h2><b>PhoneGap vs Apache Cordova</b></h2>
<p>Antes de empezar a juguetear con el framework quiero aclarar la relación entre PhoneGap y Apache Cordova, pues mucha gente no tiene claro si son lo mismo o no. Para entenderlo mejor haremos un poco de historia.</p>
<p>PhoneGap fue desarrollado por la empresa Nitobi como software libre, pero en 2011 Adobe la adquirió pasando así PhoneGap al control del gigante de software. Por aquel entonces la comunidad alrededor de PhoneGap ya era considerable y tanto Adobe como Nitobi sabían que debían mantenerla para que la plataforma siguiese creciendo, así que decidieron mantener libre el desarrollo bajo el paraguas de la fundación Apache y rebautizaron el proyecto como Apache Córdova.</p>
<p>Como ellos mismos dicen, Apache Cordova es a PhoneGap lo que WebKit es a Chrome o Safari. Por una parte estaría la tecnología en sí y por otra un producto comercial basado en ella. Apache Cordova es y siempre será libre, y los avances que se produzcan sobre la plataforma (nuevas versiones, funcionalidades, etc.) se harán sobre Apache Cordova. Sin embargo, Adobe construirá su propia versión que seguirá llamando PhoneGap y sobre la que ofrecerá servicios complementarios de valor añadido.</p>
<h2>Instalando PhoneGap</h2>
<p>Para la creación y gestión de nuestro proyecto PhoneGap necesitaremos el cliente de comandos que podremos instalar a través de <a title="npm" href="https://www.npmjs.com/" target="_blank">NMP</a>, el sistema de paquetería de <a title="Node.js" href="https://nodejs.org/" target="_blank">NodeJS</a> que imagino que ya tendrás instalado en tu sistema como buen desarrollador web que eres. Si no es así, visita ambas páginas para informarte de los pasos a seguir para instalarlos en tu plataforma de desarrollo.</p>
<p>Realmente podemos instalar dos versiones de comandos: <strong>phonegap</strong> o <strong>cordova</strong>. Personalmente prefiero instalar phonegap porque a día de hoy (no siempre fue así) con el cliente phonegap podremos hacer lo mismo que con el cliente cordova, pero además podremos acceder a los servicios y aplicaciones creadas por Adobe, pues algunos de ellos son gratuitos y siempre puede venir bien.</p>
<p>Para instalarlo ejecutamos en nuestra línea de comandos lo siguiente</p>
<pre>$ npm install -g phonegap@latest</pre>
<p>Si optásemos por usar el cliente cordova haríamos algo similar</p>
<pre>$ npm install -g cordova</pre>
<h2>Creación de un proyecto ejemplo</h2>
<p>Vamos a crear un proyecto PhoneGap haciendo uso de nuestro cliente de comandos que acabamos de instalar y echaremos un vistazo a su estructura interna. Escribimos esto en la línea de comandos</p>
<pre>$ phonegap create miApp</pre>
<p>Esto creará un directorio miApp con el siguiente contenido:</p>
<ul>
<li><strong>config.xml</strong>: fichero de configuración donde podremos tunear cositas</li>
<li><strong>hooks</strong>: scripts para realizar operaciones de integración, construcción, etc. Uso avanzado que no veremos aquí.</li>
<li><strong>plugins</strong>: aquí se alojarán los plugins que vayamos instalando (lo haremos más adelante).</li>
<li><strong>www</strong>: aquí es donde está la <em>mandanga</em>, nuestra app web. Este será el contenido que se cargue en el WebView.</li>
</ul>
<p>Si ojeamos el contenido del directorio www veremos que ya hay una pequeña “app” de ejemplo a modo de <i>aplicación HelloWorld</i>. Esta app es muy básica y no hace uso de ningún plugin externo, pero los chicos de PhoneGap son muy listos y saben que lo que deseas realmente es ejecutar cuanto antes algo en un teléfono o simulador. Así que eso mismo es lo que vamos a hacer ahora, ejecutar esa pequeña aplicación en algún dispositivo.</p>
<h2>Ejecutando la aplicación de ejemplo</h2>
<h3>Opción 1: PhoneGap App</h3>
<p>La opción más rápida para ver corriendo nuestra aplicación en un dispositivo móvil es haciendo uso de PhoneGap App, uno de los servicios ofrecidos por Adobe para desarrolladores y que podremos usar gratuitamente siempre que estemos haciendo uso del cliente phonegap, no el cliente cordova.</p>
<p>Esta aplicación está disponible en Google Play, App Store y Windows App Store, así que la instalaremos en el dispositivo donde deseemos hacer las pruebas y tras conectarla con nuestro proyecto a través de nuestra red local podremos ver en vivo el funcionamiento de nuestra app, así como ver reflejado automáticamente cualquier cambio que realicemos en el código.</p>
<p>Instalamos y ejecutamos la aplicación en nuestro dispositivo y veremos nos solicitará que especifiquemos una dirección a la que conectarse</p>
<p><a href="http://localhost/business/wp-content/uploads/2016/01/dev-app-enter-add.jpg"><img class="alignnone size-full wp-image-1055" src="http://localhost/business/wp-content/uploads/2016/01/dev-app-enter-add.jpg" alt="dev-app-enter-add" width="300" height="628" srcset="http://alfonsomarin.com/wp-content/uploads/2016/01/dev-app-enter-add.jpg 300w, http://alfonsomarin.com/wp-content/uploads/2016/01/dev-app-enter-add-143x300.jpg 143w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>&nbsp;</p>
<p>Para saber qué dirección es esa debemos ejecutar lo siguiente en nuestro equipo, dentro del directorio miApp:</p>
<p><code>$phonegap serve<br />
[phonegap] starting app server...<br />
[phonegap] listening on 192.168.10.12:3000<br />
[phonegap]<br />
[phonegap] ctrl-c to stop the server<br />
</code></p>
<p>Introducimos la dirección que se nos indica y <em>voilà</em>, app ejecutándose en el dispositivo. Lo chulo de esto es que mientras tengamos activo esta conexión, cualquier cambio que hagamos en el código hará que recargue la aplicación en el cliente y podamos ver los cambios de forma instantánea.</p>
<p>La única limitación de este esquema es que no podremos probar plugins no oficiales, ya sean plugins de la comunidad o desarrollados por nosotros, pero es un fenomenal punto de partida.</p>
<h3>Opción 2: build local</h3>
<p>La segunda opción que tenemos es construir localmente los binarios para instalarlos en el dispositivo o ejecutarlos en un simulador. En este caso necesitaremos tener instalados y configurados los SDK de cada plataforma con la que queramos trabajar. En este apartado explicaré los stack básicos para trabajar con Android y con iOS, al ser las plataformas más populares</p>
<h4>Stack Android</h4>
<p>Necesitaremos los siguientes elementos</p>
<ul>
<li>Instalar el SDK de Android: Personalmente recomiendo instalar Android Studio y que éste se encargue de instalar lo necesario. Toda la información en su página de <a href="http://developer.android.com/sdk/">documentación</a>.</li>
<li>Un dispositivo o emulador donde probar nuestra aplicación, donde tenemos 3 opciones:
<ul>
<li>Usar Android Virtual Device: si no tienes aprecio por tu vida y tu tiempo, puedes configurar un dispositivo virtual sobre el que ejecutar tu aplicación. Es tremendamente lento pero podremos configurar cualquier tipo de dispositivo. Si has instalado Android Studio podrás crear y arrancar emuladores desde Tools -&gt; Android -&gt; AVD Manager.</li>
<li>Instalar el <i>fantabuloso </i><a href="https://www.genymotion.com">Genymotion</a>: esta plataforma de máquinas virtuales Android es realmente rápida. Podremos ejecutar cualquier máquina virtual de las que ofrecen y ser detectada por el SDK como si fuese un dispositivo físico conectado a nuestro equipo. Más información en su página web.</li>
<li>Usar un dispositivo físico: si disponemos de un móvil o tablet Android, podremos activar el modo desarrollador en él y conectarlo por USB a nuestro equipo.</li>
</ul>
</li>
</ul>
<p>Una vez configurado el SDK de Android debemos indicar que deseamos soportar dicha plataforma. Para eso ejecutamos el siguiente comando dentro de miApp:</p>
<pre>$phonegap platform add android</pre>
<p>Ya solo tendremos que ejecutar la aplicación en el dispositivo que deseemos. Si vamos a hacerlo sobre un AVD que hayamos creado, lo arrancamos previamente desde el AVD Manager y una vez arrancado el dispositivo virtual (después de 2 o 3 cafés) ejecutamos:</p>
<pre>$phonegap emulate android</pre>
<p>Si en vez de usar una instancia de AVD deseamos cargar la aplicación en una máquina virtual Genymotion previamente arrancada, o en un dispositivo android que tengamos conectado por USB, ejecutaremos esto:</p>
<pre>$phonegap run android</pre>
<p>Cada vez que lanzamos un ‘emulate’ o un ‘run’, internamente se realiza un ‘build’ que generará la última versión de nuestra app para la plataforma indicada, cuyo proyecto almacenará en el directorio platform/android. Siempre podremos abrir dicho proyecto desde Android Studio si algo no termina de funcionar o necesitamos depurar alguna parte nativa</p>
<h4>Stack iOS</h4>
<p>El SDK de iOS solo está disponible para MacX, así que necesitarás un equipo de Apple para poder hacer builds locales. Para poder crear la versión iOS de nuestra aplicación tendremos que instalar XCode desde la Mac App Store para que se instale el SDK y los simuladores.</p>
<p>Para que el cliente phonegap sea capaz de arrancar el simulador, es necesario que instales el paquete ios-sim vía npm:</p>
<pre>$npm install -g ios-sim</pre>
<p>Una vez instalado todo debemos añadir el soporte ios a nuestro proyecto:</p>
<pre>$phonegap platform add ios</pre>
<p>Ahora sí, podremos ejecutar la app en un simulador usando:</p>
<pre>$phonegap run ios</pre>
<p>Ejecutando ios-sim showdevicetypes podremos ver un listado de simuladores disponibles (iPhone5, 6, iPad, …), así que podremos indicar cual queremos</p>
<p>Si queremos ejecutarlo en un dispositivo físico, tendremos que poner</p>
<pre>$phonegap run ios --device</pre>
<p>Para esto último tendremos que habernos dado de alta en el programa de desarrolladores de Apple (99 eureles/año) y haber generado todos los certificados Apple para nuestra aplicación, pero este tema excede el alcance de este tutorial.</p>
<h3>Opción 3: generar binario usando PhoneGap Build</h3>
<p>PhoneGap Build es otro servicio <em>freemium</em> ofrecido por Adobe donde podremos compilar en la nube nuestro proyecto. Esto tiene la ventaja de no necesitar instalar ningún SDK de ninguna plataforma en nuestro equipo de desarrollo. También es una forma interesante de poder trabajar sobre iOS sin disponer de un Mac, ya que el binario realmente se generará en la nube. Ojo, seguirás necesitando darte de alta en el programa de desarrolladores de Apple, pero al menos te ahorrarás la compra del Mac.</p>
<p>Para usarla hay que darse de alta con un Adobe ID en <a href="https://build.phonegap.com" target="_blank">https://build.phonegap.com</a>/, donde disponen de un plan gratuito que podremos usar para empezar a probarla.</p>
<p>Una vez creada la cuenta, para compilar nuestro binario solo tendremos que indicar la plataforma que deseamos con el siguiente comando:</p>
<pre>$phonegap remote build android</pre>
<h2>Cómo continuar a partir de aquí.</h2>
<p>En este momento deberías ser capaz de encapsular cualquier aplicación web que únicamente haga uso de estándares HTML5, CSS3 y JavaScript, incluso podrás verlas funcionando sin muchas complicaciones en la aplicación PhoneGap App olvidándote de la instalación de SDKs nativos.</p>
<p>No hemos entrado en ningún detalle sobre la API interna de PhoneGap y cómo podríamos instalar y hacer uso de los distintos plugins que nos permitirán ir un paso más allá y hacer cosas que HTML5 y un navegador estándar no pueden hacer, como acceder a los contactos, la cámara, notificaciones push,  etc&#8230;</p>
<p>En breve haré una segunda parte donde explicaré todo eso pero de momento podrás continuar ampliando tu información en los siguientes enlaces:</p>
<ul>
<li><a href="http://docs.phonegap.com/develop/hello-world-explained/" target="_blank">Hello World Explained</a>: explicación detallada de la aplicación ejemplo que se incluye al crear el proyecto y con la que hemos estado jugando.</li>
<li><a href="https://cordova.apache.org/docs/en/latest/cordova/events/events.html" target="_blank">Eventos</a>: eventos propios de kernel que no dependen de ningún plugin.</li>
<li><a href="https://cordova.apache.org/docs/en/latest/guide/cli/index.html#link-add-plugin-features" target="_blank">Añadir plugins</a>: las opciones del interfaz de comandos para la gestión de plugins</li>
<li><a href="http://docs.phonegap.com/plugin-apis/" target="_blank">APIs de Plugins</a>: acceso a las APIs de cada uno de los plugins oficiales con ejemplos</li>
</ul>
<p>&nbsp;</p>
<p>La entrada <a rel="nofollow" href="http://alfonsomarin.com/introduccion-a-phonegap-apache-cordova/">Introducción a PhoneGap / Apache Cordova</a> se publicó primero en <a rel="nofollow" href="http://alfonsomarin.com">alfonsomarin</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>http://alfonsomarin.com/introduccion-a-phonegap-apache-cordova/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Notificaciones Push en iOS con PhoneGap / Cordova</title>
		<link>http://alfonsomarin.com/ios-push-phonegap/</link>
					<comments>http://alfonsomarin.com/ios-push-phonegap/#comments</comments>
		
		<dc:creator><![CDATA[alfonso]]></dc:creator>
		<pubDate>Thu, 25 Sep 2014 08:00:51 +0000</pubDate>
				<category><![CDATA[Desarrollo Móvil]]></category>
		<guid isPermaLink="false">http://alfonsomarin.com/?p=1022</guid>

					<description><![CDATA[<p>En este artículo voy a explicar cómo integrar notificaciones push en un proyecto con Cordova/PhoneGap para iOS. Requisitos Las notificaciones push no funcionan en el simulador iOS incorporado en Xcode, y por tanto necesitaremos una cuenta de desarrollador iOS para poder generar los certificados apropiados y poder probar nuestra aplicación en un terminal. Además, al [&#8230;]</p>
<p>La entrada <a rel="nofollow" href="http://alfonsomarin.com/ios-push-phonegap/">Notificaciones Push en iOS con PhoneGap / Cordova</a> se publicó primero en <a rel="nofollow" href="http://alfonsomarin.com">alfonsomarin</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>En este artículo voy a explicar cómo integrar notificaciones push en un proyecto con Cordova/PhoneGap para iOS.</p>
<h2>Requisitos</h2>
<p>Las notificaciones push no funcionan en el simulador iOS incorporado en Xcode, y por tanto necesitaremos una <b>cuenta de desarrollador iOS</b> para poder generar los certificados apropiados y poder probar nuestra aplicación en un terminal. Además, al tratarse de una aplicación iOS necesitaremos trabajar con un <b>equipo Mac</b>.</p>
<h2>Resultado</h2>
<p>Al final de este artículo tendremos una aplicación iOS basada en Cordova/PhoneGap capaz de recibir mensajes push y una pequeña aplicación de servidor realizada en PHP capaz de mandarlos. Ambas aplicaciones están exentas de <em>florituras</em> y serán extremadamente sencillas, con el código estrictamente necesario para realizar su cometido, que es enviar y recibir mensajes push.</p>
<h2>Preparativos previos</h2>
<p>Antes de empezar, vamos a crear una carpeta en nuestro equipo donde almacenaremos todos los elementos de este proyecto. La carpeta la llamaremos testpush y crearemos 3 directorios: <strong>certs</strong>, <strong>app</strong> y <strong>server</strong>.</p>
<p><a href="http://localhost/business/wp-content/uploads/2014/09/push-ios-folder-project.png"><img class="alignnone wp-image-1023 size-full" src="http://localhost/business/wp-content/uploads/2014/09/push-ios-folder-project.png" alt="push-ios-folder-project" width="456" height="180" srcset="http://alfonsomarin.com/wp-content/uploads/2014/09/push-ios-folder-project.png 456w, http://alfonsomarin.com/wp-content/uploads/2014/09/push-ios-folder-project-300x118.png 300w" sizes="(max-width: 456px) 100vw, 456px" /></a></p>
<p>En certs meteremos los certificados de Apple (ya veremos qué son y cómo se crean), en app meteremos el proyecto Cordova/PhoneGap y en server el código PHP de nuestro servidor capaz de enviar push.</p>
<h2>Introducción a las notificaciones push en iOS</h2>
<p>Con mucha probabilidad ya sabrás lo que son las notificaciones push, que son básicamente mensajes generados desde un servidor y que llegan a nuestro terminal sin necesidad de que el terminal esté consultando constantemente al servidor.</p>
<p>El primero que introdujo este concepto fue Blackberry, pero actualmente está presente en todas las plataformas y cada una aborda el problema de forma ligeramente diferente. La estrategia que sigue Apple es la siguiente:</p>
<ol>
<li>La aplicación deberá indicar al sistema operativo que desea recibir notificaciones, y el sistema operativo le pedirá permiso al usuario (típica pantalla de “La aplicación X desea enviarle notificaciones”)</li>
<li>Si el usuario ha aceptado, la aplicación se registrará en los servidores de Apple <b>APNS</b> (Apple Push Notification Service) y obtendrá un <b>token</b>, el cual podemos ver como una dirección a la que se enviarán los mensajes y que identifica a la aplicación y al dispositivo sobre el que se ha instalado.</li>
<li>Nuestra aplicación le hará llegar el token al <b>servidor</b> (normalmente nuestro) que realizará las notificaciones push. En terminología Apple a estos servidores los llaman <i>Providers.</i></li>
<li>Cada vez que el servidor desee comunicarse con ese dispositivo, hará una petición al APNS indicándole el <b>mensaje push</b> y el <strong>token</strong> asociado del dispositivo al que queremos enviarlo.</li>
</ol>
<p>Fácil, ¿verdad?</p>
<h2>Particularidades a las notificaciones push en iOS</h2>
<p>También es conveniente saber ciertas peculiaridades de las notificaciones push en iOS:</p>
<ul>
<li>No son confiables: es decir, no hay ninguna garantía de que una notificación push llegue al destino, aunque el APNS haya aceptado el mensaje. El dispositivo podría estar apagado o fuera de cobertura, y el APNS lo reintentará varias veces, pero si no lo consigue lo desechará.</li>
<li>Los mensajes no pueden contener más de <b>256 caracteres</b></li>
<li>Aparte del mensaje, una notificación push podría indicar estas opciones:
<ul>
<li><b>sound</b>: con qué sonido debe sonar la notificación (en caso de que el usuario haya permitido los sonidos). Si no se indica sonará con el sonido por defecto.</li>
<li><b>badge</b>: el numerito que debe aparecer en el globo del icono (en caso de que el usuario haya permitido globos en los iconos)</li>
</ul>
</li>
</ul>
<h2>Alta de aplicación en Apple y generación de certificados</h2>
<p>Antes de empezar a crear la aplicación es conveniente crear todos los elementos que posteriormente se necesitarán para que funcionen las notificaciones push. Así que de momento nos toca “hacer papeleo”.</p>
<p>Concretamente necesitaremos que crear los siguientes elementos:</p>
<ul>
<li><b>App ID</b>: deberemos dar de alta un ID de aplicación para que podamos asociarle el resto de elementos, además de activarle explícitamente el s<strong>oporte a Push Notifications.</strong></li>
<li><b>Certificado Push</b>: debemos generar un certificado específics para el servicio Push que será utilizado por nuestro servidor para comunicarse con el APNS. Este certificado irá asociados al App ID, así que únicamente servirá para mandar mensajes a esa aplicación.</li>
<li><b>Perfil de aprovisionamiento (provisioning profile)</b>: es necesario crear un perfil asociado al App ID para que podamos configurarlo en Xcode y así poder instalar la aplicación en un dispositivo real.</li>
</ul>
<p>Para crear todos estos elementos, entraremos en nuestra cuenta de desarrollador iOS, en la sección <b>Certificates, Identifiers &amp; Profiles</b>.</p>
<p><span style="text-decoration: underline;"><b>Paso 1: Creación del App ID</b></span></p>
<p>Nos vamos a <b>Identifiers</b> y luego a <b>App IDs</b>, donde pulsando en el botón + podremos crear uno nuevo.</p>
<p>En el formulario de creación debemos especificar estos valores:</p>
<ul>
<li>App ID Description: el nombre de nuestra app. En este caso <b>Test Push</b>.</li>
<li>Explicit App ID: el identificador único de nuestra app, normalmente especificado como dominio inverso. Yo he puesto <b>com.alfonsomarin.testpush</b> (tú tendrás que poner otro diferente)</li>
<li>App Services: qué servicios queremos tener disponibles en nuetra app. Debemos marcar al menos <b>Push Notifications</b>, que es para lo que queremos la app.</li>
</ul>
<p>Confirmamos y se generará el App ID, al cual iremos asociando los certificados y profiles</p>
<p><span style="text-decoration: underline;"><b>Paso 2: Generación de certificado Push</b></span></p>
<p>Ahora toca crear el certificado, que es uno de los pasos más pesados. Antes de continuar comentar que Apple identifica dos entornos diferenciados: <b>desarrollo</b> (development) y <b>producción</b> (production). El entorno de desarrollo nos permitirá instalar nuestra aplicación en dispositivos de pruebas mientras estemos desarrollándola, y el entorno de producción nos permitirá generar las versiones destinadas a publicación, ya sea para la App Store o instalaciones Ad Hoc.</p>
<p>En este tutorial vamos a generar el certificado y el perfil de desarrollo, siendo idénticos los pasos a seguir para generar los de producción.</p>
<p>Para crear el certificado necesitaremos generar un fichero llamado <i>Certificate Signing Request (CSR)</i>, el cual nos pedirá Apple para poder generar los certificados. A <em>grosso modo</em> y sin entrar en detalles de funcionamiento, los certificados Apple están basados en clave pública y clave privada, y el CSR realmente contiene la clave privada con la que Apple generará el certificado público, por eso debemos proporcionarlo nosotros.</p>
<p>Para crear el CRS debemos hacer lo siguiente:</p>
<ol>
<li>Abrir el programa <strong>Acceso a llaveros</strong></li>
<li>En el menú superior, seleccionamos <b>Acceso a llaveros</b> → <b>Asistente para Certificados</b> → <b>Solicitar un certificado de una autoridad de certificación</b>…</li>
<li>Indicamos los siguientes valores:
<ol>
<li>Dirección de correo del usuario: ponemos cualquier dirección de correo</li>
<li>Common Name: ponemos <b>Test Push</b>. Podemos poner cualqueir cosa pero poner el nombre de la app nos ayudará a localizar posteriormente la clave privada.</li>
<li>Seleccionamos “<b>Se guarda en el disco</b>”, y pulsamos Continuar</li>
</ol>
</li>
</ol>
<p><a href="http://localhost/business/wp-content/uploads/2014/09/test-push-csr.png"><img class="alignnone wp-image-1024 size-full" src="http://localhost/business/wp-content/uploads/2014/09/test-push-csr.png" alt="test-push-csr" width="648" height="466" srcset="http://alfonsomarin.com/wp-content/uploads/2014/09/test-push-csr.png 648w, http://alfonsomarin.com/wp-content/uploads/2014/09/test-push-csr-300x216.png 300w" sizes="(max-width: 648px) 100vw, 648px" /></a></p>
<p>Nos pedirá que guardemos la clave en algún sitio de nuestro disco duro. La guardaremos como <strong>TestPush.certSigningRequest</strong> en el directorio <b>certs</b> de nuestro proyecto.</p>
<p>Antes de salir del programa Acceso a llaveros, exportaremos la clave que acabamos de generar a un fichero .p12 que posteriormente también necesitaremos. Para ello nos vamos a la sección “Claves” y al final aparecerán el par de claves (pública y privada) que acabamos de crear. Pinchamos en la clave privada con el botón derecho y seleccionamos <b>Exportar “Test Push”</b>. Lo guardaremos como TestPush.p12 también en el directorio <b>certs</b> de nuestro proyecto, y nos pedirá un password con el que cifrar el fichero. Es importante recordar ese password pues posteriormente lo necesitaremos.</p>
<p><a href="http://localhost/business/wp-content/uploads/2014/09/export-key.png"><img class="alignnone size-full wp-image-1025" src="http://localhost/business/wp-content/uploads/2014/09/export-key.png" alt="export-key" width="600" height="361" srcset="http://alfonsomarin.com/wp-content/uploads/2014/09/export-key.png 600w, http://alfonsomarin.com/wp-content/uploads/2014/09/export-key-300x181.png 300w" sizes="(max-width: 600px) 100vw, 600px" /></a></p>
<p>Ahora sí que podemos crear el certificado Push. En el panel de desarrollador de Apple nos vamos a <b>Certificates</b> y en <b>All</b> pulsamos el botón + para empezar con la creación:</p>
<ol>
<li>Seleccionamos <b>Apple Push Notification service SSL (Sandbox)</b>, de la sección <i>Development</i>. Si quisiésemos generar los de producción tendríamos que seleccionar <b>Apple Push Notification service SSL (Production)</b> de la sección <i>Production</i>.</li>
<li>En el siguiente paso seleccionamos el App ID que acabamos de crear</li>
<li>Ahora nos pide que subamos el CSR, el cual encontraremos en el directorio certs de nuestro proyecto</li>
<li>Una vez subido el CSR se generará el certificado, que debemos descargar y guardar en el directorio certs. Lo guardaremos como <b>testpush_aps_development.cer</b></li>
</ol>
<p>Al llegar a este punto deberías tener 3 ficheros en el directorio certs:</p>
<ul>
<li>El fichero CSR</li>
<li>La clave privada en formato .p12</li>
<li>El certificado SSL generado por Apple en formato .cer</li>
</ul>
<p>De momento el fichero CSR ya no lo necesitaremos más, pero es conveniente que lo guardemos para poder utilizarlo de nuevo cuando tengamos que renovar el certificado SSL (expiran cada año), ya que así no tendremos que generar una nueva clave y podremos reutilizar el mismo fichero .p12 ya generado. Además, también podremos utilizarlo para solicitar el certificado de producción.</p>
<p>A la hora de trabajar con certificados en PHP es más cómodo trabajar con un único fichero en formato PEM que contenga tanto la clave privada como el certificado. Vamos a crear ese fichero .pem con los siguientes comandos (ejecutados desde el directorio certs de nuestro proyecto):</p>
<pre>$ openssl x509 -in testpush_aps_development.cer -inform der -out TestPushCert.pem
$ openssl pkcs12 -nocerts -out TestPushKey.pem -in TestPush.p12
</pre>
<p>(introducir la contraseña que pusimos cuando creamos el fichero .p12, y pedirá una nueva para el fichero .pem. Yo he utilizado otra vez testpush)</p>
<pre>$ cat TestPushKey.pem TestPushCert.pem &gt; TestPushCK.pem
</pre>
<p>Y por fin hemos terminado con los certificados. Esto nos generará el fichero combinado <b>TestPushCK.pem</b>, que junto a la contraseña que hemos usado es lo que tendrá que utilizar nuestro servidor para enviar notificacioens push.</p>
<p><span style="text-decoration: underline;"><b>Paso 3: Creación de </b><b><i>Provisioning Profile</i></b></span></p>
<p>Ya solo queda crear el perfil de aprovisionamiento para poder firmar nuestra app en Xcode. En el panel de desarrollador de Apple nos vamos a <b>Provisioning Profiles</b> y en <b>All</b> pulsamos el botón + para empezar con la creación:</p>
<ul>
<li>Seleccionamos <b>iOS App Development</b>: recordemos que estamos en desarrollo. También podríamos seleccionar para distribución en AppStore o AdHoc.</li>
<li>Seleccionamos el <b>App ID</b> generado en el paso 1.</li>
<li>Seleccionamos el certificado de desarrollador que incorporará el perfil</li>
<li>Seleccionamos los dispositivos sobre los que podremos instalar la aplicación. Aquí ya deberías tener los tuyos dados de alta, pero si no es así tendrás que hacerlo previamente desde Devices → All.</li>
<li>Por último, indicamos un nombre descriptivo para el profile. Le ponemos <b>TestPushDev</b> (a mi me gusta poner sufijos Dev, AdHoc o AppStore según sea el tipo de perfil que estoy creando).</li>
</ul>
<p>Una vez generado podremos descargarlo y a través del Finder arrastrarlo al icono de Xcode para instalarlo, pero si tenemos configurada nuestra cuenta de desarrollador en Xcode podremos sincronizarla con el portal y el perfil se descargará automáticamente. Podemos sincronizar desde el menú Xcode → Preferences → Accounts → View Details (pulsar icono de sincronización).</p>
<h2>Creación de la aplicación Cordova/PhoneGap para iOS</h2>
<p>Ha llegado el momento de crear nuestra aplicación. El cometido de la misma será únicamente obtener el <b>token</b> proporcionado por el APNS tras el registro y mostrarlo por pantalla. En una aplicación real lo que debería hacer es enviarlo al servidor y que este lo almacenase de alguna forma (en base de datos, por ejemplo), pero por simplificar símplemente lo mostrará por pantalla para que podamos copiarlo y meterlo manualmente en una variable del servidor. Así simplificaremos el código de ambas aplicaciones evitando tener que implementar funcionalidades complementarias que no están directamente relacionadas con el proceso de notificaciones push.</p>
<p><span style="text-decoration: underline;"><b>Paso 1: creacion del proyeto</b></span></p>
<p>Para crear el proyecto Cordova/PhoneGap haremos uso del cliente cordova, que ya deberías tener instalado. Para ello abrimos un terminal, nos situamos dentro del directorio <b>app</b> de nuestro proyecto y escribimos:</p>
<pre>$ cordova create . com.alfonsomarin.testpush TestPush
</pre>
<p>Añadimos la plataforma ios al proyecto</p>
<pre>$ cordova platform add ios
</pre>
<p><span style="text-decoration: underline;"><b>Paso 2: Instalación del plugin de notificaciones Push</b></span></p>
<p>Cordova no ofrece un plugin oficial para soporte de notificaciones push, así que tendremos que hacer uso de algún plugin de terceros. El que voy a utilizar es <a href="https://github.com/phonegap-build/PushPlugin" target="_blank">PushPlugin</a> debido a su popularidad y por ser uno de los más completos, estables y mejor mantenidos por el momento. De hecho, aparte de iOS y Android ofrece soporte a Windows Phone 8, Windows8 y Amazon Fire OS, lo cual es muy interesante en vistas a futuras adaptaciones de nuestra aplicación a dichas plataformas.</p>
<p>Por tanto, el siguiente paso es instalar dicho plugin:</p>
<pre>$ cordova plugin add https://github.com/phonegap-build/PushPlugin.git
</pre>
<p><span style="text-decoration: underline;"><b>Paso 3: Inclusión del código de registro de nuestra aplicación</b></span></p>
<p>Como ya sabemos lo primero que debe hacer nuestra aplicación es indicar al sistema operativo que deseamos recibir notificaciones, para que este le pida permiso al usuario y así poder obtener nuestro token.</p>
<p>El plugin ofrece esta funcionalidad a través de la llamada <b>register(tokenHandler, errorHandler, options)</b>, cuyos parámetros tienen el siguiente significado:</p>
<ul>
<li><strong>tokenHandler</strong>: función que recibirá el token. Esta función sería la encargada de registralo en el servidor, pero como hemos comentado, por simplicidad únicamente mostrará el token por pantalla.</li>
<li><strong>errorHandler</strong>: si ha habido algún error, el plugin invocará esta función</li>
<li><strong>options</strong>: un hash donde indicaremos los siguientes valores:
<ul>
<li><em>badge</em>: para indicarle al APNS si nuestra aplicación hará uso de globos en los iconos</li>
<li><em>sound</em>: para indicarle al APNS si nuestra aplicación especificará el sonido a emitir en las notificaciones</li>
<li><em>alert</em>: para indicarle al APNS si los mensajes contendrán algo de texto o no.</li>
<li><em>ecb</em>: función callback que será invocada por el plugin cada vez que se reciba una notificación.</li>
</ul>
</li>
</ul>
<p>Sabiendo esto podremos entender mejor el código que vamos a meter a continuación. Este código lo meteremos en el propio fichero <b>www/js/index.js</b> generado en el proyecto base de Cordova/PhoneGap, el cual ya se encarga de gestionar la recepción del evento inicial <em>ondeviceready</em>, que es el que nos indica que podemos hacer uso de los plugins.</p>
<p>Así que editamos este fichero y <span style="text-decoration: underline;">al final</span> de la función <strong>onDeviceReady</strong> incluímos este código</p>
<pre>window.plugins.pushNotification.register(
    function(token){
        alert(token);
    },
    function(){alert(‘Error al registrarse en el servidor APNS’);},
    {
        "badge":"true",
        "sound": "true",
        "alert": "true",
        "ecb": "onNotificationAPN"
    });
</pre>
<p>Vemos que hemos definido tokenHandler y errorHandler como funciones inline, hemos especificado que queremos activar todas las opciones y por último hemos indicado que nuestra función para recibir las notificaciones push será onNotificationAPN.</p>
<p>Ahora solo nos queda incluir la función onNotificationAPN, que la incluiremos fuera del objeto app en el propio index.js:</p>
<pre>function onNotificationAPN (event) {
    if (event.alert) {
       alert(event.alert);
    }

    if (event.sound) {
        var snd = new Media(event.sound);
        snd.play();
    }

    if (event.badge) {
        window.plugins.pushNotification.setApplicationIconBadgeNumber(function(){}, function(){}, event.badge);
    }
}
</pre>
<p>La implementación es bastante sencilla. Si la notificación push incluye un mensaje, lo mostramos en una pantalla de alerta. Si incluye un sonido, lo reproducimos con un objeto Media (necesitaríamos instalar el plugin org.apache.cordova.media). Y por último, si incluye un número a establecer como globo en el icono, lo hacemos con setApplicationIconBadgeNumber, otra función ofrecida por el plugin.</p>
<p><b>Paso 4: Compilación y ejecución</b></p>
<p>Ahora debemos compilar la aplicación para generar el proyecto Xcode</p>
<pre>$ cordova build ios
$ open platforms/ios/TestPush.xcodeproj</pre>
<p>Una vez dentro de Xcode, debemos hacer unos ajustes antes de poder ejecutar la aplicación en nuestro dispositivo iOS. Tendremos que ajustar en el proyecto el perfil de aprovisionamiento (provisioning profile) que creamos anteriormente. Este ya deberías tenerlo instalado en xcode si lo descargaste y arrastraste el fichero al icono de Xcode, o si sincronizaste tu cuenta a través de las preferencias como te comenté.</p>
<p>En el panel <i>Project Navigator</i> seleccionamos nuestro proyecto y nos vamos a la pestaña <i>Build Settings</i>, donde buscaremos la sección <i>Code Signing</i>. En dicha sección buscaremos la opción <i>Provisioning Profile</i>, donde seleccionaremos el perfil <b>TestPushDev</b>.</p>
<p><a href="http://localhost/business/wp-content/uploads/2014/09/xcode-profile.png"><img class="alignnone size-full wp-image-1027" src="http://localhost/business/wp-content/uploads/2014/09/xcode-profile.png" alt="xcode-profile" width="800" height="377" srcset="http://alfonsomarin.com/wp-content/uploads/2014/09/xcode-profile.png 800w, http://alfonsomarin.com/wp-content/uploads/2014/09/xcode-profile-300x141.png 300w, http://alfonsomarin.com/wp-content/uploads/2014/09/xcode-profile-768x362.png 768w" sizes="(max-width: 800px) 100vw, 800px" /></a></p>
<p>Ahora ya podremos enchufar el dispositivo iOS a nuestro Mac y ejecutar la aplicación. Veremos que al arrancar lo primero que hace es pedirnos permiso para enviarnos notificaciones, que es lo que esperábamos. Si aceptamos, a los segundos nos aparecerá la alerta mostrándonos nuestro token.</p>
<p><a href="http://localhost/business/wp-content/uploads/2014/09/ios-apns-register.png"><img class="alignnone size-full wp-image-1028" src="http://localhost/business/wp-content/uploads/2014/09/ios-apns-register.png" alt="ios-apns-register" width="600" height="501" srcset="http://alfonsomarin.com/wp-content/uploads/2014/09/ios-apns-register.png 600w, http://alfonsomarin.com/wp-content/uploads/2014/09/ios-apns-register-300x251.png 300w" sizes="(max-width: 600px) 100vw, 600px" /></a></p>
<p>En sucesivas ejecuciones de la aplicación nos aparecerá el token directamente, pues el permiso solo la primera vez.</p>
<h2>Desarrollo de la aplicación servidor (provider)</h2>
<p>Ahora vamos a hacer un pequeño script en PHP que será capaz de enviar mensajes Push a nuestra aplicación. Este script representaría al servidor, y es un poco “tosco” pues como veremos le meteremos el token a mano, pero como ya hemos comentado lo haremos así por simplicidad y para centrarnos en el proceso de mensajería push.</p>
<p>Dentro del directorio server de nuestro proyecto, crearemos un script llamado <b>server.php</b> con el siguiente contenido:</p>
<pre lang="php">// Nuestro token
$deviceToken = '4a9988acca4d63f7434279de17290eab37fd4006d57d66879d4c743937db958c';

// El password del fichero .pem
$passphrase = 'testpush';

// El mensaje push
$message = '¡Mi primer mensaje Push!';

$ctx = stream_context_create();
//Especificamos la ruta al certificado .pem que hemos creado
stream_context_set_option($ctx, 'ssl', 'local_cert', '../certs/TestPushCK.pem');
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);

// Abrimos conexión con APNS
$fp = stream_socket_client(
	'ssl://gateway.sandbox.push.apple.com:2195', $err,
	$errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);

if (!$fp) {
	exit("Error de conexión: $err $errstr" . PHP_EOL);
}

echo 'Conectado al APNS' . PHP_EOL;

// Creamos el payload
$body['aps'] = array(
	'alert' =&gt; $message,
	'sound' =&gt; 'bingbong.aiff',
	'badge' =&gt; 35
	);

// Lo codificamos a json
$payload = json_encode($body);

// Construimos el mensaje binario
$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;

// Lo enviamos
$result = fwrite($fp, $msg, strlen($msg));

if (!$result) {
	echo 'Mensaje no enviado' . PHP_EOL;
} else { 
	echo 'Mensaje enviado correctamente' . PHP_EOL;
}

// cerramos la conexión
fclose($fp);

</pre>
<p>Tendrás que cambiar el token por el que te haya dado a tí el APNS (una forma rápida de copiarlo es abriendo en el Mac en navegador Safari mientras se ejecuta la aplicación y abrir la consola de desarrollo remota a través del menú Desarrollo → &lt;nombre de tu iDispositivo&gt; → index.html, y poniendo window.testPush abajo).</p>
<p>También te podrás fijar que hemos puesto como <i>badge</i> un número alto (35), para comprobar que efectivamente se establece como globo en el icono.</p>
<p>Ahora ya solo tenemos que ejecutar el script y ver cómo llega nuestro mensaje. En el terminal, dentro del directorio server, escribimos:</p>
<pre>$ php server.php
</pre>
<p>Si hemos seguido todos los pasos indicados en este tutorial deberías ver el mensaje en tu terminal:<br />
<a href="http://localhost/business/wp-content/uploads/2014/09/ios-push-screenshots.png"><img class="alignnone size-full wp-image-1029" src="http://localhost/business/wp-content/uploads/2014/09/ios-push-screenshots.png" alt="ios-push-screenshots" width="800" height="452" srcset="http://alfonsomarin.com/wp-content/uploads/2014/09/ios-push-screenshots.png 800w, http://alfonsomarin.com/wp-content/uploads/2014/09/ios-push-screenshots-300x170.png 300w, http://alfonsomarin.com/wp-content/uploads/2014/09/ios-push-screenshots-768x434.png 768w" sizes="(max-width: 800px) 100vw, 800px" /></a></p>
<h2>Referencias y enlaces de interés</h2>
<ul>
<li><a href="https://github.com/almarin/ios-push-phonegap-demo" target="_blank">Código fuente del proyecto</a></li>
<li><a href="http://www.raywenderlich.com/32960/apple-push-notification-services-in-ios-6-tutorial-part-1" target="_blank">Apple Push Notification Services in iOS 6</a></li>
<li><a href="https://github.com/phonegap-build/PushPlugin" target="_blank">PushPlugin</a></li>
</ul>
<p>La entrada <a rel="nofollow" href="http://alfonsomarin.com/ios-push-phonegap/">Notificaciones Push en iOS con PhoneGap / Cordova</a> se publicó primero en <a rel="nofollow" href="http://alfonsomarin.com">alfonsomarin</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>http://alfonsomarin.com/ios-push-phonegap/feed/</wfw:commentRss>
			<slash:comments>18</slash:comments>
		
		
			</item>
		<item>
		<title>APIs HTML5: localStorage</title>
		<link>http://alfonsomarin.com/localstorage/</link>
					<comments>http://alfonsomarin.com/localstorage/#respond</comments>
		
		<dc:creator><![CDATA[alfonso]]></dc:creator>
		<pubDate>Wed, 17 Sep 2014 20:29:02 +0000</pubDate>
				<category><![CDATA[Desarrollo Móvil]]></category>
		<category><![CDATA[Desarrollo Web]]></category>
		<guid isPermaLink="false">http://alfonsomarin.com/?p=1008</guid>

					<description><![CDATA[<p>LocalStorage, o DOM Storage como lo llaman algunos fabricantes, hace referencia a la especificación HTML5 Web Storage que permite la persistencia de objetos llave/valor en el navegador de forma similar a las cookies, en el sentido de que los datos permanecerán aunque salgamos de la página, cerremos la pestaña o el navegador. Sin embargo, al [&#8230;]</p>
<p>La entrada <a rel="nofollow" href="http://alfonsomarin.com/localstorage/">APIs HTML5: localStorage</a> se publicó primero en <a rel="nofollow" href="http://alfonsomarin.com">alfonsomarin</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>LocalStorage, o DOM Storage como lo llaman algunos fabricantes, hace referencia a la especificación HTML5 <a href="http://dev.w3.org/html5/webstorage/">Web Storage</a> que permite la persistencia de objetos llave/valor en el navegador de forma similar a las cookies, en el sentido de que los datos permanecerán aunque salgamos de la página, cerremos la pestaña o el navegador. Sin embargo, al contrario de lo que sucede con las cookies, esta información nunca se envía al servidor.</p>
<p>Este estándar fue adoptado por la mayoría de navegadores prácticamente desde el mismo momento en que se hizo público el documento de especificación del W3C allá por 2009, así que lo encontraremos en prácticamente cualquier navegador, y con seguridad en cualquier navegador moderno de escritorio o móvil.</p>
<p>El acceso a este almacenamiento se realiza a través del objeto <em>localStorage</em>, así que una forma de saber si disponemos de él sería haciendo lo siguiente:</p>
<pre lang="javascript">function supports_html5_storage() {
  try {
    return 'localStorage' in window &amp;&amp; window['localStorage'] !== null;
  } catch (e) {
    return false;
  }
}
</pre>
<p>Sin embargo, como digo es difícil encontrar a día de hoy un navegador que no lo soporte.</p>
<h3>Uso de localStorage</h3>
<p>Como he comentado, se trata de un almacenamiento de tipo llave/valor, pudiendo asociar a un string (llave) un determinado valor. Este valor puede ser de cualquier tipo básico soportado por javascript, a saber: string, integer, boolean y float.</p>
<p>A continuación se muestra cómo podemos guardar y recuperar un valor a través del objeto localStorage:</p>
<pre lang="javascript">//Guardar un valor
localStorage.setItem('hola', 'Mundo');
//Recuperar un valor
var v = localStorage.getItem('hola');
//Borramos el valor
localStorage.removeItem('hola’);
</pre>
<p>También podemos trabajar con el objeto localStorage como si un objeto stándard de javascript se tratase:</p>
<pre lang="javascript">localStorage.hola = 'Mundo';
var v = localStorage['hola’];
delete localStorage.hola;
</pre>
<p><em>localStorage</em> también proporciona la variable <em>length</em> por la que podremos saber el número de objetos guardados hasta el momento. Sabiendo el número total de objetos también podremos acceder a las llaves definidas hasta el momento con la función <em>key()</em>, a la que tendremos que pasar un valor numérico entre 0 y length-1. Ejemplo:</p>
<pre lang="javascript">localStorage.hola = 'Mundo';
console.log(localStorage.length); // salida: 1
console.log(localStorage.key(0)); // salida: “hola”
</pre>
<p>Por último, si necesitamos limpiar completamente toda la información almacenada podremos hacer uso de la función localStorage.clear().</p>
<h3>Formato de almacenamiento</h3>
<p>Aunque podemos guardar cualquier valor de tipo básico de javascript como string, boolean, integer o float, el estándar determina que la información siempre se almacenará como string, así que habrá que tenerlo en cuenta a la hora de recuperar información utilizando <em>parseInt()</em> o <em>parseFloat()</em> según sea el tipo original del valor.</p>
<pre lang="javascript">localStorage.numero = 45;
console.log(localStorage.numero); //salida: “45”
localStorage.real = 3.1416;
console.log(localStorage.real); //salida: “3.1416”
</pre>
<p>Esta peculiaridad es especialmente frustrante con los booleanos. Por ejemplo:</p>
<pre lang="javascript">localStorage.falso = false;
if (localStorage.falso){
console.log(‘pues no es falso, es verdadero’);
}
</pre>
<p>Hay que tener cuidado con eso.</p>
<h3>Limitación de espacio y chequeo</h3>
<p>La especificación del W3C respecto a este estándar recomienda un máximo de 5MB para este tipo de almacenamiento por origen (por dominio), cantidad que ha sido bastante respetada por las implementaciones llevadas a cabo por los navegadores. Una vez que se alcance dicha cuota se emitirá una excepción de tipo “QUOTA_EXCEEDED_ERR”.</p>
<p>Aunque no hay un método estándar para saber el tamaño actual ocupado por localStorage, dado que sabemos que todos los datos se almacenan como strings podemos hacer la siguiente aproximación:</p>
<pre lang="javascript">var localStorageSpace = function(){
  var allStrings = '';
  for(var key in window.localStorage){
    if(window.localStorage.hasOwnProperty(key)){
      allStrings += window.localStorage[key];
    }
  }
  return allStrings ? ((allStrings.length*16)/(8*1024)) + ' KB' : 'Empty (0 KB)';
};
</pre>
<h3>Su hermano sessionStorage</h3>
<p>Similar al objeto <em>localStorage</em>, podremos encontrar otro objeto llamado sessionStorage, cuya persistencia únicamente se garantiza mientras la página esté activa, es decir, mientras no cerremos la pestaña de navegación o el navegador. Ideal para hacer uso de caches</p>
<h3>Uso actual de localStorage</h3>
<p><em>localStorage</em> se ha convertido en una herramienta esencial en numerosas aplicaciones web, si bien su uso se convierte en esencial en aplicaciones web móviles encapsuladas con Apache Córdova (PhoneGap), donde muchas de ellas no necesitan grandes necesidades de almecenamiento pero sí hacer persistentes ciertas preferencias de usuario, o cachear alguna información para uso en modo offline. Gracias a localStorage no es necesario recurrir a plugins extras cuando las necesidades de almacenamiento no son excesivas.</p>
<h3>Eventos</h3>
<p>También podemos detectar modificaciones en localStorage ya que cada vez que ejecutamos funciones como setItem, removeItem o clear, se dispara el evento ‘storage’, pudiendo establecer un listener sobre este:</p>
<pre lang="javascript">window.addEventListener(“storage”, function(e){
// Internet Exprorer
if (!e) { e = window.event; }
}, false);
</pre>
<p>La función que asociemos al evento recibirá un parámetro de tipo StorageEvent donde se nos indicará la key modificada, el valor antiguo, el nuevo y la url que propició el cambio.</p>
<h3>Depuración</h3>
<p>Según el navegador que utilicemos podremos consultar visualmente el contenido almacenado en localStorage. Algunos navegadores incorporan estos visualizadores en sus herramientas para desarrolladores, como es el caso de Chrome y Safari (Recursos -&gt; Almacenamiento local). Otros como firefox de momento necesitan hacerlo a través de <a href="https://addons.mozilla.org/es/firefox/addon/foundstone-html5-local-storage/">una extensión</a>.</p>
<p>&nbsp;</p>
<p>La entrada <a rel="nofollow" href="http://alfonsomarin.com/localstorage/">APIs HTML5: localStorage</a> se publicó primero en <a rel="nofollow" href="http://alfonsomarin.com">alfonsomarin</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>http://alfonsomarin.com/localstorage/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>V Curso de desarrollo de aplicaciones móviles multiplataforma con Tecnologías Web en Universidad de Murcia</title>
		<link>http://alfonsomarin.com/v-curso-de-desarrollo-de-aplicaciones-moviles-multiplataforma-con-tecnologias-web-en-universidad-de-murcia/</link>
					<comments>http://alfonsomarin.com/v-curso-de-desarrollo-de-aplicaciones-moviles-multiplataforma-con-tecnologias-web-en-universidad-de-murcia/#comments</comments>
		
		<dc:creator><![CDATA[alfonso]]></dc:creator>
		<pubDate>Mon, 15 Sep 2014 11:51:33 +0000</pubDate>
				<category><![CDATA[Desarrollo Móvil]]></category>
		<guid isPermaLink="false">http://alfonsomarin.com/?p=1016</guid>

					<description><![CDATA[<p>Este mes se ha abierto el plazo de inscripción para la nueva edición del curso Desarrollo de aplicaciones móviles multiplataforma con tecnologías web, curso online que imparto ya desde algunos años en la Universidad de Murcia. El curso sigue centrado en las tecnologías Sencha Touch, PhoneGap (ahora Apache Cordova) y Appcelerator Titanium. He actualizado los contenidos [&#8230;]</p>
<p>La entrada <a rel="nofollow" href="http://alfonsomarin.com/v-curso-de-desarrollo-de-aplicaciones-moviles-multiplataforma-con-tecnologias-web-en-universidad-de-murcia/">V Curso de desarrollo de aplicaciones móviles multiplataforma con Tecnologías Web en Universidad de Murcia</a> se publicó primero en <a rel="nofollow" href="http://alfonsomarin.com">alfonsomarin</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Este mes se ha abierto el plazo de inscripción para la nueva edición del curso <strong>Desarrollo de aplicaciones móviles multiplataforma con tecnologías web</strong>, curso online que imparto ya desde algunos años en la Universidad de Murcia.</p>
<p>El curso sigue centrado en las tecnologías <strong><a title="Sencha Touch" href="www.sencha.com/products/touch/" target="_blank">Sencha Touch</a></strong>, <strong><a title="PhoneGap" href="http://phonegap.com" target="_blank">PhoneGap</a></strong> (ahora <a href="http://cordova.apache.org" target="_blank">Apache Cordova</a>) y <strong><a title="Appcelerator Titanium" href="http://www.appcelerator.com/titanium/" target="_blank">Appcelerator Titanium</a></strong>. He actualizado los contenidos a las últimas versiones de cada librería incluyendo algunas novedades que incorporan éstas, y voy a incluir una aplicación completa desarrollada con cada framework, contenido que venía siendo demandado por los alumnos en otras ediciones del curso.</p>
<p>Te recuerdo que el curso es <strong>100% online</strong> y <strong>cualquiera puede matricularse</strong>, seas alumno de la Universidad de Murcia o no, aunque si eres alumno tendrás la ventaja de la convalidación de créditos.</p>
<p>A continuación os pongo la información que suelo distribuir a través de las listas de correo de la universidad, aunque podéis ampliar información en la página web específica que tengo montada para el curso: <a title="Curso Desarrollo móvil multiplataforma con tecnologías web" href="http://webs.um.es/almarin/curso" target="_blank"><strong>Curso de desarrollo de aplicaciones móviles multiplataforma con tecnologías web</strong></a>.</p>
<h4>¿De qué trata el curso?</h4>
<p>Gracias a las tecnologías web modernas y a su alto grado de adopción en plataformas como iOS y Android, es posible crear aplicaciones nativas haciendo uso de nuestros conocimientos en desarrollo web, sin necesidad de aprender los lenguajes de programación nativos de cada una de estas plataformas. En el curso veremos distintas tecnologías y frameworks que nos permitirán crear aplicaciones haciendo uso de HTML5, CSS3 y JavaScript.</p>
<h4>¿A quien va destinado?</h4>
<p>Este curso va destinado a todo aquel que tenga unos conocimientos mínimos en programación web y que conozca a nivel básico el lenguaje de programación JavaScript. La idea es reutilizar esos conocimientos para poder aplicarlos al desarrollo de aplicaciones móviles.</p>
<h4>¿Qué plataformas se verán en el curso?</h4>
<p>En el curso prestaremos especial atención a las plataformas <b>Android</b> e <b>iOS</b>, aunque las tecnologías utilizadas soportan otras plataformas como BlackBerry o Windows Phone.</p>
<h4>Contenidos del curso</h4>
<ul>
<li>TEMA 1 &#8211; Introducción a la programación móvil multiplataforma. Análisis del contexto actual en el mundo del desarrollo móvil y repaso de las mejoras aportadas por los estándares HTML5 y CSS3</li>
<li>TEMA 2 &#8211; Entorno de desarrollo para iPhone y Android. Primeros pasos. Preparación del entorno de desarrollo e instalación del software necesario.</li>
<li>TEMA 3 &#8211; Interfaces de usuario HTML y JavaScript. Análisis en profundidad del framework Sencha Touch 2. Veremos cómo podemos crear aplicaciones móviles destinadas a ser ejecutadas en un navegador móvil o encapsuladas en una aplicación nativa.</li>
<li>TEMA 4 &#8211; Acceso a funcionalidades nativas con PhoneGap. Explicación del funcionamiento de la librería PhoneGap, la cual nos permite encapsular nuestras aplicaciones web y así poder acceder a funcionalidades nativas del dispositivo que no están disponibles en los navegadores móviles.</li>
<li>TEMA 5 &#8211; Aplicaciones nativas con Appcelerator Titanium ( 1.00 ects). Explicación del funcionamiento del framework Appcelerator Titanium, mediante el cual podremos crear aplicaciones 100% nativas mediante el uso de JavaScript.</li>
<li>TEMA 6 &#8211; Actividad final con PhoneGap. Desarrollo de una aplicación móvil elegida por el alumno haciendo uso de Sencha Touch y PhoneGap. La aplicación se utilizará para evaluar la superación del curso por parte del alumno</li>
<li>TEMA 7 &#8211; Actividad final con Titanium. Desarrollo de una aplicación móvil elegida por el alumno haciendo uso de Appcelerator Titanium. La aplicación se utilizará para evaluar la superación del curso por parte del alumno</li>
</ul>
<h4>Metodología</h4>
<p>El curso se desarrollará de forma <b>ONLINE</b> donde se proporcionará todo el material didáctico necesario. Además, existirá una máquina virtual alojada en el servicio EVA con todo el software necesario lista para ser utilizada en el curso (solo disponible si cuentas con un correo @um.es).</p>
<h4>Percio</h4>
<p>&#8211;<strong> 100€</strong> (para UM y no UM).</p>
<h4>Fechas</h4>
<p>&#8211; Plazo de Matrícula: del <strong>1 de Septiembre</strong> al <strong>27 de Octubre</strong> de 2014<br />
&#8211; Plazo de solicitud de beca: del 1 de Septiembre al 27 de Octubre de 2014<br />
&#8211; Plazo de realización: del <strong>3 de Noviembre</strong> al <strong>22 de Diciembre</strong> de 2014</p>
<p>&nbsp;</p>
<p>La entrada <a rel="nofollow" href="http://alfonsomarin.com/v-curso-de-desarrollo-de-aplicaciones-moviles-multiplataforma-con-tecnologias-web-en-universidad-de-murcia/">V Curso de desarrollo de aplicaciones móviles multiplataforma con Tecnologías Web en Universidad de Murcia</a> se publicó primero en <a rel="nofollow" href="http://alfonsomarin.com">alfonsomarin</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>http://alfonsomarin.com/v-curso-de-desarrollo-de-aplicaciones-moviles-multiplataforma-con-tecnologias-web-en-universidad-de-murcia/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Uso de API HTML5 fileSystem para cachear datos en Cordova/Phonegap o Chrome</title>
		<link>http://alfonsomarin.com/uso-de-api-html5-filesystem-para-cachear-datos-en-cordovaphonegap-o-chrome/</link>
					<comments>http://alfonsomarin.com/uso-de-api-html5-filesystem-para-cachear-datos-en-cordovaphonegap-o-chrome/#comments</comments>
		
		<dc:creator><![CDATA[alfonso]]></dc:creator>
		<pubDate>Mon, 08 Sep 2014 08:06:27 +0000</pubDate>
				<category><![CDATA[Desarrollo Móvil]]></category>
		<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[cordova]]></category>
		<category><![CDATA[File API]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[phonegap]]></category>
		<guid isPermaLink="false">http://alfonsomarin.com/?p=1000</guid>

					<description><![CDATA[<p>Ahora mismo estoy desarrollando un proyecto con Apache Cordova donde debemos implementar un proceso de cacheo para poder mantener información de forma offline. En concreto se necesitan cachear cierta cantidad de ficheros en formato JSON,  así que mi primera aproximación fue pensar en localStorage. El problema es  que se desconoce el tamaño de estos ficheros [&#8230;]</p>
<p>La entrada <a rel="nofollow" href="http://alfonsomarin.com/uso-de-api-html5-filesystem-para-cachear-datos-en-cordovaphonegap-o-chrome/">Uso de API HTML5 fileSystem para cachear datos en Cordova/Phonegap o Chrome</a> se publicó primero en <a rel="nofollow" href="http://alfonsomarin.com">alfonsomarin</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Ahora mismo estoy desarrollando un proyecto con <a title="Apache Cordova" href="http://cordova.apache.org" target="_blank">Apache Cordova</a> donde debemos implementar un proceso de cacheo para poder mantener información de forma offline. En concreto se necesitan cachear cierta cantidad de ficheros en formato JSON,  así que mi primera aproximación fue pensar en <a title="localStorage y sessionStorage" href="http://www.w3schools.com/html/html5_webstorage.asp" target="_blank"><strong>localStorage</strong></a>. El problema es  que se desconoce el tamaño de estos ficheros y en ningún caso se nos garantiza de que todos nos puedan caber en menos de 5MB, que es el límite de este tipo de almacenamiento.</p>
<p>Ya que el proyecto va a estar encapsulado con Cordova, se me ocurrió que esos JSON podrían ir a disco y guardarlos en el sistema de ficheros nativo del dispositivo donde no encontraríamos limitaciones de espacio gracias a la APIs fileSystem de HTML5 implementada por el <a title="Cordova File Plugin" href="http://plugins.cordova.io/#/package/org.apache.cordova.file" target="_blank">plugin File de Cordova</a>. Aunque parece ser que las APIs de acceso a fileSystem <a href="http://lists.w3.org/Archives/Public/public-webapps/2014AprJun/0010.html">no van a seguir desarrollándose</a>, es previsible que Cordova mantenga su implementación debido al gran valor aportado como método estándar de acceso al sistema de ficheros nativo.</p>
<p>Se trataría pues de implementar una interfaz similiar a localStorage para gestionar valores de tipo <em>clave</em>: <em>valor</em>,  donde <em>valor</em> sería de tipo texto y lo almacenaríamos en un fichero haciendo uso de <em>clave</em> para nombrarlo. Sin embargo, no podrá ser 100% similar debido a que los procesos de gestión de ficheros son asíncronos, así que necesitaremos incluir funciones callback, una para cuando la operación se realice con éxito, y otra para ejecutar en caso de error.</p>
<p>Ya puestos, como el desarrollo lo suelo realizar bajo Chrome, se incluyen las operaciones necesarias para que funcione también en este navegador. La principal diferencia radica en que mientras el plugin de Cordova no imponen ninguna cuota, Chrome sí la tiene. En Chrome podremos ver qué ficheros se han creado anteponiendo <strong>filesystem://</strong> a la URL donde estemos ejecutando nuestra aplicación (ej: <strong>filesystem://http://localhost</strong>)</p>
<p>Aquí os dejo un guist con el cóidigo que he utilizado.</p>
<p>[gist id=»c3929e79dcf22bb41efa» file=»fileStorage.js»]</p>
<p>[gist id=»c3929e79dcf22bb41efa» file=»ejemplos_de_uso.js»]</p>
<p>La entrada <a rel="nofollow" href="http://alfonsomarin.com/uso-de-api-html5-filesystem-para-cachear-datos-en-cordovaphonegap-o-chrome/">Uso de API HTML5 fileSystem para cachear datos en Cordova/Phonegap o Chrome</a> se publicó primero en <a rel="nofollow" href="http://alfonsomarin.com">alfonsomarin</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>http://alfonsomarin.com/uso-de-api-html5-filesystem-para-cachear-datos-en-cordovaphonegap-o-chrome/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Estado del desarrollo móvil en 2014</title>
		<link>http://alfonsomarin.com/estado-del-desarrollo-movil-en-2014/</link>
					<comments>http://alfonsomarin.com/estado-del-desarrollo-movil-en-2014/#respond</comments>
		
		<dc:creator><![CDATA[alfonso]]></dc:creator>
		<pubDate>Fri, 05 Sep 2014 04:12:04 +0000</pubDate>
				<category><![CDATA[Desarrollo Móvil]]></category>
		<guid isPermaLink="false">http://alfonsomarin.com/?p=995</guid>

					<description><![CDATA[<p>Me he tropezado con un extenso informe que realizó Xataka Movil sobre el estado del desarrollo móvil comparando las principales plataformas que existen en la actualidad Este informe lo han desarrollado en dos artículos: Desarrollo de aplicaciones móviles (I): así está el mercado: destripan algunos informes sobre estadísticas en torno a las distintas plataformas móviles. [&#8230;]</p>
<p>La entrada <a rel="nofollow" href="http://alfonsomarin.com/estado-del-desarrollo-movil-en-2014/">Estado del desarrollo móvil en 2014</a> se publicó primero en <a rel="nofollow" href="http://alfonsomarin.com">alfonsomarin</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Me he tropezado con un extenso informe que realizó <a href="http://www.xatakamovil.com/">Xataka Movil</a> sobre el estado del desarrollo móvil comparando las principales plataformas que existen en la actualidad Este informe lo han desarrollado en dos artículos:</p>
<ul>
<li><a href="http://www.xatakamovil.com/mercado/desarrollo-de-aplicaciones-moviles-i-asi-esta-el-mercado">Desarrollo de aplicaciones móviles (I): así está el mercado</a>: destripan algunos informes sobre estadísticas en torno a las distintas plataformas móviles.</li>
<li><a href="http://www.xatakamovil.com/mercado/desarrollo-de-aplicaciones-moviles-ii-para-que-plataformas-moviles-desarrollar-y-para-cual-primero">Desarrollo de aplicaciones móviles (II): ¿Para qué plataformas móviles desarrollar y para cuál primero?</a>: Recolección de opiniones de varios expertos sobre el estado de cada plataforma y recomendaciones sobre desarrollo y monetización de aplicaciones.</li>
</ul>
<p>Me han parecido tremendamente interesantes y recomiendo su lectura, donde personalmente destaco los siguientes puntos:</p>
<p>Primera parte:</p>
<ul>
<li>La industria generó 68000 millones de dólares en 2013 y se estiman unos 146000 millones en 2016</li>
<li>Android e iOS se reparten el 94% de las ventas siendo claramente las dos principales plataformas, y se espera que sea así durante los próximos 3 años</li>
<li>Un 71% de desarrolladores móviles lo hacen para Android, y un 55% para iOS, con que parte de los desarrolladores lo hacen en ambas plataformas.</li>
<li>En sudamérica es donde más apuestan por el desarrollo HTML5, donde el 64% lo hace en esta plataforma.</li>
<li>La principal vía de monetización es el desarrollo por encargo, de donde provienen el 56% de los ingresos en el sector</li>
<li>La segunda vía de monteización sigue siendo la publicidad con un 26% provocado por plataformas en la que la demanda por compras directas es dévil, como Windows Phone o Android</li>
<li><strong>para la mayoría de desarrolladores la pregunta clave no es qué es cuál de las dos plataformas tener como prioritaria</strong></li>
<li>Windows Phone está cogiendo fuerza poco a poco, donde un 26% de desarrolladores tienen a esta plataforma como objetivo</li>
<li>El 72% de desarrolladores tiene a los smartphones como principal plataforma, y solo el 12% tiene como prioridad el desarrollo para tablet</li>
</ul>
<p>Segunda Parte:</p>
<p>Expertos consultados:</p>
<ul>
<li>Jose María Carceles:</li>
<li>Jorge del Casar: <a href="https://twitter.com/JorgeCasar">@JorgeCasar</a></li>
<li>Julio Rivas: <a href="https://twitter.com/juliorimo">@juliorimo</a></li>
<li>Marcos Trujillo: <a href="https://twitter.com/Aracem">@Aracem</a></li>
<li>Jorge Barroso: <a href="https://twitter.com/flipper83">@flipper83</a></li>
</ul>
<p><strong><a href="https://twitter.com/Aracem">@Aracem</a></strong>: Ahora mismo no compensa trabajar para otras plataformas que no sean éstas dos [iOS y Android] porque no hay mercado suficiente para rentar los desarrollos. Luego cada plataforma tiene sus ventajas e inconvenientes pero al final el esfuerzo es más o menos el mismo.</p>
<p><strong><a href="https://twitter.com/juliorimo">@juliorimo</a></strong>: En la parte de iOS consideramos que no merece la pena hacer proyectos nuevos para una versión de iOS inferior a la 7.0 ya que con esto alcanzamos más de un 80% del mercado. En el caso de las librerías publicitarias si es algo distinto ya abarcamos desde iOS 5.0 para tener casi el 100% del mercado soportado.</p>
<p><strong><a href="https://twitter.com/flipper83">@flipper83</a></strong>: si tu app es muy bonita, pero se rompe cada 2 por 3 o va lenta al final es también parte de la experiencia de usuario. Personalmente para mi todo es igual de importante, tanto que funcione perfectamente como que sea usable.</p>
<p><strong><a href="https://twitter.com/Aracem">@Aracem</a></strong>: La fase de diseño de la aplicación es una de las más importantes en el ciclo de vida del proyecto. En mi opinión entre el diseño de la aplicación y la suerte se llevan un 70% del porcenjate de éxito. El resto se reparten entre las funcionalidades de la aplicación y el marketing</p>
<p><strong><a href="https://twitter.com/JorgeCasar">@JorgeCasar</a></strong>: Creemos que son 2 valores muy importantes para el éxito de una app o juego. En nuestros juegos creamos niveles de aprendizaje para evitar grandes cantidades de texto y que la experiencia de usuario sea la mejor desde el segundo cero. Además pasamos por diversas auditorías para conseguir certificaciones de marcas importantes.</p>
<p><strong>Jose María Cárceles</strong>: Desarrollar apps para tablets android es difícil por la segmentación tan brutal que tiene en cuanto a diferentes dispositivos con diferentes tamaños de pantalla, ya que a veces no sabemos si un dispositivo es un teléfono, es un tablet, o es un híbrido entre ambos. En el caso de Apple, está muy claro, en el market sabes muy intuitivamente qué aplicaciones son para teléfono, y que aplicaciones son para tablets</p>
<p><strong> <a href="https://twitter.com/flipper83">@flipper83</a></strong>: es especialmente molesto no poder compartir código entre esas plataformas y terminas programando varias veces el core de tu aplicación</p>
<p><strong><a href="https://twitter.com/Aracem">@Aracem</a></strong>: Las aplicaciones hechas con HTML5 pueden ser el futuro aunque aún tiene sus peros. La ventaja de “desarrolla una vez y funciona en todos los sitios” es tremendamente atractiva aunque la tecnología, en mi opinión, aún no está lista</p>
<p><strong><a href="https://twitter.com/Aracem">@Aracem</a></strong>: La moda ahora son los pagos in-app. Aplicaciones gratuitas que se pueden mejorar o expandir mediante micropagos. Es un sistema que funciona muy bien puesto que es más fácil convencer a los usuarios para que paguen por algún contenido adicional cuando ya conocen tu app, la usan e incluso puede que la consideren imprescindible que simplemente viéndola en la tienda de aplicaciones. En ese momento es difícil convencer que esa app que tienen ahí les va a ser lo suficientemente útil como para pagar 1 euro.</p>
<p><strong><a href="https://twitter.com/flipper83">@flipper83</a></strong>: El modelo in-app purchase es un modelo de negocio válido, que en algún momento explotará pero no para desaparecer sino para coexistir con los ya existentes. Creo que el problema va a ser el coste por usuario, para que la gente entre en tu juego tienes que dejarte una pasta en publicidad que luego tienes que recuperar, cuanta mayor competencia exista, este coste por usuario crecerá y habrá un momento que sea insostenible para las medianas y pequeñas empresas de desarrollo.</p>
<p><strong>Jose María Cáceres</strong>: Creo que ahora mismo hay una gran componente de suerte, a la hora de tener éxito, ya que existen cientos de miles de aplicaciones, y probablemente exista algo similar a lo que tu estás haciendo. La clave es mejorar lo que ya hay, que aporte valor a los usuarios, que tenga un gran diseño, que permita crear comunidad, y que hagas un esfuerzo importante en la promoción y marketing.</p>
<p>La entrada <a rel="nofollow" href="http://alfonsomarin.com/estado-del-desarrollo-movil-en-2014/">Estado del desarrollo móvil en 2014</a> se publicó primero en <a rel="nofollow" href="http://alfonsomarin.com">alfonsomarin</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>http://alfonsomarin.com/estado-del-desarrollo-movil-en-2014/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
