Configurar una geovalla (HTML)
[ Este artículo está destinado a desarrolladores de Windows 8.x y Windows Phone 8.x que escriben aplicaciones de Windows en tiempo de ejecución. Si estás desarrollando para Windows 10, consulta la documentación más reciente
En este tema se describen los pasos para configurar Geofence en tu aplicación.
Guía básica: Relación de este tema con los demás. Consulta:
Introducción
Para configurar una Geofence hay que seguir varios pasos. Además de definir la región de interés, también debes asegurarte de que tienes los permisos de ubicación adecuados. Por último, necesitas configurar un controlador de eventos por si el usuario cambia estos permisos mientras la aplicación se está ejecutando.
Comprobar que la ubicación esté habilitada
Antes de que la aplicación pueda tener acceso a la ubicación, la Ubicación debe estar habilitada en el dispositivo. En la aplicación Configuración, comprueba que la siguiente configuración de privacidad de ubicación esté activada:
- La ubicación de este dispositivo... está activada (no es aplicable para Windows 10 Mobile)
- La configuración de servicios de ubicación, "Ubicación", está activada
- En Elegir las aplicaciones que pueden usar tu ubicación, la aplicación está establecida en activada
Habilitar la capacidad de ubicación
Haz doble clic en package.appxmanifest en el Explorador de soluciones y selecciona la pestaña Funcionalidades. A continuación, activa Ubicación en la lista Funcionalidades. De esta forma, se agrega la funcionalidad Location
del dispositivo en el archivo de manifiesto del paquete.
<Capabilities>
<!-- DeviceCapability elements must follow Capability elements (if present) -->
<DeviceCapability Name="location"/>
</Capabilities>
Comprobar los permisos de ubicación
En primer lugar, es posible que quieras agregar código a tu aplicación durante la inicialización para obtener la ubicación. En Windows, la primera vez que tu aplicación use la API para obtener la ubicación actual, el sistema solicitará al usuario el permiso de ubicación. Si tu aplicación no tiene el permiso del usuario, le enviará una alerta. Ten en cuenta que puedes configurar una Geofence sin permisos de ubicación, pero no recibirás notificaciones hasta que los permisos estén habilitados.
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
}
);
}
Escuchar cambios en los permisos de ubicación
A continuación, asegúrate de registrarte en eventos de cambio de permisos por si el usuario decide desactivar los permisos por algún motivo. Primero, agrega los controladores de eventos al método de inicialización:
var accessInfo = null;
accessInfo = DeviceAccessInformation.createFromDeviceClass(Enumeration.DeviceClass.location);
accessInfo.addEventListener("accesschanged", onAccessChanged);
Después, administra los cambios en los permisos para que el usuario sepa que las geovallas no funcionarán si los permisos están desactivados:
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 Puedes determinar si un usuario ha deshabilitado la ubicación en la configuración consultando la propiedad LocationStatus. Si el valor es Disabled, la ubicación estará deshabilitada.
Crear la geovalla
Ahora ya estás listo para definir y configurar una geovalla. Algunos de los valores que se pueden establecer para una geovalla son:
- Un Id para identificarla.
- La región circular de interés, definida por Geoshape.
- Los MonitoredStates, que indican para qué eventos de geovalla quieres recibir notificaciones: entrar en la región definida, salir de la región definida o eliminar la geovalla.
- Una marca SingleUse, que eliminará la geovalla cuando se hayan alcanzado todos los estados de la geovalla que se está supervisando.
- DwellTime, que indica cuánto tiempo debe estar el usuario fuera o dentro del área definida antes de generar eventos de entrada o salida.
- StartTime, que indica cuándo comenzar a supervisar la geovalla.
- Duration, que establece el tiempo durante el cual se supervisará la geovalla.
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;
}
Temas relacionados
Guías básicas
Guía básica para aplicaciones con JavaScript
Diseño de la experiencia del usuario para aplicaciones
Tareas
Controlar notificaciones de geovallas en primer plano
Escuchar eventos de geovallas en segundo plano
Administrar notificaciones de geovallas en una tarea en segundo plano
Referencia
Otros recursos
Muestra de geolocalización de Windows 10