Una delle funzioni più interessanti di un dispositivo mobile è la possibilità di rilevare la posizione corrente basandosi su una o più fonti di geolocalizzazione come il sistema GPS, i dati di rete WiFi o la cella telefonica.
Grazie a questa funzionalità possiamo conoscere dove si trova il dispositivo ed arricchire le app di funzionalità aggiuntive che sfruttano questa informazione. Ad esempio, per l'applicazione che stiamo sviluppando nel corso della guida possiamo aggiungere la posizione corrente tra le informazioni della scheda immobiliare da inviare al server. Questo consentirà ad esempio di posizionare su una mappa l'immobile per una eventuale pubblicazione Web delle schede.
Apache Cordova consente la geolocalizzazione tramite un'API basata sulle specifiche del W3C con un approccio abbastanza semplice da utilizzare. Mettiamole alla prova con l'implementazione nella nostra applicazione di quanto descritto prima.
Aggiungiamo pertanto alla proprietà data
dell'oggetto scheda
le informazioni sulla posizione corrente:
var scheda = {
data: {
nome: "",
indirizzo: "",
descrizione: "",
prezzo: "0,00",
coordinate: {}
},
// ...
}
Alla proprietà coordinate
verrà assegnato l'oggetto restituito dal framework in corrispondenza ad una esplicita richiesta di informazioni sulla posizione corrente in fase di salvataggio della scheda:
var scheda = {
// ...
save: function() {
if (scheda.data.nome != "") {
navigator.geolocation.getCurrentPosition(
scheda.onPositionSuccess,
scheda.onPositionError,
{maximumAge: 5000, timeout: 5000, enableHighAccuracy: true});
}
},
onPositionSuccess: function(position) {
scheda.data.coordinate = position.coords;
app.storage.setItem( scheda.data.nome, JSON.stringify(scheda.data));
},
onPositionError: function(error) {
var messaggio = "";
switch (error.code) {
case PositionError.PERMISSION_DENIED:
messaggio = "L'applicazione non è autorizzata all'acquisizione della posizione corrente";
break;
case PositionError.POSITION_UNAVAILABLE:
messaggio = "Non è disponibile la rilevazione della posizione corrente";
break;
case PositionError.TIMEOUT:
messaggio = "Non è stato possibile rilevare la posizione corrente";
break;
}
navigator.notification.alert(messaggio, function() {}, "Avviso");
}
// ...
}
Come possiamo vedere dal codice, abbiamo vincolato il salvataggio alla rilevazione della posizione corrente, effettuata tramite navigator.geolocation.getCurrentPosition(). Il metodo prevede due callback, la prima da chiamare in caso di successo e la seconda in presenza di errori, ed un oggetto con opzioni.
Le opzioni che è possibile specificare riguardano:
- la precisione della rilevazione (
enableHighAccuracy
), - il tempo massimo di attesa in millisecondi per ottenere le informazioni sulla posizione (
timeout
) - l'anzianità massima, sempre in millisecondi, di un valore della posizione presente in cache (
maximumAge
)
In caso di successo alla funzione di callback viene passato un oggetto Position con due proprietà:
Proprietà | Descrizione |
---|---|
coords |
un oggetto contenente le informazioni sulla posizione corrente, strutturate nelle seguenti proprietà:
|
timestamp |
un valore di tipo data che rappresenta il momento della rilevazione. Per i nostri scopi ci interessa acquisire soltanto le coordinate, che assegniamo all'omonima proprietà della scheda prima di effettuare il salvataggio |
Naturalmente non tutte queste informazioni saranno rilevanti per gli scopi della nostra applicazione, ma in altri contesti esse possono risultare davvero preziose.
Rilevamento continuo della posizione
L'approccio che abbiamo adottato per la rilevazione della posizione corrente è stato di richiederla al momento del salvataggio. In alcune applicazioni può essere necessario avere una rilevazione continua della posizione.
Quest'ultima ipotesi equivale in pratica a tracciare gli spostamenti del dispositivo e per farlo, l'invocazione esplicita di getCurrentPosition()
può risultare scomoda. Possiamo allora ricorrere al metodo watchPosition() che consente di rilevare automaticamente le variazioni di posizione.
Questo metodo accetta gli stessi parametri di getCurrentPosition()
. Quindi sarà semplice utilizzarlo:
var app = {
// ...
watchID: "",
deviceready: function() {
this.watchID = navigator.geolocation.watchPosition(
app.onPositionSuccess,
app.onPositionError,
{ maximumAge: 5000, timeout: 5000, enableHighAccuracy: true });
}
// ...
}
Ad ogni variazione di posizione viene generato un evento che invoca la relativa callback in base all'esito della rilevazione. L'invocazione del metodo restituisce un identificatore del watch
creato. Questo identificatore può essere utilizzato dal metodo clearWatch()
per interrompere la rilevazione continua della posizione.
Privacy
Una particolare attenzione deve essere posta agli aspetti relativi alla privacy nello sviluppo di applicazioni che fanno uso della geolocalizzazione. Le informazioni sulla posizione corrente, infatti, rientrano tra i dati sensibili che una corretta politica della riservatezza dovrebbe gestire opportunamente.
È prassi generale dichiarare anticipatamente che l'applicazione raccoglierà informazioni sulla posizione corrente e chiedere all'utente se accettare o meno l'utilizzo che di queste informazioni verrà fatto.