phonegap new

Transcript

phonegap new
04/01/2016
CROSS PLATFORM APP
CON HTML, CSS E JS
Framework Cordova
1
Overview
1
04/01/2016
Che cos’è?
PhoneGap/Cordova è un framework che consente di
sviluppare delle applicazioni cross-platform, in grado di
girare su qualunque dispositivo mobile, utilizzando
HTML5, CSS3 e Javascript.
E’ una sorta di wrapper (contenitore) per applicazioni
Web. L’interfaccia grafica dell’app è costituita da una
Webview che occupa l’intero schermo del device,
all’interno della quale viene visualizzato l’HTML/CSS ed
eseguito il codice JavaScript.
Come funziona?
Cordova espone, tramite una libreria Js, una serie di
funzioni attraverso le quali è possibile accedere alle API
che interfacciano l’applicazione Web con le funzionalità
della piattaforma ospite (es. geolocalizzazione, sensori,..)
Cordova si occupa quindi di mappare queste funzioni
sulle chiamate native della piattaforma specifica. Ad
esempio, per mostrare un alert si usa la funzione Js
notification.alert, la quale verrà poi declinata da
Cordova per mostrare la MessageBox di Windows
Phone, di iOS o di Android.
2
04/01/2016
Come funziona?
Per questo motivo un progetto Cordova non è una generica
applicazione web, ma viene creato un progetto specifico per
ogni piattaforma a partire da una cartella comune che contiene
il codice html/js/css.
All’avvio di un’applicazione, l’homepage (file html) è caricata
all’interno della webview a cui, successivamente, sarà ceduto
il controllo. In questo modo l’utente può interagire con i
contenuti dell’app stessa.
Gli eventi generati dall’interazione saranno gestiti con codice
javascript (file js) che potrebbe, ad esempio,
visualizzare/nascondere contenuti, riprodurre file multimediali,
effettuare calcoli,..
Il look and feel dell'app è determinato dalle impostazioni
contenute nel file css
2
Configurazione dell’ambiente
3
04/01/2016
Cosa installare? Ambiente di sviluppo
Apache ant
http://mirror.nohup.it/apache//ant/binaries/apache-ant1.9.6-bin.zip
Impostare la variabile d’ambiente relativa ad ANT
Andare su Sistema->Impostazioni di Sistema
Avanzate->Avanzate->Variabili d’ambiente
Aggiungere la variabile ANT_HOME e impostare come
valore la directory di installazione di ANT
Aggiungere alla variabile PATH il valore
%ANT_HOME%\bin
Cosa installare? Ambiente di sviluppo
Node js
https://nodejs.org/en/download/
Client Git
http://git-scm.com/download/win
Durante il processo di installazione selezionare
l’opzione ‘use git from the windows command prompt’
Cordova
Aprire il prompt dei comandi come amministratore e
digitare:
npm install -g cordova
4
04/01/2016
Cosa installare? Libreria android
Android sdk
http://dl.google.com/android/installer_r24.4.1windows.exe
Attraverso lo strumento sdk manager appena installato
dobbiamo aggiungere le librerie android necessarie :
Tools->Android SDK Platform tools + Android SDK
Build tools
Android 6.0->Documentation + SDK Platform +
Source
Android 5.1.1->Documentation + SDK Platform +
Source
Extras-> Android Support Library + USB Driver +
Android Support Repository
Cosa installare? Libreria android
Impostare le variabili d’ambiente relative all’SDK
Andare su Sistema->Impostazioni di Sistema
Avanzate->Avanzate->Variabili d’ambiente
Aggiungere la variabile ANDROID_HOME e impostare
come valore la directory di installazione dell’SDK
Aggiungere alla variabile PATH i valori:
%ANDROID_HOME%\platform-tools
%ANDROID_HOME%\tools
Verificare di aver già installato la jdk e controllare la
presenza della relativa variabile d’ambiente JAVA_HOME
5
04/01/2016
Strumenti per coding e debbugging
Le applicazioni sono scritte in html/css/javascript
Coding:
Non è necessario quindi utilizzare uno specifico editor
o ide
Scegliete l’ambiente che già utilizzate per lo sviluppo
web (es. notepad/ brackets/ netBeans)
Debugging:
Utilizziamo un emulatore browser-based chiamato
Ripple, che ci permette di effettuare un test iniziale
dell’app senza doverla istallare su un dispositivo reale.
È un plugin eseguito in chrome, dove è possibile
utilizzare gli strumenti per gli sviluppatori di chrome
(tasto destro-> ispeziona elemento)
Strumenti per il debugging
Attraverso gli strumenti per sviluppatori è
possibile:
Modificare dom e css a runtime (attraverso la
scheda elements)
Debuggare javascript attraverso la scheda sources
attraverso l’uso di breakpoint
Utilizzare la scheda console in combinazione con
le istruzioni console.log()
6
04/01/2016
Framework grafici e architetturali
In combinazione con Cordova è possibile utilizzare
alcuni framework:
Per realizzare una migliore interfaccia grafica
Es. bootstrap
Jquery mobile
Per costruire l’app secondo l’architettura MVC
Angular js
Ionic
3
La prima app
7
04/01/2016
Creazione del progetto
Da linea di comando, con i privilegi di amministratore,
spostarsi nella cartella dove intendono creare i sorgenti e
digitare:
cordova create hello com.example.hello HelloWorld
Comando: create
Primo parametro: hello
Specifica il nome della directory in cui sarà
contenuto il progetto
Secondo argomento: it.example.hello
Specifica l’id dell’app nel formato paese.autore.app
Terzo argomento: HelloWord
Specifica il nome dell’app
Struttura del progetto creato
Il progetto creato possiede questa struttura:
La directory platforms contiene lo scheletro dei
progetti nativi per ciascuna piattaforma mobile
La directory plugins contiene gli eventuali plugin
utilizzati nella nostra applicazione.
8
04/01/2016
Struttura del progetto creato
Il file config.xml contiene le informazioni dell’app come
l’id, il nome definiti durante la creazione
La cartella www è la nostra directory di lavoro e
contiene inizialmente un file html, uno css e uno
javascript che costituiscono il progetto di default
Index.html -> è la pagina che viene caricata all’avvio
Index.css -> è il foglio di stile di default che viene
utilizzato
Index.js -> è il file che contiene tutti gli script che
realizzano la logica applicativa
Architettura single-page application
Un solo file html contiene il codice dell’intera app.
In alcuni dispositivi infatti il link tra una pagina ed
un’altra può causare problemi di memoria o soffrire di
un’interazione lenta
Una delle pratiche migliori è quindi quella di cercare di
mantenere quante più funzionalità possibili in un’unica
pagina e di usare le funzioni di javascript per caricare
dinamicamente le informazioni , aggiungere e
rimuovere viste (single-page architecture )
Si può usare la funzione document.getElementById()
di Javascript o la notazione $() di jQuery.
9
04/01/2016
Build dell’app
Una volta che l’applicazione è stata creata deve essere
incorporata in un applicazione nativa per poter essere
eseguita su un device. Per costruire l’app, il contenuto
web (HTML, CSS, JavaScript, ..) deve quindi essere
aggiunto ad un progetto specifico per le caratteristiche
della piattaforma di destinazione.
Ogni piattaforma (android, ios, ..) possiede strumenti
specifici da utilizzare per poter effettuare questa
operazione.
Il progetto Cordova ha messo ha disposizione un servizio
chiamato PhoneGap Build (basato su cloud) per
garantire l’accesso a tutti gli strumenti e le librerie
necessarie
Build per android
Posizionarsi con il prompt nella cartella del progetto e
digitare:
cordova platform add android
cordova build android
I seguenti comandi aggiungono una cartella android,
all’interno della cartella platform, che contiene il
progetto Android generato da quello di partenza in
contenuto nella cartella www.
10
04/01/2016
Icona app
Una volta che l’applicazione sarà installata sul
dispositivo, l’icona utilizzata è quella di default di Cordova
Per sostituirla scegliete una nuova icona di dim
1024x1024 px e attraverso il sito
www.makeappicon.com generate il set di icone per
android che andranno poi sostituite a quelle che si
trovano all’interno delle cartelle «Drawable» in
platforms\android\res
Splash screen
Uno splash screen è l'immagine che viene visualizzata
quando un'applicazione è in fase di caricamento.
Gli splash screen delle applicazioni mobile occupano
tutto lo schermo del dispositivo.
E’ possibile modificare lo plash screen di default
sostituendo le immagini che si trovano nelle cartelle
«Drawable» in platforms\android\res (mantenendo le
dimensioni)
11
04/01/2016
Emulazione dell’app con Ripple
Trasferire la directory dell’app su un server http (si può
utilizzare il server apache contenuto nell’installazione di
easyphp)
Aprire il file index.html (contenuto in www) con chrome
Cliccare sull’icona di Ripple ed attivarlo
Esecuzione dell’app su device
Collegare un dispositivo android al pc tramite cavo usb
Attivare la modalità debug usb sul dispositivo
Installare su pc i driver del dispositivo
Digitare sul prompt il comando
cordova run android –-device
Accettare la richiesta di autorizzazione che compare sul
telefono e attendere l’avvio dell’app
12
04/01/2016
Codice di default
L’app appena creata ed eseguita è quella di default ( un
po’ come l’hello world di c e java)
Per comprenderne il funzionamento specifico si
rimanda al codice commentato (struttura app)
Concettualmente si potranno distinguere alcune fasi
durante l’esecuzione di un’app:
Inizializzazione (initialize)
Preparazione (bind)
Disponibilità (deviceReady)
Avvio attività specifiche dell’app
Stati di un’applicazione
Fase
Descrizione
Inizializzazione
È la fase nel corso della quale vengono effettuate tutte
le operazioni preliminari come ad esempio
l’assegnamento di variabili globali. Nel nostro caso
l’unica attività che eseguiamo è l’invocazione della
fase successiva tramite il metodo bind().
Preparazione
In questa fase vengono effettuate le attività di
preparazione del funzionamento dell’applicazione
come ad esempio la definizione dei gestori di eventi.
Nel nostro esempio definiamo il gestore dell’evento
deviceready assegnandogli il metodo omonimo della
nostra app. L’evento deviceready è fondamentale nello
sviluppo di applicazioni Cordova: il verificarsi di questo
evento garantisce che il framework è stato
correttamente caricato e le API per interfacciarsi al
dispositivo sono pronte per essere utilizzate.
13
04/01/2016
Stati di un’applicazione
4
Fase
Descrizione
Disponibilità
Questa fase si verifica quando le API mobile sono
disponibili e pronte all’uso. Da qui in poi possiamo
avviare le attività specifiche della nostra app. Nel
codice d’esempio ci limitiamo a chiamare il
metodo receivedEvent () della nostra app.
Avvio
In questa fase l’applicazione interagisce con l’utente.
Nel nostro caso ci limitiamo a nascondere il
messaggio Connecting to Device e a rendere visibile il
messaggio Device is Ready.
Progettare un applicazione
14
04/01/2016
Applicazione torcia
Per creare una semplice applicazione, come la torcia, è
necessario tenere a mente tre diversi aspetti da
approfondire
1. Funzionalità del dispositivo ( con quali funzionalità
devo interfacciarmi? Sono supportate dalla piattaforma
target?)
2. Interazione con l’utente (quali eventi sarà
necessario gestire?)
3. Interfaccia grafica ( realizzazione mockup + scelta
eventuale framework)
Funzionalità
Per realizzare questa applicazione devo accedere alle
funzionalità del flash della fotocamera
Mi sposto con il prompt dei comandi nella directory
dell’app e digito
cordova plugin add https://github.com/TelerikVerified-Plugins/Flashlight
Posso ora utilizzare le seguenti istruzioni javascript per
accendere o spegnere la luce del flash:
window.plugins.flashlight.switchOn(onSuccess,
onError);
window.plugins.flashlight.switchOff(onSuccess,
onError);
15
04/01/2016
Gestione eventi
Per realizzare le funzionalità di questa applicazione sarà
necessario gestire 2 eventi:
DeviceReady:
come abbiamo visto nell’app di default, è obbligatorio
gestire quest’evento. Il codice che determina le
funzionalità specifiche dell’app può essere eseguito
solo dopo che quest’evento si è verificato
Click:
L’utente interagisce con questa applicazione
cliccando su un pulsante on/off. L’evento click deve
essere catturato e deve attivare o disattivare la luce
del flash
Interfaccia grafica
Mock-up
ON
OFF
Per la realizzazione di un mockup interattivo si può
utilizzare l’app POP presente sul playStore
Implementiamo poi l’interfaccia senza l’uso di
framework (v1) e successivamente vedremmo
come fare per integrare un framework come
bootstrap (v2)
16
04/01/2016
Index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="format-detection" content="telephone=no" />
<meta name="viewport" content="user-scalable=no, initialscale=1, maximum-scale=1, minimum-scale=1, width=devicewidth, height=device-height, target-densitydpi=devicedpi" />
<link rel="stylesheet" type="text/css"
href="css/index.css" />
<script type="text/javascript" src="cordova.js"></script>
<script type="text/javascript"
src="js/index.js"></script>
<title>Applicazione Torcia</title>
</head>
Index.html
<body>
<div class="header">
<h3>MyTorcia</h3>
</div>
<div class="content“>
<div id="torcia">
<button id="onOff" value="ON">ON</button>
</div>
<div id="log">
</div>
</div>
<div class="footer">
<p>L'applicazione permette di attivare/disattivare
</br> la luce del flash premendo il bottone</p>
</div>
</body>
</html>
17
04/01/2016
Index.js
document.addEventListener('deviceready', dispositivoPronto,
false);
function dispositivoPronto() {
addEventButton();
}
function addEventButton(){
document.getElementById("onOff").addEventListener("click",
onOff);
}
function onOff(){
var bottone=document.getElementById("onOff");
var log=document.getElementById("log");
log.style.visibility="visible";
if(bottone.value=="ON"){
bottone.setAttribute("value","OFF")
bottone.innerHTML="OFF";
log.innerHTML="torcia accesa";
Index.js
if(bottone.value=="ON"){
bottone.setAttribute("value","OFF")
bottone.innerHTML="OFF";
log.innerHTML="torcia accesa";
window.plugins.flashlight.switchOn();
}
else{
bottone.setAttribute("value","ON");
bottone.innerHTML="ON";
log.innerHTML="torcia spenta";
window.plugins.flashlight.switchOff();
}
}
18
04/01/2016
Index.css
body {
background-color: #b0c4de;
font-family: Arial, Helvetica, sans-serif;
width:100%;
height:100%;
min-height:100%; }
.header{
border-bottom:2px dotted #333;
text-align:center;
width:100%;
top:0; }
.content{
text-align: center;
width:100%;
padding:0;
margin-top:50px; }
Index.css
.footer{
border-top:2px dotted #333;
text-align:center;
width:100%;
position: absolute;
bottom: 0; }
#onOff{
width: 200px;
height: 200px; }
#log{
border:1px dotted #333;
width:80%;
margin: 50px auto;
padding: 10px;
visibility: hidden; }
19
04/01/2016
5
Gestione di eventi
Eventi
Un evento è un’azione che cordova può rilevare.
Nella programmazione web tradizionale ogni elemento di
una pagina può generare uno specifico evento che può
essere gestito con javascript (click su un bottone, un
immagine in caricamento, la selezione di un campo di
una form,..)
Tutti questi eventi sono disponibili anche nella
programmazione di app insieme ad altri che sono
specifici dell’ambiente mobile perché legati alle
funzionalità dei dispositivi
L’elenco di questi eventi si trova:
http://cordova.apache.org/docs/en/latest/cordova/event
s/events.html
20
04/01/2016
Esempio eventi di cordova
deviceready
si attiva quando la webwiew di Cordova è stata
completamente caricata
pause e resume
si attiva quando l’applicazione viene messa in
background/foreground
online/offline
si attiva quando l’applicazione è/non è connessa a
internet (necessità dell’api network-information)
batterystatus / batterycritical
si attiva quando lo stato della batteria cambia o
raggiunge la soglia critica (necessità dell’api batterystatus)
Rilevare e gestire un evento
Per rispondere ad un evento è necessario utilizzare un
event listener
La sintassi da utilizzare è
target.addEventListener(‘tipo’, codice, false);
target -> elemento dom a cui aggiungere il listener
tipo -> evento su cui mettersi in ascolto
codice -> funzione javascript da eseguire quando
l’evento si verifica
Ad esempio, per rilevare l’evento deviceready:
document.addEventListener(“deviceready”, onDeviceReady,
false);
function onDeviceReady() {
// azioni
}
21
04/01/2016
Rilevare e gestire un evento
Tutti gli altri event listener devono essere registrati dentro
alla funzione onDeviceReady(). Ad esempio:
Function onDeviceReady() {
// call the Cordova api
document.addEventListener(“pause”, onPause, false);
document.addEventListener(“resume”, onResume, false);
}
function onPause(){
}
function onResume(){
}
6
Plugin
22
04/01/2016
Plugin Api
Le API sono degli strumenti che permettono
all’applicazione di interfacciarsi con il dispositivo per
utilizzare una delle sue funzionalità native mediante
JavaScript, ignorando i dettagli implementativi di
ciascuna piattaforma mobile.
Un plugin Cordova è un componente software che
consente di mappare una funzione JavaScript ad una
funzionalità nativa.
Esso è costituito da un’unica interfaccia JavaScript e da
tante implementazioni dipendenti dalla specifica
piattaforma mobile.
Se vogliamo implementare una feature che utilizzi un api
dobbiamo prima istallare il relativo plugin e poi utilizzare
imetodi specifici forniti dal plugin stesso
Plugin Api
Per installare un plugin si usa il comando
cordova plugin add cordova-plugin-nomeplugin
Il parametro nomeplugin è specifico per ogni plugin (vedi
link)
Cordova fornisce una suite di JavaScript APIs che
comprendono ad es:
File
Accelerometer
Geolocation
Camera
Media
Notification
La lista completa si trova :
http://cordova.apache.org/docs/en/latest/cordova/plugi
ns/pluginapis.html
23
04/01/2016
Plugin di terze parti
Esistono un buon numero di plugin non ufficiali che
forniscono diverse funzionalità aggiuntive rispetto a
quelle offerte da cordova
Sono reperibili un po’ ovunque su internet ed in
particolare:
su gitHub (nei repositori dei vari sviluppatori)
https://github.com/
su http://plugins.telerik.com/cordova
Per installare un plugin non ufficiale si usa lo stesso
comando passando come argomento l’url del repository
in cui si trova il plugin:
cordova plugin add repository
7
Uso di bootstrap/jquery mobile
24
04/01/2016
Managing the Keyboard
Have you ever experienced an an app or web site on a mobile device where you have to enter numeric data, and the default
keyboard pops up. Before entering any text, you have you switch to the numeric input. Repeat that for 100 form inputs, and try to
tell me that you aren’t frustrated… Luckily, you can manage the keyboard in mobile HTML experiences very easily using HTML5
Form elements.
Default Keyboard: Supported Everywhere
1
<input style="width: 400px;" type="text" value="default" />
Numeric Keyboard: Supported on iOS, Android & BlackBerry (QNX)
1
<input style="width: 400px;" type="number" value="numeric" />
Numeric Keyboard: Supported on iOS
1
<input style="width: 400px;" type="text" pattern="[0-9]*" value="numeric" />
Phone Keyboard: Supported on iOS
1
<input style="width: 400px;" type="tel" value="telephone" />
URL Keyboard: Supported on iOS & BlackBerry (QNX)
1
<input style="width: 400px;" type="url" value="url" />
Email Keyboard: Supported on iOS & BlackBerry (QNX)
1
<input style="width: 400px;" type="email" value="email" />
25
04/01/2016
Disable User Selection
One way to easily determine that an application is really HTML is that everything on the UI is selectable and can be
copied/pasted – Every single piece of text, every image, every link, etc… Not only is this annoying in some scenarios (and
very useful in others), but there may be instances where you explicitly don’t want the user to be able to easily copy/paste
content. You can disable user selection by applying the following CSS styles. Note: This works on iOS, and partially works on BlackBerry/QNX for
the PlayBook. It did not work on Android in my testing.
1
2
3
4
5
6
<style>
*{
-webkit-touch-callout: none;
-webkit-user-select: none;
}
</style>
The -webkit-touch-callout css rule disables the callout, and the -webkit-user-select rule disables the ability to select content within an element. More
details on webkit css rules from the Mobile Safari CSS Reference. More detail about disabling copy/paste on iOS is available at StackOverflow.com.
Disable Zoom
If you want your content to feel like an app instead of a web page, then I strongly suggest that you disable gestures for pinch/zoom and panning for all use
cases where pinch/zoom is not required. The easiest way to do this is to set the viewport size to device-width and and disable user scaling through the
HTML metadata tag.
1
<meta name="viewport" content="width=device-width, user-scalable=no" />
You can read further detail on the viewport metadata tag from the Apple Safari HTML Reference, or the Mozilla reference.
26