Configurare un recinto virtuale (HTML)
[ Questo articolo è rivolto agli sviluppatori per Windows 8.x e Windows Phone 8.x che realizzano app di Windows Runtime. Gli sviluppatori che usano Windows 10 possono vedere Documentazione aggiornata ]
In questo argomento vengono illustrati i passaggi necessari per configurare un Geofence in un'app.
Roadmap: che relazione c'è tra questo argomento e gli altri? Vedi:
Introduzione
Per configurare un Geofence è necessario eseguire diversi passaggi. Oltre a definire l'area di interesse, è anche necessario accertarsi che siano disponibili le autorizzazioni appropriate per i dati sulla posizione. Infine, occorre configurare un gestore di eventi nel caso in cui l'utente cambi le autorizzazioni mentre l'app è in esecuzione.
Verificare che la posizione sia abilitata
Prima che l'app possa accedere alla posizione, Posizione deve essere abilitato nel dispositivo. Nell'app Impostazioni controlla che le seguenti impostazioni di privacy per la posizione siano attivate:
- Posizione del dispositivo è attivata (non applicabile in Windows 10 Mobile)
- L'impostazione dei servizi di posizione, Posizione, è attivata
- In Scegli le app che possono usare la tua posizione, la tua app è attivata
Abilitare la funzionalità Posizione
Fai doppio clic su package.appxmanifest in Esplora soluzioni e seleziona la scheda Funzionalità. Seleziona Posizione nell'elenco Funzionalità. Questo aggiunge la funzionalità di dispositivo Location
al file manifesto del pacchetto.
<Capabilities>
<!-- DeviceCapability elements must follow Capability elements (if present) -->
<DeviceCapability Name="location"/>
</Capabilities>
Verificare le autorizzazioni per i dati sulla posizione
In primo luogo, devi aggiungere codice all'app in fase di inizializzazione per ottenere i dati sulla posizione. In Windows, la prima volta che l'app usa l'API per ottenere i dati sulla posizione corrente, il sistema richiederà all'utente le autorizzazioni per il rilevamento della posizione. Se l'app non viene autorizzata dall'utente, dovrai informare l'utente. Tieni presente che è comunque possibile configurare un Geofence anche senza autorizzazioni sulla posizione, tuttavia in questo caso non è possibile ricevere notifiche a meno che le autorizzazioni non vengano abilitate.
function initialize() {
promise = geolocator.getGeopositionAsync();
promise.done(
function (pos) {
var coord = pos.coordinate;
},
function (err) {
// handle situations where location permissions are not granted to your app
}
);
}
Rimanere in attesa di modifiche alle autorizzazioni per i dati sulla posizione
Devi quindi accertarti che gli eventi di modifica delle autorizzazioni vengano registrati nel caso in cui l'utente decida di disabilitarle. Aggiungi innanzitutto i gestori di eventi al metodo di inizializzazione:
var accessInfo = null;
accessInfo = DeviceAccessInformation.createFromDeviceClass(Enumeration.DeviceClass.location);
accessInfo.addEventListener("accesschanged", onAccessChanged);
Provvedi quindi alla gestione delle modifiche alle autorizzazioni per informare l'utente del fatto che i recinti virtuali non funzioneranno se le autorizzazioni per i dati sulla posizione vengono disabilitate:
function onAccessChanged(args) {
var eventDescription = getTimeStampedMessage("Device Access Status");
var item = null;
if (DeviceAccessStatus.deniedByUser === args.status) {
eventDescription += " (DeniedByUser)";
WinJS.log && WinJS.log("Location has been disabled by the user. Enable access through the settings charm.", "sample", "status");
} else if (DeviceAccessStatus.deniedBySystem === args.status) {
eventDescription += " (DeniedBySystem)";
WinJS.log && WinJS.log("Location has been disabled by the system. The administrator of the device must enable location access through the location control panel.", "sample", "status");
} else if (DeviceAccessStatus.unspecified === args.status) {
eventDescription += " (Unspecified)";
WinJS.log && WinJS.log("Location has been disabled by unspecified source. The administrator of the device may need to enable location access through the location control panel, then enable access through the settings charm.", "sample", "status");
} else if (DeviceAccessStatus.allowed === args.status) {
eventDescription += " (Allowed)";
// clear status
WinJS.log && WinJS.log("", "sample", "status");
} else {
eventDescription += " (Unknown)";
WinJS.log && WinJS.log("Unknown device access information status", "sample", "status");
}
addEventDescription(eventDescription);
}
Nota Puoi determinare se l'utente ha disabilitato il rilevamento della posizione in Impostazioni controllando la proprietà LocationStatus. Se il valore è Disabled, il rilevamento della posizione è disabilitato.
Creare il recinto virtuale
A questo punto, è possibile definire e configurare un recinto virtuale. Ecco alcuni dei valori impostabili per un recinto virtuale:
- Un Id per identificarlo.
- L'area circolare di interesse, definita da Geoshape.
- MonitoredStates, indicante gli eventi dei recinti virtuali per cui ricevere notifiche, ovvero l'ingresso nell'area definita, l'uscita dall'area o la rimozione del recinto virtuale.
- Un flag SingleUse che rimuove il recinto virtuale dopo che sono stati soddisfatti tutti gli stati per cui viene monitorato il recinto virtuale.
- DwellTime, indicante per quanto tempo l'utente deve trovarsi all'interno o all'esterno dell'area definita prima che vengano generati gli eventi di ingresso/uscita.
- StartTime, indicante quando iniziare a monitorare il recinto virtuale.
- Valore di Duration per cui monitorare il recinto virtuale.
function generateGeofence() {
var geofence = null;
try {
var fenceKey = nameElement.value;
var position = {
latitude: decimalFormatter.parseDouble(latitude.value),
longitude: decimalFormatter.parseDouble(longitude.value),
altitude: 0
};
var radiusValue = decimalFormatter.parseDouble(radius.value);
// the geofence is a circular region
var geocircle = new Windows.Devices.Geolocation.Geocircle(position, radiusValue);
var singleUse = false;
if (geofenceSingleUse.checked) {
singleUse = true;
}
// want to listen for enter geofence, exit geofence and remove geofence events
var mask = 0;
mask = mask | Windows.Devices.Geolocation.Geofencing.MonitoredGeofenceStates.entered;
mask = mask | Windows.Devices.Geolocation.Geofencing.MonitoredGeofenceStates.exited;
mask = mask | Windows.Devices.Geolocation.Geofencing.MonitoredGeofenceStates.removed;
var dwellTimeSpan = new Number(parseTimeSpan(dwellTimeField, defaultDwellTimeSeconds));
var durationTimeSpan = null;
if (durationField.value.length) {
durationTimeSpan = new Number(parseTimeSpan(durationField, 0));
} else {
durationTimeSpan = new Number(0); // duration needs to be set since start time is set below
}
var startDateTime = null;
if (startTimeField.value.length) {
startDateTime = new Date(startTimeField.value);
} else {
startDateTime = new Date(); // if you don't set start time in JavaScript the start time defaults to 1/1/1601
}
geofence = new Windows.Devices.Geolocation.Geofencing.Geofence(fenceKey, geocircle, mask, singleUse, dwellTimeSpan, startDateTime, durationTimeSpan);
} catch (ex) {
WinJS.log && WinJS.log(ex.toString(), "sample", "error");
}
return geofence;
}
Argomenti correlati
Roadmap
Progettazione dell'esperienza utente per le app
Attività
Gestire le notifiche dei recinti virtuali in primo piano
Rilevare eventi di recinti virtuali in background
Gestire le notifiche dei recinti virtuali mediante un'attività in background
Riferimenti
Altre risorse
Esempio di georilevazione per Windows 10