SlideShare una empresa de Scribd logo
1 de 60
Desarrollo de apps móviles multiplataforma
José Manuel Ortega Candel
Desarrollo de apps móviles multiplataforma
Native VS Hybrid
vs
Web-app Hibrída Nativa
Se ejecuta en
navegador.
HTML,CSS,Javascript
Se ejecuta en el componente
webview de cada plataforma
HTML,CSS,Javascript
ObjetiveC for IOS
Java for Android
Acceso por url Se distribuyen en el market
como apps nativas
Se distribuyen en el
market como apps nativas
Limitado acceso a
HW
Acceso completo a HW y
API nativa mediante
javascript
Acceso completo a HW y
API nativa
Jquery Mobile  PhoneGap+JavaScript
framework
 Titanium
iOS SDK
Android SDK
Rápido Rapidez depende del
framework
Muy Rápido
Introducción
PhoneGap
• Phonegap es un wrapper alrededor del navegador del dispositivo que permite
acceder a los recursos del mismo
• Pertenece a Adobe
• Liberado como projecto open source por la fundación apache bajo el nombre de
cordova
• Acualmente van por la versión 3.0
• Hay 2 formas para crear el fichero binario de la app
 Entornos desarrollo para cada plataforma
 PhoneGap Build
• No tiene UI. Será necesario emplear alguno de los frameworks javacript
(jQuery Mobile, Sencha, Backbone)
http://phonegap.com/
http://www.phonegapspain.com/
Arquitectura
Javascript API Reference
http://docs.phonegap.com/
Eclipse Plugin-Instalación
http://svn.codespot.com/a/eclipselabs.org/mobile-web-development-with-
phonegap/tags/r1.2/download
Eclipse Plugin- Projecto +Librerías
Proyecto Android
Configuración Android
package com.phonegap.exampleapp;
import android.os.Bundle;
import com.phonegap.*;
public class exampleapp extends DroidGap {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setIntegerProperty("splashscreen", R.drawable.splash);
super.loadUrl(file:///android_asset/www/index.html,4000);}}
Permisos AndroidManifest.xml
<<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permissionandroid:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Javascript
Inicializar-Capturar el evento deviceready
Búsqueda de contactos
Geolocalización (HTML5 || Cordova Native Geolocation)
https://github.com/apache/cordova-plugin-geolocation
<script type="text/javascript" charset="utf-8" src="cordova.js"></script>
<script type="text/javascript" charset="utf-8">
// Espera a cargar las librerías del API
document.addEventListener("deviceready", onDeviceReady, false);
</script>
function onDeviceReady(){
var options = new ContactFindOptions();
options.filter = «filter»;
options.multiple = true;
navigator.contacts.find(["displayName","emails"], foundContacts, errorContacts, options);
});
function onDeviceReady() {
navigator.geolocation.getCurrentPosition(onSuccess, onError);
}
var geoLocation = cordova.require('cordova/plugin/geolocation');
geoLocation.getCurrentPosition(onSuccess, onError);
Acceso a la cámara y galería de imágenes
function takeNewImage() {
navigator.camera.getPicture(onSuccess, onFail,{
quality: 100,
targetWidth: 250,
targetHeight: 250
});}
function selectImageFromLibrary () {
navigator.camera.getPicture(onSuccess, onFail,{
quality: 100,
destinationType: Camera.DestinationType.FILE_URI,
sourceType: Camera.PictureSourceType.PHOTOLIBRARY,
targetWidth: 250,
targetHeight: 250
});}
function onSuccess(imageURI) {
$('#image').attr('src', imageURI);
}
Check connection / Eventos
function checkConnection() {
var networkState = navigator connection.type;
var states = {};
states[Connection.UNKNOWN] = 'Unknown connection';
states[Connection.ETHERNET] = 'Ethernet connection';
states[Connection.WIFI] = 'WiFi connection';
states[Connection.CELL_2G] = 'Cell 2G connection';
states[Connection.CELL_3G] = 'Cell 3G connection';
states[Connection.CELL_4G] = 'Cell 4G connection';
states[Connection.NONE] = 'No network connection';
return states[networkState];
}
function onDeviceReady() {
document.addEventListener("online", isOnline, false);
document.addEventListener("offline", isOffline, false);
}
PhoneGap Build
http://build.phonegap.com/
• Servicio en la nube que permite crear los ficheros binarios para cada plataforma
a partir de un proyecto que contenga las librerías de phonegap
• GitHub compatible
Arquitectura data-role
• data-role=”page”
• data-role=”header”
• data-role=”footer”
• data-role=”navbar”
• data-role=”button”
• data-role=”listview”
• data-role=”controlgroup”
• data-role=”fieldcontain”
<body>
<div data-role="page" id=“pag" data-add-back-btn=”true”>
<header data-role="header" data-position="fixed">
Pag. secundaria
</header>
<div data-role="content“>
Esto es la página secundaria
</div>
<footer data-role="footer" data-position="fixed">
Pie
</footer>
</div>
</body>
Librerías
<!– jQuery Mobile CSS -->
<link rel="stylesheet" href="http://code.jquery.com/mobile/1.3.2/jquery.mobile-
1.3.2.min.css" />
<!– jQuery -->
<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
<!– jQuery Mobile JavaScript -->
<script src="http://code.jquery.com/mobile/1.3.2/jquery.mobile-
1.3.2.min.js"></script>
Componentes
data-role="listview"
data-filter="true"
data-role=”list-divider”
class=”ui-li-count”
data-role="fieldcontain"
Componentes
data-role="collapsible-set"
data-filter-reveal="true"
data-role="panel"
data-filter-placeholder="Search"
Transiciones y diálogos
<a href="index.html" data-transition=“fade“></a>
<a href="index.html" data-rel=“dialog“ data-transition="pop"></a>
$.mobile.changePage("index.html", "fade");
$.mobile.pageLoading
$('.ui-loader h1').text(‘Loading');
Eventos
• pageinit
• pagebeforeshow
• pagebeforehide
• pageshow
• pagehide
//Se ejecuta una vez para el documento entero
$(document).ready(function() {
//personalizar el mensaje que sale cuando se esperan datos AJAX
$.mobile.loadingMessage = "Cargando datos"
//personalizar el texto del botón para ir a la página anterior
$.mobile.page.prototype.options.backBtnText = "Atrás"
})
//Se ejecuta una vez para cada página
$('#pagBusqueda').bind('pageinit', function() {
$('#botonBuscar').click(buscar)
})
// Se ejecuta antes de mostrar una página
$('#pagDetalles').bind('pagebeforeshow', function() {
...
})
Codiqa-Prototipado
Ventajas & Desventajas
Ventajas
• Desarrollo rápido de interfaces.
• Elementos de interfaz adaptado a móviles
• Sintaxis sencilla.
• Efectos prediseñados
• Manejo de eventos.
• Baja curva de aprendizaje.
• Personalización del estilo visual (temas)
Desventajas
• Agrega peso extra a la aplicación.
• Manejo complejo de CSS.
• Los efectos como transiciones no funcionan fluidamente en equipos de baja gama.
• Las aplicaciones más grandes pueden hacer lenta la carga por trabajar en un solo
archivo.
• Menos control general del código.
http://www.jqmgallery.com/
http://view.jquerymobile.com/1.3.2/dist/demos/examples/
Demos
Demo
Sencha Touch
• Sencha Touch es un framework para el desarrollo de aplicaciones móviles
centrado en WebKit
• Basado en EXTJS
• La apariencia es similar al de las aplicaciones nativas en Android, iOS y
BlackBerry
• Implementa el patrón de diseño MVC en el lado del cliente
• Permite leer datos directamente a través de AJAX, JSON o la capacidad local
storage de HTML5
Instalación
• Descargar el SDK desde su página web
• http://www.sencha.com/products/touch/download
Navegadores compatibles
• Basados en WebKit: Safari, Chrome, Opera,Epiphany
Librerías
index.html
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html" charset="utf-8">
<script src="lib/touch/sencha-touch-all.js" type="text/javascript" />
<link href="lib/touch/resources/css/sencha-touch.css" rel="stylesheet"
type="text/css" />
<script src="app.js" type="text/javascript" />
</head>
<body></body>
</html>
Arquitectura
Model: Los modelos representan objetos lógicos con lo que trabaja nuestra
aplicación, donde definiremos qué campos tiene y qué métodos actuarán sobre
ellos.
View: Permiten visualizar los datos en los componentes que ofrece la arquitectura.
Controller: Permite interactuar con las acciones del usuario.Responde a los eventos
que se producen en las vistas y manejan el traspaso de datos entre Model y Store.
Store: Son colecciones de modelos, y serán utilizados por varios componentes.
Profile: Permite customizar los elementos UI.
MVC
var App=new Ext.Application({
name: ‘MyApp‘ //variable global
});
Modelo
Ext.regModel(‘MyApp.models.MyModel', { fields:
[ ] });
Vista
MyApp.views.viewport = new Ext.Panel( {
layout:’fit’ //disposición elementos
});
Store
MyApp.stores.MyStore= new Ext.data.Store({
model: ‘myModel',
proxy: {} });
MyApp.views.*
MyApp.controllers.*
MyApp.models.*
MyApp.stores.*
Controlador
Ext.define('MyApp.controllers.MyContoller',
{
extend: 'Ext.app.Controller',
config: {
models: [‘ MyApp.models.MyModel '],
stores: [' MyApp.stores.MyStore '],
views: [ ‘MyApp.views.viewport ’],
}
Proyecto –Look && Feel
<!--The default Sencha Touch style-->
<link rel="stylesheet" href="resources/css/sencha-touch.css" />
<!--The default iOS style-->
<link rel="stylesheet" href="resources/css/apple.css" />
<!--The default Android style-->
<link rel="stylesheet" href="resources/css/android.css" />
<!--The default BlackBerry 6 style-->
<link rel="stylesheet" href="resources/css/bb6.css" />
 sencha-touch.js
 sencha-touch.css
Componentes
Ext.dataview.Model / Ext.data.Store
Ext.application({ launch: function(){
Ext.define('Programming',{
extend:'Ext.data.Model',
config:{
fields:['lenguaje', 'descripcion'] } });
var datos = {
dataProgramming:[
{lenguaje: 'Java', descripcion:
'Creado por Sun
Microsystems'},{lenguaje:
'JavaScript', descripcion: 'Creado
por Netscape '},{lenguaje: 'C++',
descripcion: 'Creado por Bjarne
Stroustrup'},{lenguaje: 'PHP',
descripcion: 'Creado por Rasmus
Lerdorf'}, ] };
var store = Ext.create('Ext.data.Store',{
model: 'Programming',
autoLoad: true,
getGroupString : function(record) {
return record.get('lenguaje')[0];
},
sorters: ['lenguaje', 'descripcion'],
data: datos,
proxy:{
type: 'memory',
reader:{
type: 'json',
rootProperty: ‘dataProgramming'
}
}
}
);
Ext.dataview.List
Ext.Viewport.add(Ext.create('Ext.Panel',
{
layout:'fit',
items:[{
xtype:'toolbar',
docked: 'top',
title: 'Lenguajes de programación’},
{
xtype: 'list',
grouped : true,
onItemDisclosure: true,
onItemTap: true,
store: store,
itemTpl: '<strong>{lenguaje}
<br/>{descripcion}</strong>'
}]
}));
Listeners
listeners:{
itemtap: function(record,index){
//index es el índice de la fila seleccionada
//record representa el objeto
//carga el registro en un formulario
MyApp.views.myForm.load(record);
}
itemdoubletap: function(record,index){
}
discloure: function(index,record){
}
}
Ext.Map
var mapdemo = Ext.create('Ext.Map', {
mapOptions : {
center : new google.maps.LatLng(40.3908, -3.6300),
zoom : 16,
mapTypeId : google.maps.MapTypeId.ROADMAP,
navigationControl: true,
navigationControlOptions: {
style: google.maps.NavigationControlStyle.DEFAULT
}},
listeners: {
maprender: function(comp, map) {
var marker = new google.maps.Marker({
position: new google.maps.LatLng(40.3908, -3.6300),
title : 'Campus UPM',
map: map
});
google.maps.event.addListener(marker, 'click', function()
{
new google.maps.InfoWindow({
content: 'Campus UPM‘
}).open(map, marker);
});
setTimeout(function() {
map.panTo(position);
}, 500);}}});
Browser support / S.O/ Connection
<script type="text/javascript">
if (!Ext.browser.is.WebKit) {
alert("The current browser is
unsupported.nnSupported browsers:n" +
"Google Chromen" +
"Apple Safarin" +
"Mobile Safari (iOS)n" +
"Android Browsern" +
"BlackBerry Browser"
);
}
</script>
if (Ext.os.is.Android){
Ext.Msg.alert("INFO", "Android user");
}
else if (Ext.os.is.Blackberry){
Ext.Msg.alert("INFO", "Blackberry user");
}
else if (Ext.os.is.iPad){
Ext.Msg.alert("INFO", "iPad user");
}
else if (Ext.os.is.Windows) {
Ext.Msg.alert("INFO"," Win user ");
}
<script type="text/javascript">
Ext.device.Connection.isOnline();
Ext.device.Connection.getType();
</script>
Demos && API Docs
http://dev.sencha.com/deploy/touch/examples/production/index.html
http://docs-origin.sencha.com/touch/2.2.1/
http://docs.sencha.com/touch/2.2.1/#!/example/kitchen-sink
Sencha Touch vs Jquery Mobile
Sencha Touch:
• API más potente. Todo es personalizable.
• Mayor número de controles IU,transiciones y animaciones
• Rendimiento en iOS es superior con respecto al resto de librerías
• Patrón MVC
• Mayor potencia de configuración
• Mayor curva de aprendizaje. Más tiempo de desarrollo.
• Se necesitan unos conocimientos más avanzados de Javascript
• En iOS hay limitaciones como el acceso a la cámara y contactos
Jquery Mobile:
• Muy sencillo de aprender si ya se conoce jquery
• Compatible con mayor número de dispositivos
• No emplea ningún patrón. Es necesario utilizar otro framework como Backbone
• Rendimiento suele ser inferior
• No dispone de muchos controles para el diseño de la interfaz
Demo
• http://backbonejs.org/
• Permite implementar la lógica a nivel de navegación siguiendo un patrón
similar a MVC / MVVM. La vista actúa también de controlador.
• Perfecto para usarlo con Jquery Mobile
• Pesa muy poco(6 Kb la versión minimizada)
• Dependencias:Underscore.js && (Zepto.js || JQuery.js)
• Se integra con la mayoría de frameworks javascript para el manejo del DOM
• LinedkIn, Soundcloud, Basecamp, Codiqa
Backbone
Vista
HTML + CSS+ Template
Controlador
Backbone.View
Modelo
Backbone.Model
Manipulación
del DOM con
Jquery y
templates
DOM View Events
El modelo se
actualiza con la
interacción del
usuario
Model Events
Backbone
$(document).ready(function () {
app = new AppRouter();
Backbone.history.start();
});
var AppRouter = Backbone.Router.extend({
routes:{
"":"home“
},
home:function () {
this.changePage(new HomeView());
},
changePage:function (page) {
$(page.el).attr('data-role', 'page');
page.render();
$('body').append($(page.el));
$.mobile.changePage($(page.el),
{changeHash:false});
}
});
window.HomeView =
Backbone.View.extend({
template:_.template($('#home').html()),
render:function (eventName) {
$(this.el).html(this.template());
return this;
}});
<!-- The Template -->
<script type="text/template" id="home">
<div data-role="header"> </div>
<div data-role="content“> </div>
<div data-role=“header”> </div>
</script>
Backbone
• Deshabilitar navegación con Jquery Mobile
<script src="js/jqm-config.js"></script>
$(document).bind("mobileinit", function () {
$.mobile.ajaxEnabled = false;
$.mobile.linkBindingEnabled = false;
$.mobile.hashListeningEnabled = false;
$.mobile.pushStateEnabled = false;
// Elimina del DOM aquellos elementos que contengan
// data-role=page
$('div[data-role="page"]').live('pagehide', function (event, ui)
{
$(event.currentTarget).remove();
});
});
Appcelerator titanium
• FrameWork para crear aplicaciones nativas únicamente con JavaScript
• Soporta Android, iOS ,BlackBerry,Tizen
• Open source(Apache License 2.0).Soporte de pago
• http://appcelerator.com
• https://github.com/appcelerator
• http://www.appsdev-es.com/
• http://docs.appcelerator.com/titanium/3.0/
Características
• Interactuar con audio y video mediante streaming
• Interactuar con la cámara
• Geolocalización y mapas
• Interacción con Redes sociales
• Acceso al sistema de ficheros y base de datos
Arquitectura
La clave reside en la capa titanium bridge que será la encargada de traducir el
javascript en código nativo(Java para el caso de android y objetive-c para el caso de
iphone/ios).El resultado es una app completamente nativa.
UI API
Componentes de UI nativos Navbar,
Tabbar, Toolbar,Menus
Phone API
Componentes para las capacidades
nativas del teléfono geolocalización,
acelerómetro, mapas, sonido ,DB,
sistema de ficheros, red
Appcelerator Titanium Studio
Event-driven && component-oriented
Events
• click
• change
• focus
• blur
• touchstart
• …..
var button = Titanium.UI.createButton({
title: Title', top: 10, width: 100, height: 50 });
button.addEventListener('click',function(e) {
Titanium.API.info("You clicked the button");
});
Components
var picker = Ti.UI.createPicker({
type:Ti.UI.PICKER_TYPE_DATE,
minDate:new Date(2012,0,1),
maxDate:new Date(2013,11,31),
value:new Date(2012,3,12), top:50 });
picker.addEventListener('change',function(e){
Ti.API.info("User selected date: " + e.value.toLocaleString()); });
var tableData = [
{title: 'Alert'},
{title: Options Dialog'},
{title: Window Unfocused'}];
var table = Ti.UI.createTableView({ data: tableData });
Geolocalización
var mapa = Titanium.Map.createView({
mapType: Titanium.Map.STANDARD_TYPE,
animate: true,
regionFit: true,
userLocation: true
});
Titanium.Geolocation.getCurrentPosition
(function(event)
{
var longitud = event.coords.longitude;
var latitud = event.coords.latitude;
var altitud = event.coords.altitude;
mapa.region =
{latitude: latitud,longitude: longitud,
latitudeDelta:0.5,
longitudeDelta:0.5};});
Tabs
// create tab group
var tabGroup = Titanium.UI.createTabGroup();
// create base UI tab and root window
var win1 = Titanium.UI.createWindow({
title:'Tab 1',
backgroundColor:'#fff'
});
var tab1 = Titanium.UI.createTab({
icon:'KS_nav_views.png',
title:'Tab 1',
window:win1
});
// add tabs
tabGroup.addTab(tab1);
tabGroup.addTab(tab2);
// open tab group
tabGroup.open();
https://github.com/appcelerator/KitchenSink
Tianium vs PhoneGap
Titanium:
• Ejecuta la aplicación de forma nativa
• API más potente. Todo es personalizable.
• Mayor número de controles IU, transición y animaciones
• Patrón MVC mediante Alloy
• Native GUI.Look and Feel de forma nativa
• Mayor curva de aprendizaje
• Aplicaciones más pesadas(>=5MB)
• No soporta HTML5,CSS3,librerías Javascript.
• No acceso al DOM.
PhoneGap:
• Más fácil de aprender con conocimientos básicos de JavaScript
• Soporte HTML5,CSS3,librerías Javascript
• Debug es más sencillo al poder utilizar herramientas de desarrollo web
• Rendimiento suele ser inferior
• Ejecuta la aplicación dentro de componente WebView
Recomendaciones interfaz usuario
Responsive web design- CSS media queries
/* on mobile */
//para resoluciones menores o iguales a 480px de ancho
<link type="text/css" rel="stylesheet" media="only screen
and (max-device-width:480px)" href="mobile.css" />
/*on tablet */
//para resoluciones mayores a 480px de ancho
<link media="screen and (min-device-width: 481px)"
href=“tablet.css" type="text/css" rel="stylesheet" />
Viewport optimizado para móviles
<head>
<meta name="viewport" content="width=device-width; initial-scale=1.0;
maximum-scale=1.0; user-scalable=no;" />
</head>
Modernizr
Permite detectar la presencia de prácticamente cualquier funcionalidad de HTML5 y
CSS3 en nuestro navegador
Modernizr.load([ {
load: '//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.js',
complete: function () {
if ( !window.jQuery ) { //si jquery no se ha cargado correctamente
Modernizr.load('js/libs/jquery-1.7.1.min.js'); } } }, {
// This will wait for the fallback to load and execute if it needs to.
load: 'needs-jQuery.js' } ]);
http://modernizr.com/download/
Ripple Emulator (Chrome plugin)
Bibliografia
Appcelerator
Appcelerator Titanium Smartphone App
Development Cookbook.
Packt Publishing
Appcelerator Titanium: Up and Running.
O'Reilly Media
Bibliografia
Sencha touch
Sencha.Touch 2 Up
and Running
Oreilly 2013
Creating Mobile Apps with
Sencha Touch 2
Packt Publishing 2013
Sencha MVC
Architecture
Packt Publishing
2012
Sencha Touch
Mobile JavaScript
Framework
Packt Publishing
2012
Bibliografia
Phonegap
PhoneGap Beginner's
Guide
Packt Publishing 2011
Beginning PhoneGap
Wrox 2011
Beginning
PhoneGap, Mobile
Web Framework for
JavaScript and
HTML5
Apress 2012
PhoneGap Mobile
Application
Development
Cookbook
Packt Publishing
2012
Bibliografia
Jquery mobile
jQuery Mobile Up and
Running
Oreilly 2012
jQuery Mobile
O'Reilly 2011
jQuery Mobile First
Look
Packt 2011
Teach Yourself
jQuery Mobile In 24
Hours
SAMS
Bibliografia
Backbone http://addyosmani.github.io/backbone-fundamentals/
FREE
Info
https://play.google.com/store/apps/developer?id=Jos%C3%A9+Manuel+Ortega+Candel
https://github.com/jmortega/apps
https://www.linkedin.com/in/jmortega1
jmoc25@gmail.com
Google play
Google play

Más contenido relacionado

Destacado

Evaluacion primeras practicas
Evaluacion primeras practicas Evaluacion primeras practicas
Evaluacion primeras practicas Evelyn Gonzalez
 
George_Morris_Review_Open_Throttle_November-2009_MASTER
George_Morris_Review_Open_Throttle_November-2009_MASTERGeorge_Morris_Review_Open_Throttle_November-2009_MASTER
George_Morris_Review_Open_Throttle_November-2009_MASTERVictor Aideyan
 
El drac
El dracEl drac
El dracnfont
 
Algo de historia de la farmacia
Algo de historia de la farmaciaAlgo de historia de la farmacia
Algo de historia de la farmaciaJiimena Diiaz
 
151127 leveranciersbijeenkomst omgevingswet
151127  leveranciersbijeenkomst omgevingswet151127  leveranciersbijeenkomst omgevingswet
151127 leveranciersbijeenkomst omgevingswetKING
 
Energy Storage - 12: Gilles Rocchia, Socomec
Energy Storage - 12: Gilles Rocchia, SocomecEnergy Storage - 12: Gilles Rocchia, Socomec
Energy Storage - 12: Gilles Rocchia, SocomecBritish Embassy Paris
 
Máster Online en Seguridad Informática y Hacking Ético EC-Council. MSI
Máster Online en Seguridad Informática y Hacking Ético EC-Council. MSIMáster Online en Seguridad Informática y Hacking Ético EC-Council. MSI
Máster Online en Seguridad Informática y Hacking Ético EC-Council. MSICICE
 
Elevating Application Performance with the latest IBM COBOL offerings
Elevating Application Performance with the latest IBM COBOL offeringsElevating Application Performance with the latest IBM COBOL offerings
Elevating Application Performance with the latest IBM COBOL offeringsDevOps for Enterprise Systems
 
Enfermedades de la tiroides
Enfermedades de la tiroidesEnfermedades de la tiroides
Enfermedades de la tiroidesCESAR APARICIO
 
Planos preliminares puente balcones de chilina tramo 1 para pre-armado
Planos preliminares puente balcones de chilina tramo 1 para pre-armadoPlanos preliminares puente balcones de chilina tramo 1 para pre-armado
Planos preliminares puente balcones de chilina tramo 1 para pre-armado3L
 
En el asiento de atrás
En el asiento de atrásEn el asiento de atrás
En el asiento de atrásPaola Botti
 
Présentation NSim Contour à Geomatique 2009
Présentation NSim Contour à Geomatique 2009Présentation NSim Contour à Geomatique 2009
Présentation NSim Contour à Geomatique 2009NSim Technology
 
Modélisation de la perception dans un monde virtuel 3D
Modélisation de la perception dans un monde virtuel 3DModélisation de la perception dans un monde virtuel 3D
Modélisation de la perception dans un monde virtuel 3DNSim Technology
 

Destacado (18)

Evaluacion primeras practicas
Evaluacion primeras practicas Evaluacion primeras practicas
Evaluacion primeras practicas
 
George_Morris_Review_Open_Throttle_November-2009_MASTER
George_Morris_Review_Open_Throttle_November-2009_MASTERGeorge_Morris_Review_Open_Throttle_November-2009_MASTER
George_Morris_Review_Open_Throttle_November-2009_MASTER
 
Modul42
Modul42Modul42
Modul42
 
El drac
El dracEl drac
El drac
 
Modul21
Modul21Modul21
Modul21
 
Gestión Ambiental
Gestión AmbientalGestión Ambiental
Gestión Ambiental
 
70 .lic
70 .lic70 .lic
70 .lic
 
Algo de historia de la farmacia
Algo de historia de la farmaciaAlgo de historia de la farmacia
Algo de historia de la farmacia
 
151127 leveranciersbijeenkomst omgevingswet
151127  leveranciersbijeenkomst omgevingswet151127  leveranciersbijeenkomst omgevingswet
151127 leveranciersbijeenkomst omgevingswet
 
Modul41
Modul41Modul41
Modul41
 
Energy Storage - 12: Gilles Rocchia, Socomec
Energy Storage - 12: Gilles Rocchia, SocomecEnergy Storage - 12: Gilles Rocchia, Socomec
Energy Storage - 12: Gilles Rocchia, Socomec
 
Máster Online en Seguridad Informática y Hacking Ético EC-Council. MSI
Máster Online en Seguridad Informática y Hacking Ético EC-Council. MSIMáster Online en Seguridad Informática y Hacking Ético EC-Council. MSI
Máster Online en Seguridad Informática y Hacking Ético EC-Council. MSI
 
Elevating Application Performance with the latest IBM COBOL offerings
Elevating Application Performance with the latest IBM COBOL offeringsElevating Application Performance with the latest IBM COBOL offerings
Elevating Application Performance with the latest IBM COBOL offerings
 
Enfermedades de la tiroides
Enfermedades de la tiroidesEnfermedades de la tiroides
Enfermedades de la tiroides
 
Planos preliminares puente balcones de chilina tramo 1 para pre-armado
Planos preliminares puente balcones de chilina tramo 1 para pre-armadoPlanos preliminares puente balcones de chilina tramo 1 para pre-armado
Planos preliminares puente balcones de chilina tramo 1 para pre-armado
 
En el asiento de atrás
En el asiento de atrásEn el asiento de atrás
En el asiento de atrás
 
Présentation NSim Contour à Geomatique 2009
Présentation NSim Contour à Geomatique 2009Présentation NSim Contour à Geomatique 2009
Présentation NSim Contour à Geomatique 2009
 
Modélisation de la perception dans un monde virtuel 3D
Modélisation de la perception dans un monde virtuel 3DModélisation de la perception dans un monde virtuel 3D
Modélisation de la perception dans un monde virtuel 3D
 

Similar a Codemotion 2013 Desarrollo de apps móviles multiplataforma

Aplicaciones Web SPA con WebAPI y TypeScript
Aplicaciones Web SPA con WebAPI y TypeScriptAplicaciones Web SPA con WebAPI y TypeScript
Aplicaciones Web SPA con WebAPI y TypeScriptLuis Guerrero
 
Taller mobile by trustparency
Taller mobile by trustparencyTaller mobile by trustparency
Taller mobile by trustparencytrustparency
 
Aplicaciones Móviles Híbridas
Aplicaciones Móviles HíbridasAplicaciones Móviles Híbridas
Aplicaciones Móviles HíbridasScio Consulting
 
Code Blast 2012 - Fast Mobile Prototyping
Code Blast 2012 - Fast Mobile PrototypingCode Blast 2012 - Fast Mobile Prototyping
Code Blast 2012 - Fast Mobile PrototypingINSIGNIA4U
 
Aplicaciones web offline ITParral Prieto y Nassi
Aplicaciones web offline ITParral Prieto y NassiAplicaciones web offline ITParral Prieto y Nassi
Aplicaciones web offline ITParral Prieto y NassiGuillermo Nassi
 
Desarrollo de apps híbridas HTML5 con intel XDK
Desarrollo de apps híbridas HTML5 con intel XDKDesarrollo de apps híbridas HTML5 con intel XDK
Desarrollo de apps híbridas HTML5 con intel XDKSoftware Guru
 
Consideraciones al escoger apps híbridas vs nativas
Consideraciones al escoger apps híbridas vs nativasConsideraciones al escoger apps híbridas vs nativas
Consideraciones al escoger apps híbridas vs nativasSoftware Guru
 
Desarrollo de Apps con la herramienta Phonegap
Desarrollo de Apps con la herramienta PhonegapDesarrollo de Apps con la herramienta Phonegap
Desarrollo de Apps con la herramienta PhonegapCongresoWeb
 
Desarrollo móvil híbrido bien entendido
Desarrollo móvil híbrido bien entendidoDesarrollo móvil híbrido bien entendido
Desarrollo móvil híbrido bien entendidoJosé Manuel López
 
Presentacion De Uxity - 05/2009
Presentacion De Uxity - 05/2009Presentacion De Uxity - 05/2009
Presentacion De Uxity - 05/2009sleguiza
 
Software en la actualidad
Software en la actualidadSoftware en la actualidad
Software en la actualidadRaelyx Cordero
 
Tecnologías Web al servicio del desarrollo Móvil (WebSockets, WebRTC)
Tecnologías Web al servicio del desarrollo Móvil (WebSockets, WebRTC)Tecnologías Web al servicio del desarrollo Móvil (WebSockets, WebRTC)
Tecnologías Web al servicio del desarrollo Móvil (WebSockets, WebRTC)Jorge Rubiano
 
Presentación PhoneGap
Presentación PhoneGap Presentación PhoneGap
Presentación PhoneGap cccori
 

Similar a Codemotion 2013 Desarrollo de apps móviles multiplataforma (20)

Mini curse
Mini curseMini curse
Mini curse
 
Aplicaciones Web SPA con WebAPI y TypeScript
Aplicaciones Web SPA con WebAPI y TypeScriptAplicaciones Web SPA con WebAPI y TypeScript
Aplicaciones Web SPA con WebAPI y TypeScript
 
Taller mobile by trustparency
Taller mobile by trustparencyTaller mobile by trustparency
Taller mobile by trustparency
 
Aplicaciones Móviles Híbridas
Aplicaciones Móviles HíbridasAplicaciones Móviles Híbridas
Aplicaciones Móviles Híbridas
 
Code Blast 2012 - Fast Mobile Prototyping
Code Blast 2012 - Fast Mobile PrototypingCode Blast 2012 - Fast Mobile Prototyping
Code Blast 2012 - Fast Mobile Prototyping
 
Aplicaciones web offline ITParral Prieto y Nassi
Aplicaciones web offline ITParral Prieto y NassiAplicaciones web offline ITParral Prieto y Nassi
Aplicaciones web offline ITParral Prieto y Nassi
 
JqueryMobile
JqueryMobile JqueryMobile
JqueryMobile
 
Desarrollo de apps híbridas HTML5 con intel XDK
Desarrollo de apps híbridas HTML5 con intel XDKDesarrollo de apps híbridas HTML5 con intel XDK
Desarrollo de apps híbridas HTML5 con intel XDK
 
Html5
Html5Html5
Html5
 
Consideraciones al escoger apps híbridas vs nativas
Consideraciones al escoger apps híbridas vs nativasConsideraciones al escoger apps híbridas vs nativas
Consideraciones al escoger apps híbridas vs nativas
 
Desarrollo de Apps con la herramienta Phonegap
Desarrollo de Apps con la herramienta PhonegapDesarrollo de Apps con la herramienta Phonegap
Desarrollo de Apps con la herramienta Phonegap
 
Desarrollo móvil híbrido bien entendido
Desarrollo móvil híbrido bien entendidoDesarrollo móvil híbrido bien entendido
Desarrollo móvil híbrido bien entendido
 
Introduccion android
Introduccion androidIntroduccion android
Introduccion android
 
introducción a flutter
introducción a flutterintroducción a flutter
introducción a flutter
 
Presentacion De Uxity - 05/2009
Presentacion De Uxity - 05/2009Presentacion De Uxity - 05/2009
Presentacion De Uxity - 05/2009
 
Software en la actualidad
Software en la actualidadSoftware en la actualidad
Software en la actualidad
 
Tecnologías Web al servicio del desarrollo Móvil (WebSockets, WebRTC)
Tecnologías Web al servicio del desarrollo Móvil (WebSockets, WebRTC)Tecnologías Web al servicio del desarrollo Móvil (WebSockets, WebRTC)
Tecnologías Web al servicio del desarrollo Móvil (WebSockets, WebRTC)
 
Curso ajax
Curso ajaxCurso ajax
Curso ajax
 
Presentación PhoneGap
Presentación PhoneGap Presentación PhoneGap
Presentación PhoneGap
 
DotNetDom: El futuro de Xamarin
DotNetDom: El futuro de XamarinDotNetDom: El futuro de Xamarin
DotNetDom: El futuro de Xamarin
 

Más de Jose Manuel Ortega Candel

Asegurando tus APIs Explorando el OWASP Top 10 de Seguridad en APIs.pdf
Asegurando tus APIs Explorando el OWASP Top 10 de Seguridad en APIs.pdfAsegurando tus APIs Explorando el OWASP Top 10 de Seguridad en APIs.pdf
Asegurando tus APIs Explorando el OWASP Top 10 de Seguridad en APIs.pdfJose Manuel Ortega Candel
 
PyGoat Analizando la seguridad en aplicaciones Django.pdf
PyGoat Analizando la seguridad en aplicaciones Django.pdfPyGoat Analizando la seguridad en aplicaciones Django.pdf
PyGoat Analizando la seguridad en aplicaciones Django.pdfJose Manuel Ortega Candel
 
Ciberseguridad en Blockchain y Smart Contracts: Explorando los Desafíos y Sol...
Ciberseguridad en Blockchain y Smart Contracts: Explorando los Desafíos y Sol...Ciberseguridad en Blockchain y Smart Contracts: Explorando los Desafíos y Sol...
Ciberseguridad en Blockchain y Smart Contracts: Explorando los Desafíos y Sol...Jose Manuel Ortega Candel
 
Evolution of security strategies in K8s environments- All day devops
Evolution of security strategies in K8s environments- All day devops Evolution of security strategies in K8s environments- All day devops
Evolution of security strategies in K8s environments- All day devops Jose Manuel Ortega Candel
 
Evolution of security strategies in K8s environments.pdf
Evolution of security strategies in K8s environments.pdfEvolution of security strategies in K8s environments.pdf
Evolution of security strategies in K8s environments.pdfJose Manuel Ortega Candel
 
Implementing Observability for Kubernetes.pdf
Implementing Observability for Kubernetes.pdfImplementing Observability for Kubernetes.pdf
Implementing Observability for Kubernetes.pdfJose Manuel Ortega Candel
 
Seguridad en arquitecturas serverless y entornos cloud
Seguridad en arquitecturas serverless y entornos cloudSeguridad en arquitecturas serverless y entornos cloud
Seguridad en arquitecturas serverless y entornos cloudJose Manuel Ortega Candel
 
Construyendo arquitecturas zero trust sobre entornos cloud
Construyendo arquitecturas zero trust sobre entornos cloud Construyendo arquitecturas zero trust sobre entornos cloud
Construyendo arquitecturas zero trust sobre entornos cloud Jose Manuel Ortega Candel
 
Tips and tricks for data science projects with Python
Tips and tricks for data science projects with Python Tips and tricks for data science projects with Python
Tips and tricks for data science projects with Python Jose Manuel Ortega Candel
 
Sharing secret keys in Docker containers and K8s
Sharing secret keys in Docker containers and K8sSharing secret keys in Docker containers and K8s
Sharing secret keys in Docker containers and K8sJose Manuel Ortega Candel
 
Python para equipos de ciberseguridad(pycones)
Python para equipos de ciberseguridad(pycones)Python para equipos de ciberseguridad(pycones)
Python para equipos de ciberseguridad(pycones)Jose Manuel Ortega Candel
 
Shodan Tips and tricks. Automatiza y maximiza las búsquedas shodan
Shodan Tips and tricks. Automatiza y maximiza las búsquedas shodanShodan Tips and tricks. Automatiza y maximiza las búsquedas shodan
Shodan Tips and tricks. Automatiza y maximiza las búsquedas shodanJose Manuel Ortega Candel
 
ELK para analistas de seguridad y equipos Blue Team
ELK para analistas de seguridad y equipos Blue TeamELK para analistas de seguridad y equipos Blue Team
ELK para analistas de seguridad y equipos Blue TeamJose Manuel Ortega Candel
 
Monitoring and managing Containers using Open Source tools
Monitoring and managing Containers using Open Source toolsMonitoring and managing Containers using Open Source tools
Monitoring and managing Containers using Open Source toolsJose Manuel Ortega Candel
 
Python memory managment. Deeping in Garbage collector
Python memory managment. Deeping in Garbage collectorPython memory managment. Deeping in Garbage collector
Python memory managment. Deeping in Garbage collectorJose Manuel Ortega Candel
 

Más de Jose Manuel Ortega Candel (20)

Asegurando tus APIs Explorando el OWASP Top 10 de Seguridad en APIs.pdf
Asegurando tus APIs Explorando el OWASP Top 10 de Seguridad en APIs.pdfAsegurando tus APIs Explorando el OWASP Top 10 de Seguridad en APIs.pdf
Asegurando tus APIs Explorando el OWASP Top 10 de Seguridad en APIs.pdf
 
PyGoat Analizando la seguridad en aplicaciones Django.pdf
PyGoat Analizando la seguridad en aplicaciones Django.pdfPyGoat Analizando la seguridad en aplicaciones Django.pdf
PyGoat Analizando la seguridad en aplicaciones Django.pdf
 
Ciberseguridad en Blockchain y Smart Contracts: Explorando los Desafíos y Sol...
Ciberseguridad en Blockchain y Smart Contracts: Explorando los Desafíos y Sol...Ciberseguridad en Blockchain y Smart Contracts: Explorando los Desafíos y Sol...
Ciberseguridad en Blockchain y Smart Contracts: Explorando los Desafíos y Sol...
 
Evolution of security strategies in K8s environments- All day devops
Evolution of security strategies in K8s environments- All day devops Evolution of security strategies in K8s environments- All day devops
Evolution of security strategies in K8s environments- All day devops
 
Evolution of security strategies in K8s environments.pdf
Evolution of security strategies in K8s environments.pdfEvolution of security strategies in K8s environments.pdf
Evolution of security strategies in K8s environments.pdf
 
Implementing Observability for Kubernetes.pdf
Implementing Observability for Kubernetes.pdfImplementing Observability for Kubernetes.pdf
Implementing Observability for Kubernetes.pdf
 
Computación distribuida usando Python
Computación distribuida usando PythonComputación distribuida usando Python
Computación distribuida usando Python
 
Seguridad en arquitecturas serverless y entornos cloud
Seguridad en arquitecturas serverless y entornos cloudSeguridad en arquitecturas serverless y entornos cloud
Seguridad en arquitecturas serverless y entornos cloud
 
Construyendo arquitecturas zero trust sobre entornos cloud
Construyendo arquitecturas zero trust sobre entornos cloud Construyendo arquitecturas zero trust sobre entornos cloud
Construyendo arquitecturas zero trust sobre entornos cloud
 
Tips and tricks for data science projects with Python
Tips and tricks for data science projects with Python Tips and tricks for data science projects with Python
Tips and tricks for data science projects with Python
 
Sharing secret keys in Docker containers and K8s
Sharing secret keys in Docker containers and K8sSharing secret keys in Docker containers and K8s
Sharing secret keys in Docker containers and K8s
 
Implementing cert-manager in K8s
Implementing cert-manager in K8sImplementing cert-manager in K8s
Implementing cert-manager in K8s
 
Python para equipos de ciberseguridad(pycones)
Python para equipos de ciberseguridad(pycones)Python para equipos de ciberseguridad(pycones)
Python para equipos de ciberseguridad(pycones)
 
Python para equipos de ciberseguridad
Python para equipos de ciberseguridad Python para equipos de ciberseguridad
Python para equipos de ciberseguridad
 
Shodan Tips and tricks. Automatiza y maximiza las búsquedas shodan
Shodan Tips and tricks. Automatiza y maximiza las búsquedas shodanShodan Tips and tricks. Automatiza y maximiza las búsquedas shodan
Shodan Tips and tricks. Automatiza y maximiza las búsquedas shodan
 
ELK para analistas de seguridad y equipos Blue Team
ELK para analistas de seguridad y equipos Blue TeamELK para analistas de seguridad y equipos Blue Team
ELK para analistas de seguridad y equipos Blue Team
 
Monitoring and managing Containers using Open Source tools
Monitoring and managing Containers using Open Source toolsMonitoring and managing Containers using Open Source tools
Monitoring and managing Containers using Open Source tools
 
Python Memory Management 101(Europython)
Python Memory Management 101(Europython)Python Memory Management 101(Europython)
Python Memory Management 101(Europython)
 
SecDevOps containers
SecDevOps containersSecDevOps containers
SecDevOps containers
 
Python memory managment. Deeping in Garbage collector
Python memory managment. Deeping in Garbage collectorPython memory managment. Deeping in Garbage collector
Python memory managment. Deeping in Garbage collector
 

Último

Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx241521559
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfsoporteupcology
 
Instrumentación Hoy_ INTERPRETAR EL DIAGRAMA UNIFILAR GENERAL DE UNA PLANTA I...
Instrumentación Hoy_ INTERPRETAR EL DIAGRAMA UNIFILAR GENERAL DE UNA PLANTA I...Instrumentación Hoy_ INTERPRETAR EL DIAGRAMA UNIFILAR GENERAL DE UNA PLANTA I...
Instrumentación Hoy_ INTERPRETAR EL DIAGRAMA UNIFILAR GENERAL DE UNA PLANTA I...AlanCedillo9
 
Hernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptxHernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptxJOSEMANUELHERNANDEZH11
 
Plan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docxPlan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docxpabonheidy28
 
La era de la educación digital y sus desafios
La era de la educación digital y sus desafiosLa era de la educación digital y sus desafios
La era de la educación digital y sus desafiosFundación YOD YOD
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIAWilbisVega
 
trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdfIsabellaMontaomurill
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricKeyla Dolores Méndez
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveFagnerLisboa3
 
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...FacuMeza2
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíassuserf18419
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan JosephBRAYANJOSEPHPEREZGOM
 
SalmorejoTech 2024 - Spring Boot <3 Testcontainers
SalmorejoTech 2024 - Spring Boot <3 TestcontainersSalmorejoTech 2024 - Spring Boot <3 Testcontainers
SalmorejoTech 2024 - Spring Boot <3 TestcontainersIván López Martín
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...silviayucra2
 
Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024GiovanniJavierHidalg
 
KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesFundación YOD YOD
 
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfPARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfSergioMendoza354770
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)GDGSucre
 

Último (19)

Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdf
 
Instrumentación Hoy_ INTERPRETAR EL DIAGRAMA UNIFILAR GENERAL DE UNA PLANTA I...
Instrumentación Hoy_ INTERPRETAR EL DIAGRAMA UNIFILAR GENERAL DE UNA PLANTA I...Instrumentación Hoy_ INTERPRETAR EL DIAGRAMA UNIFILAR GENERAL DE UNA PLANTA I...
Instrumentación Hoy_ INTERPRETAR EL DIAGRAMA UNIFILAR GENERAL DE UNA PLANTA I...
 
Hernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptxHernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptx
 
Plan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docxPlan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docx
 
La era de la educación digital y sus desafios
La era de la educación digital y sus desafiosLa era de la educación digital y sus desafios
La era de la educación digital y sus desafios
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
 
trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdf
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnología
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Joseph
 
SalmorejoTech 2024 - Spring Boot <3 Testcontainers
SalmorejoTech 2024 - Spring Boot <3 TestcontainersSalmorejoTech 2024 - Spring Boot <3 Testcontainers
SalmorejoTech 2024 - Spring Boot <3 Testcontainers
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
 
Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024
 
KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento Protégeles
 
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfPARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)
 

Codemotion 2013 Desarrollo de apps móviles multiplataforma

  • 1. Desarrollo de apps móviles multiplataforma José Manuel Ortega Candel
  • 2. Desarrollo de apps móviles multiplataforma Native VS Hybrid vs
  • 3. Web-app Hibrída Nativa Se ejecuta en navegador. HTML,CSS,Javascript Se ejecuta en el componente webview de cada plataforma HTML,CSS,Javascript ObjetiveC for IOS Java for Android Acceso por url Se distribuyen en el market como apps nativas Se distribuyen en el market como apps nativas Limitado acceso a HW Acceso completo a HW y API nativa mediante javascript Acceso completo a HW y API nativa Jquery Mobile  PhoneGap+JavaScript framework  Titanium iOS SDK Android SDK Rápido Rapidez depende del framework Muy Rápido Introducción
  • 4. PhoneGap • Phonegap es un wrapper alrededor del navegador del dispositivo que permite acceder a los recursos del mismo • Pertenece a Adobe • Liberado como projecto open source por la fundación apache bajo el nombre de cordova • Acualmente van por la versión 3.0 • Hay 2 formas para crear el fichero binario de la app  Entornos desarrollo para cada plataforma  PhoneGap Build • No tiene UI. Será necesario emplear alguno de los frameworks javacript (jQuery Mobile, Sencha, Backbone) http://phonegap.com/ http://www.phonegapspain.com/
  • 10. Configuración Android package com.phonegap.exampleapp; import android.os.Bundle; import com.phonegap.*; public class exampleapp extends DroidGap { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setIntegerProperty("splashscreen", R.drawable.splash); super.loadUrl(file:///android_asset/www/index.html,4000);}} Permisos AndroidManifest.xml <<uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.WRITE_CONTACTS" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permissionandroid:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  • 11. Javascript Inicializar-Capturar el evento deviceready Búsqueda de contactos Geolocalización (HTML5 || Cordova Native Geolocation) https://github.com/apache/cordova-plugin-geolocation <script type="text/javascript" charset="utf-8" src="cordova.js"></script> <script type="text/javascript" charset="utf-8"> // Espera a cargar las librerías del API document.addEventListener("deviceready", onDeviceReady, false); </script> function onDeviceReady(){ var options = new ContactFindOptions(); options.filter = «filter»; options.multiple = true; navigator.contacts.find(["displayName","emails"], foundContacts, errorContacts, options); }); function onDeviceReady() { navigator.geolocation.getCurrentPosition(onSuccess, onError); } var geoLocation = cordova.require('cordova/plugin/geolocation'); geoLocation.getCurrentPosition(onSuccess, onError);
  • 12. Acceso a la cámara y galería de imágenes function takeNewImage() { navigator.camera.getPicture(onSuccess, onFail,{ quality: 100, targetWidth: 250, targetHeight: 250 });} function selectImageFromLibrary () { navigator.camera.getPicture(onSuccess, onFail,{ quality: 100, destinationType: Camera.DestinationType.FILE_URI, sourceType: Camera.PictureSourceType.PHOTOLIBRARY, targetWidth: 250, targetHeight: 250 });} function onSuccess(imageURI) { $('#image').attr('src', imageURI); }
  • 13. Check connection / Eventos function checkConnection() { var networkState = navigator connection.type; var states = {}; states[Connection.UNKNOWN] = 'Unknown connection'; states[Connection.ETHERNET] = 'Ethernet connection'; states[Connection.WIFI] = 'WiFi connection'; states[Connection.CELL_2G] = 'Cell 2G connection'; states[Connection.CELL_3G] = 'Cell 3G connection'; states[Connection.CELL_4G] = 'Cell 4G connection'; states[Connection.NONE] = 'No network connection'; return states[networkState]; } function onDeviceReady() { document.addEventListener("online", isOnline, false); document.addEventListener("offline", isOffline, false); }
  • 14. PhoneGap Build http://build.phonegap.com/ • Servicio en la nube que permite crear los ficheros binarios para cada plataforma a partir de un proyecto que contenga las librerías de phonegap • GitHub compatible
  • 15. Arquitectura data-role • data-role=”page” • data-role=”header” • data-role=”footer” • data-role=”navbar” • data-role=”button” • data-role=”listview” • data-role=”controlgroup” • data-role=”fieldcontain” <body> <div data-role="page" id=“pag" data-add-back-btn=”true”> <header data-role="header" data-position="fixed"> Pag. secundaria </header> <div data-role="content“> Esto es la página secundaria </div> <footer data-role="footer" data-position="fixed"> Pie </footer> </div> </body>
  • 16. Librerías <!– jQuery Mobile CSS --> <link rel="stylesheet" href="http://code.jquery.com/mobile/1.3.2/jquery.mobile- 1.3.2.min.css" /> <!– jQuery --> <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script> <!– jQuery Mobile JavaScript --> <script src="http://code.jquery.com/mobile/1.3.2/jquery.mobile- 1.3.2.min.js"></script>
  • 19. Transiciones y diálogos <a href="index.html" data-transition=“fade“></a> <a href="index.html" data-rel=“dialog“ data-transition="pop"></a> $.mobile.changePage("index.html", "fade"); $.mobile.pageLoading $('.ui-loader h1').text(‘Loading');
  • 20. Eventos • pageinit • pagebeforeshow • pagebeforehide • pageshow • pagehide //Se ejecuta una vez para el documento entero $(document).ready(function() { //personalizar el mensaje que sale cuando se esperan datos AJAX $.mobile.loadingMessage = "Cargando datos" //personalizar el texto del botón para ir a la página anterior $.mobile.page.prototype.options.backBtnText = "Atrás" }) //Se ejecuta una vez para cada página $('#pagBusqueda').bind('pageinit', function() { $('#botonBuscar').click(buscar) }) // Se ejecuta antes de mostrar una página $('#pagDetalles').bind('pagebeforeshow', function() { ... })
  • 22. Ventajas & Desventajas Ventajas • Desarrollo rápido de interfaces. • Elementos de interfaz adaptado a móviles • Sintaxis sencilla. • Efectos prediseñados • Manejo de eventos. • Baja curva de aprendizaje. • Personalización del estilo visual (temas) Desventajas • Agrega peso extra a la aplicación. • Manejo complejo de CSS. • Los efectos como transiciones no funcionan fluidamente en equipos de baja gama. • Las aplicaciones más grandes pueden hacer lenta la carga por trabajar en un solo archivo. • Menos control general del código.
  • 24. Demo
  • 25. Sencha Touch • Sencha Touch es un framework para el desarrollo de aplicaciones móviles centrado en WebKit • Basado en EXTJS • La apariencia es similar al de las aplicaciones nativas en Android, iOS y BlackBerry • Implementa el patrón de diseño MVC en el lado del cliente • Permite leer datos directamente a través de AJAX, JSON o la capacidad local storage de HTML5 Instalación • Descargar el SDK desde su página web • http://www.sencha.com/products/touch/download Navegadores compatibles • Basados en WebKit: Safari, Chrome, Opera,Epiphany
  • 26. Librerías index.html <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html" charset="utf-8"> <script src="lib/touch/sencha-touch-all.js" type="text/javascript" /> <link href="lib/touch/resources/css/sencha-touch.css" rel="stylesheet" type="text/css" /> <script src="app.js" type="text/javascript" /> </head> <body></body> </html>
  • 27. Arquitectura Model: Los modelos representan objetos lógicos con lo que trabaja nuestra aplicación, donde definiremos qué campos tiene y qué métodos actuarán sobre ellos. View: Permiten visualizar los datos en los componentes que ofrece la arquitectura. Controller: Permite interactuar con las acciones del usuario.Responde a los eventos que se producen en las vistas y manejan el traspaso de datos entre Model y Store. Store: Son colecciones de modelos, y serán utilizados por varios componentes. Profile: Permite customizar los elementos UI.
  • 28. MVC var App=new Ext.Application({ name: ‘MyApp‘ //variable global }); Modelo Ext.regModel(‘MyApp.models.MyModel', { fields: [ ] }); Vista MyApp.views.viewport = new Ext.Panel( { layout:’fit’ //disposición elementos }); Store MyApp.stores.MyStore= new Ext.data.Store({ model: ‘myModel', proxy: {} }); MyApp.views.* MyApp.controllers.* MyApp.models.* MyApp.stores.* Controlador Ext.define('MyApp.controllers.MyContoller', { extend: 'Ext.app.Controller', config: { models: [‘ MyApp.models.MyModel '], stores: [' MyApp.stores.MyStore '], views: [ ‘MyApp.views.viewport ’], }
  • 29. Proyecto –Look && Feel <!--The default Sencha Touch style--> <link rel="stylesheet" href="resources/css/sencha-touch.css" /> <!--The default iOS style--> <link rel="stylesheet" href="resources/css/apple.css" /> <!--The default Android style--> <link rel="stylesheet" href="resources/css/android.css" /> <!--The default BlackBerry 6 style--> <link rel="stylesheet" href="resources/css/bb6.css" />  sencha-touch.js  sencha-touch.css
  • 31. Ext.dataview.Model / Ext.data.Store Ext.application({ launch: function(){ Ext.define('Programming',{ extend:'Ext.data.Model', config:{ fields:['lenguaje', 'descripcion'] } }); var datos = { dataProgramming:[ {lenguaje: 'Java', descripcion: 'Creado por Sun Microsystems'},{lenguaje: 'JavaScript', descripcion: 'Creado por Netscape '},{lenguaje: 'C++', descripcion: 'Creado por Bjarne Stroustrup'},{lenguaje: 'PHP', descripcion: 'Creado por Rasmus Lerdorf'}, ] }; var store = Ext.create('Ext.data.Store',{ model: 'Programming', autoLoad: true, getGroupString : function(record) { return record.get('lenguaje')[0]; }, sorters: ['lenguaje', 'descripcion'], data: datos, proxy:{ type: 'memory', reader:{ type: 'json', rootProperty: ‘dataProgramming' } } } );
  • 32. Ext.dataview.List Ext.Viewport.add(Ext.create('Ext.Panel', { layout:'fit', items:[{ xtype:'toolbar', docked: 'top', title: 'Lenguajes de programación’}, { xtype: 'list', grouped : true, onItemDisclosure: true, onItemTap: true, store: store, itemTpl: '<strong>{lenguaje} <br/>{descripcion}</strong>' }] }));
  • 33. Listeners listeners:{ itemtap: function(record,index){ //index es el índice de la fila seleccionada //record representa el objeto //carga el registro en un formulario MyApp.views.myForm.load(record); } itemdoubletap: function(record,index){ } discloure: function(index,record){ } }
  • 34. Ext.Map var mapdemo = Ext.create('Ext.Map', { mapOptions : { center : new google.maps.LatLng(40.3908, -3.6300), zoom : 16, mapTypeId : google.maps.MapTypeId.ROADMAP, navigationControl: true, navigationControlOptions: { style: google.maps.NavigationControlStyle.DEFAULT }}, listeners: { maprender: function(comp, map) { var marker = new google.maps.Marker({ position: new google.maps.LatLng(40.3908, -3.6300), title : 'Campus UPM', map: map }); google.maps.event.addListener(marker, 'click', function() { new google.maps.InfoWindow({ content: 'Campus UPM‘ }).open(map, marker); }); setTimeout(function() { map.panTo(position); }, 500);}}});
  • 35. Browser support / S.O/ Connection <script type="text/javascript"> if (!Ext.browser.is.WebKit) { alert("The current browser is unsupported.nnSupported browsers:n" + "Google Chromen" + "Apple Safarin" + "Mobile Safari (iOS)n" + "Android Browsern" + "BlackBerry Browser" ); } </script> if (Ext.os.is.Android){ Ext.Msg.alert("INFO", "Android user"); } else if (Ext.os.is.Blackberry){ Ext.Msg.alert("INFO", "Blackberry user"); } else if (Ext.os.is.iPad){ Ext.Msg.alert("INFO", "iPad user"); } else if (Ext.os.is.Windows) { Ext.Msg.alert("INFO"," Win user "); } <script type="text/javascript"> Ext.device.Connection.isOnline(); Ext.device.Connection.getType(); </script>
  • 36. Demos && API Docs http://dev.sencha.com/deploy/touch/examples/production/index.html http://docs-origin.sencha.com/touch/2.2.1/ http://docs.sencha.com/touch/2.2.1/#!/example/kitchen-sink
  • 37. Sencha Touch vs Jquery Mobile Sencha Touch: • API más potente. Todo es personalizable. • Mayor número de controles IU,transiciones y animaciones • Rendimiento en iOS es superior con respecto al resto de librerías • Patrón MVC • Mayor potencia de configuración • Mayor curva de aprendizaje. Más tiempo de desarrollo. • Se necesitan unos conocimientos más avanzados de Javascript • En iOS hay limitaciones como el acceso a la cámara y contactos Jquery Mobile: • Muy sencillo de aprender si ya se conoce jquery • Compatible con mayor número de dispositivos • No emplea ningún patrón. Es necesario utilizar otro framework como Backbone • Rendimiento suele ser inferior • No dispone de muchos controles para el diseño de la interfaz
  • 38. Demo
  • 39. • http://backbonejs.org/ • Permite implementar la lógica a nivel de navegación siguiendo un patrón similar a MVC / MVVM. La vista actúa también de controlador. • Perfecto para usarlo con Jquery Mobile • Pesa muy poco(6 Kb la versión minimizada) • Dependencias:Underscore.js && (Zepto.js || JQuery.js) • Se integra con la mayoría de frameworks javascript para el manejo del DOM • LinedkIn, Soundcloud, Basecamp, Codiqa Backbone Vista HTML + CSS+ Template Controlador Backbone.View Modelo Backbone.Model Manipulación del DOM con Jquery y templates DOM View Events El modelo se actualiza con la interacción del usuario Model Events
  • 40. Backbone $(document).ready(function () { app = new AppRouter(); Backbone.history.start(); }); var AppRouter = Backbone.Router.extend({ routes:{ "":"home“ }, home:function () { this.changePage(new HomeView()); }, changePage:function (page) { $(page.el).attr('data-role', 'page'); page.render(); $('body').append($(page.el)); $.mobile.changePage($(page.el), {changeHash:false}); } }); window.HomeView = Backbone.View.extend({ template:_.template($('#home').html()), render:function (eventName) { $(this.el).html(this.template()); return this; }}); <!-- The Template --> <script type="text/template" id="home"> <div data-role="header"> </div> <div data-role="content“> </div> <div data-role=“header”> </div> </script>
  • 41. Backbone • Deshabilitar navegación con Jquery Mobile <script src="js/jqm-config.js"></script> $(document).bind("mobileinit", function () { $.mobile.ajaxEnabled = false; $.mobile.linkBindingEnabled = false; $.mobile.hashListeningEnabled = false; $.mobile.pushStateEnabled = false; // Elimina del DOM aquellos elementos que contengan // data-role=page $('div[data-role="page"]').live('pagehide', function (event, ui) { $(event.currentTarget).remove(); }); });
  • 42. Appcelerator titanium • FrameWork para crear aplicaciones nativas únicamente con JavaScript • Soporta Android, iOS ,BlackBerry,Tizen • Open source(Apache License 2.0).Soporte de pago • http://appcelerator.com • https://github.com/appcelerator • http://www.appsdev-es.com/ • http://docs.appcelerator.com/titanium/3.0/ Características • Interactuar con audio y video mediante streaming • Interactuar con la cámara • Geolocalización y mapas • Interacción con Redes sociales • Acceso al sistema de ficheros y base de datos
  • 43. Arquitectura La clave reside en la capa titanium bridge que será la encargada de traducir el javascript en código nativo(Java para el caso de android y objetive-c para el caso de iphone/ios).El resultado es una app completamente nativa. UI API Componentes de UI nativos Navbar, Tabbar, Toolbar,Menus Phone API Componentes para las capacidades nativas del teléfono geolocalización, acelerómetro, mapas, sonido ,DB, sistema de ficheros, red
  • 45. Event-driven && component-oriented Events • click • change • focus • blur • touchstart • ….. var button = Titanium.UI.createButton({ title: Title', top: 10, width: 100, height: 50 }); button.addEventListener('click',function(e) { Titanium.API.info("You clicked the button"); }); Components var picker = Ti.UI.createPicker({ type:Ti.UI.PICKER_TYPE_DATE, minDate:new Date(2012,0,1), maxDate:new Date(2013,11,31), value:new Date(2012,3,12), top:50 }); picker.addEventListener('change',function(e){ Ti.API.info("User selected date: " + e.value.toLocaleString()); }); var tableData = [ {title: 'Alert'}, {title: Options Dialog'}, {title: Window Unfocused'}]; var table = Ti.UI.createTableView({ data: tableData });
  • 46. Geolocalización var mapa = Titanium.Map.createView({ mapType: Titanium.Map.STANDARD_TYPE, animate: true, regionFit: true, userLocation: true }); Titanium.Geolocation.getCurrentPosition (function(event) { var longitud = event.coords.longitude; var latitud = event.coords.latitude; var altitud = event.coords.altitude; mapa.region = {latitude: latitud,longitude: longitud, latitudeDelta:0.5, longitudeDelta:0.5};});
  • 47. Tabs // create tab group var tabGroup = Titanium.UI.createTabGroup(); // create base UI tab and root window var win1 = Titanium.UI.createWindow({ title:'Tab 1', backgroundColor:'#fff' }); var tab1 = Titanium.UI.createTab({ icon:'KS_nav_views.png', title:'Tab 1', window:win1 }); // add tabs tabGroup.addTab(tab1); tabGroup.addTab(tab2); // open tab group tabGroup.open();
  • 49. Tianium vs PhoneGap Titanium: • Ejecuta la aplicación de forma nativa • API más potente. Todo es personalizable. • Mayor número de controles IU, transición y animaciones • Patrón MVC mediante Alloy • Native GUI.Look and Feel de forma nativa • Mayor curva de aprendizaje • Aplicaciones más pesadas(>=5MB) • No soporta HTML5,CSS3,librerías Javascript. • No acceso al DOM. PhoneGap: • Más fácil de aprender con conocimientos básicos de JavaScript • Soporte HTML5,CSS3,librerías Javascript • Debug es más sencillo al poder utilizar herramientas de desarrollo web • Rendimiento suele ser inferior • Ejecuta la aplicación dentro de componente WebView
  • 50. Recomendaciones interfaz usuario Responsive web design- CSS media queries /* on mobile */ //para resoluciones menores o iguales a 480px de ancho <link type="text/css" rel="stylesheet" media="only screen and (max-device-width:480px)" href="mobile.css" /> /*on tablet */ //para resoluciones mayores a 480px de ancho <link media="screen and (min-device-width: 481px)" href=“tablet.css" type="text/css" rel="stylesheet" /> Viewport optimizado para móviles <head> <meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=no;" /> </head>
  • 51. Modernizr Permite detectar la presencia de prácticamente cualquier funcionalidad de HTML5 y CSS3 en nuestro navegador Modernizr.load([ { load: '//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.js', complete: function () { if ( !window.jQuery ) { //si jquery no se ha cargado correctamente Modernizr.load('js/libs/jquery-1.7.1.min.js'); } } }, { // This will wait for the fallback to load and execute if it needs to. load: 'needs-jQuery.js' } ]); http://modernizr.com/download/
  • 53. Bibliografia Appcelerator Appcelerator Titanium Smartphone App Development Cookbook. Packt Publishing Appcelerator Titanium: Up and Running. O'Reilly Media
  • 54. Bibliografia Sencha touch Sencha.Touch 2 Up and Running Oreilly 2013 Creating Mobile Apps with Sencha Touch 2 Packt Publishing 2013 Sencha MVC Architecture Packt Publishing 2012 Sencha Touch Mobile JavaScript Framework Packt Publishing 2012
  • 55. Bibliografia Phonegap PhoneGap Beginner's Guide Packt Publishing 2011 Beginning PhoneGap Wrox 2011 Beginning PhoneGap, Mobile Web Framework for JavaScript and HTML5 Apress 2012 PhoneGap Mobile Application Development Cookbook Packt Publishing 2012
  • 56. Bibliografia Jquery mobile jQuery Mobile Up and Running Oreilly 2012 jQuery Mobile O'Reilly 2011 jQuery Mobile First Look Packt 2011 Teach Yourself jQuery Mobile In 24 Hours SAMS