Alexander Salas Bastidas
Coder with good taste, workaholic and ubergeek 👨🏻💻
Preguntas vía twitter @ajsb85
aplicaciones ejemplo
Una aplicación híbrida es una aplicación móvil o de escritorio que se ejecuta dentro de un contenedor nativo y aprovecha el navegador web del contenedor o del dispositivo para mostrar localmente archivos de Hipertexto.
Las aplicaciones híbridas están compuestas principalmente de Tecnología Web como HTML, JavaScript y CSS.
Contiene funcionalidades específicas del dispositivo, como acceso a la cámara, geolocalización, y lecturas del acelerómetro, que están expuestas a través de una API en JavaScript.
Se dice de todo lo que es producto de elementos de distinta naturaleza.
Es un paquete de ejecución de Mozilla que puede ser usado para crear aplicaciones XUL+XPCOM tan valiosas como Firefox y Thunderbird. Ofrecerá mecanismos para instalar, actualizar y desinstalar esas aplicaciones. XULRunner ofrecerá también libxul, una solución que permite la integración de las tecnologías de Mozilla en otros proyectos y productos.
+ myapp/
|
+-+ chrome/
| |
| +-+ content/
| | |
| | +-- main.xul
| | |
| | +-- main.js
| |
| +-- chrome.manifest
|
+-+ defaults/
| |
| +-+ preferences/
| |
| +-- prefs.js
|
+-- application.ini
|
+-- chrome.manifest
<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<window
id="findfile-window"
title="Find Files"
orient="horizontal"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<!-- Otros elementos irán aquí -->
</window>
Un archivo XUL puede tener cualquier nombre, pero debería tener una extensión .xul. El archivo XUL más simple tiene la siguiente estructura:
La primera cliente de los cazafantasmas es Dana Barret (Sigourney Weaver), chelista que tiene una extraña visión en su apartamento y que se convierte en el interés amoroso de Peter. Tanto Dana como su vecino, Louis Tulley (Rick Moranis), son poseídos y convertidos en los avatares que darán entrada a una entidad destructora en nuestra realidad. Los cazafantasmas descubren que el edificio en el que residían, fue construido por un arquitecto que practicaba ocultismo y es una puerta dimensional que permitirá el paso -vía ritual de el Maestro de las llaves (Keymaster) (Tulley) y la Guardiana de la puerta (Gatekeeper) (Barret)- a Gozer el Gozeriano, un destructor interdimensional que amenaza con destruir Nueva York y a todo el mundo.
Una Aplicación Híbrida
Components.utils.import("resource://gre/modules/ctypes.jsm");
var lib = ctypes.open("C:\\WINDOWS\\system32\\user32.dll");
/* Declare the signature of the function we are going to call */
var msgBox = lib.declare("MessageBoxW",
ctypes.winapi_abi,
ctypes.int32_t,
ctypes.int32_t,
ctypes.jschar.ptr,
ctypes.jschar.ptr,
ctypes.int32_t);
var MB_OK = 0;
var ret = msgBox(0, "Hello world", "title", MB_OK);
lib.close();
/* build a Str255 ("Pascal style") string from the passed-in string */
function makeStr(str) {
return String.fromCharCode(str.length) + str;
}
Components.utils.import("resource://gre/modules/ctypes.jsm");
var carbon = ctypes.open("/System/Library/Frameworks/Carbon.framework/Carbon");
stdAlert = carbon.declare("StandardAlert", /* function name */
ctypes.default_abi, /* ABI type */
ctypes.int16_t, /* return type */
ctypes.int16_t, /* alert type */
ctypes.char.ptr, /* primary text */
ctypes.char.ptr, /* secondary text */
ctypes.uint32_t, /* alert param */
ctypes.int16_t); /* item hit */
var hit = 0;
var msgErr = makeStr("Carbon Says...");
var msgExp = makeStr("We just called the StandardAlert Carbon function from JavaScript!");
var err = stdAlert(1, msgErr, msgExp, 0, hit);
carbon.close();
/* import js-ctypes */
var {Cu} = require("chrome");
var {ctypes} = Cu.import("resource://gre/modules/ctypes.jsm", null);
/* Open the library */
try {
/* Linux */
var libc = ctypes.open("libc.so.6");
} catch (e) {
/* Most other Unixes */
libc = ctypes.open("libc.so");
}
/* Import a function */
var puts = libc.declare("puts", /* function name */
ctypes.default_abi, /* call ABI */
ctypes.int, /* return type */
ctypes.char.ptr); /* argument type */
var ret = puts("Hello World from js-ctypes!");
libc.close();
NW.js le permite llamar a todos los módulos Node.js directamente desde DOM y permite una nueva forma de escribir aplicaciones con todas las tecnologías Web.
Era conocido previamente como proyecto "node-webkit".
+ app.nw
|
+-- package.json
|
+-- index.html
|
+-- node_modules/
Node.js es un entorno de programación en la capa del servidor (pero no limitándose a ello) basado en el lenguaje de programación ECMAScript, asíncrono, con I/O de datos en una arquitectura orientada a eventos y basado en el motor V8 de Google.
WebKit es una plataforma para aplicaciones que funciona como base para el navegador web Safari, Google Chrome, Opera,2 Epiphany, Maxthon, Midori, QupZilla entre otros. Está basado originalmente en el motor de renderizado KHTML del navegador web del proyecto KDE, Konqueror.
<html>
<head>
<title>Hello World!</title>
</head>
<body>
<h1>Hello World!</h1>
<script>
// get the system platform using node.js
var os = require('os')
document.write('Our computer is: ', os.platform())
</script>
</body>
</html>
Un ejemplo sencillo usando Node.js
var gui = require('nw.gui');
// Create an empty menu
var menu = new gui.Menu();
// Add some items with label
menu.append(new gui.MenuItem({ label: 'Item A' }));
menu.append(new gui.MenuItem({ label: 'Item B' }));
menu.append(new gui.MenuItem({ type: 'separator' }));
menu.append(new gui.MenuItem({ label: 'Item C' }));
Hay APIs para los controles de interfaz de usuario nativos en nw.js. Usted puede utilizar éstos para el control de la ventana, menú, entre otros.
El framework Atom Shell le permite escribir aplicaciones de escritorio multiplataforma utilizando JavaScript, HTML y CSS. Se basa en io.js y Chromium y se utiliza en el editor Atom.
+ example.asar
|
+-- index.html
|
+-- main.js
|
+-- package.json
Este proyecto comenzó como una bifurcación de Node.js de Joyent ™.
Este proyecto tiene como objetivo continuar con el desarrollo de io.js en virtud de un "modelo de gobierno abierto", en contraposición con el liderazgo empresarial.
Chromium es un proyecto de navegador Web de código abierto, a partir del cual se basa el código fuente de Google Chrome.
var app = require('app'); // Module to control application life.
var BrowserWindow = require('browser-window'); // Module to create native browser window.
// Report crashes to our server.
require('crash-reporter').start();
// Keep a global reference of the window object, if you don't, the window will
// be closed automatically when the javascript object is GCed.
var mainWindow = null;
// Quit when all windows are closed.
app.on('window-all-closed', function() {
if (process.platform != 'darwin')
app.quit();
});
// This method will be called when atom-shell has done everything
// initialization and ready for creating browser windows.
app.on('ready', function() {
// Create the browser window.
mainWindow = new BrowserWindow({width: 800, height: 600});
// and load the index.html of the app.
mainWindow.loadUrl('file://' + __dirname + '/index.html');
// Emitted when the window is closed.
mainWindow.on('closed', function() {
// Dereference the window object, usually you would store windows
// in an array if your app supports multi windows, this is the time
// when you should delete the corresponding element.
mainWindow = null;
});
});
El archivo main.js debe crear ventanas y manejar los eventos del sistema
<!DOCTYPE html>
<html>
<head>
<title>Hello World!</title>
</head>
<body>
<h1>Hello World!</h1>
We are using node.js <script>document.write(process.version)</script>
and atom-shell <script>document.write(process.versions['atom-shell'])</script>.
</body>
</html>
Finalmente el index.html es la página Web que usted desea mostrar:
Permite a los programadores desarrollar aplicaciones para dispositivos móviles utilizando herramientas genéricas tales como JavaScript, HTML5 y CSS3. Tiene APIs que conectan al sistema operativo usando el código nativo del sistema huésped a través de una Interfaz de funciones foráneas en Javascript.
+ www/
|
+-- index.html
|
+-- js/
|
+-- img/
|
+-- css/
Las Aplicaciones en Cordova se implementan normalmente como WebView basada en el navegador de la plataforma móvil nativa.
<!DOCTYPE html>
<html>
<head>
<!--
Customize this policy to fit your own app's needs. For more guidance, see:
https://github.com/apache/cordova-plugin-whitelist/blob/master/README.md#content-security-policy
Some notes:
* gap: is required only on iOS (when using UIWebView) and is needed for JS->native communication
* https://ssl.gstatic.com is required only on Android and is needed for TalkBack to function properly
* Disables use of inline scripts in order to mitigate risk of XSS vulnerabilities. To change this:
* Enable inline JS: add 'unsafe-inline' to default-src
-->
<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *">
<meta name="format-detection" content="telephone=no">
<meta name="msapplication-tap-highlight" content="no">
<meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width">
<link rel="stylesheet" type="text/css" href="css/index.css">
<title>Hello World</title>
</head>
<body>
<div class="app">
<h1>Apache Cordova</h1>
<div id="deviceready" class="blink">
<p class="event listening">Connecting to Device</p>
<p class="event received">Device is Ready</p>
</div>
</div>
<script type="text/javascript" src="cordova.js"></script>
<script type="text/javascript" src="js/index.js"></script>
</body>
</html>
El archivo HTML debe incluir cordova.js o phonegap.js
var app = {
// Application Constructor
initialize: function() {
this.bindEvents();
},
// Bind Event Listeners
//
// Bind any events that are required on startup. Common events are:
// 'load', 'deviceready', 'offline', and 'online'.
bindEvents: function() {
document.addEventListener('deviceready', this.onDeviceReady, false);
},
// deviceready Event Handler
//
// The scope of 'this' is the event. In order to call the 'receivedEvent'
// function, we must explicitly call 'app.receivedEvent(...);'
onDeviceReady: function() {
app.receivedEvent('deviceready');
},
// Update DOM on a Received Event
receivedEvent: function(id) {
var parentElement = document.getElementById(id);
var listeningElement = parentElement.querySelector('.listening');
var receivedElement = parentElement.querySelector('.received');
listeningElement.setAttribute('style', 'display:none;');
receivedElement.setAttribute('style', 'display:block;');
console.log('Received Event: ' + id);
}
};
app.initialize();
El evento DeviceReady es fundamental para cualquier aplicación. Señala que las API del dispositivo de Cordova han cargado y están lista para acceder.
var fbLoginSuccess = function (userData) {
alert("UserInfo: " + JSON.stringify(userData));
}
facebookConnectPlugin.login(["public_profile"],
fbLoginSuccess,
function (error) { alert("" + error) }
);
Código ejemplo para iniciar sesión
Obtener la aplicación lista para el Store sin el dolor de cabeza de mantener el SDK nativo. PhoneGap hace el trabajo para usted en la nube y su aplicación siempre estará construida con el SDK más actualizado para la plataforma que esté requiriendo.
Framework completo HTML para construir iOS Apps.
Libre y abierto, Ionic ofrece una librería móvil optimizada para componentes HTML, CSS y JS, gestos, y herramientas de construcción de aplicaciones altamente interactivas. Construido con Sass y optimizado para AngularJS.
La librería de Windows para JavaScript.
By Alexander Salas Bastidas
Mi charla en el 5to aniversario del PNFI-UPTAG (Programa Nacional de Formación en Informática de la Universidad Politécnica Territorial de Falcón "ALONSO GAMERO") #uptag