Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Una geovalla define un límite geográfico circular alrededor de un punto de interés. La aplicación recibe notificaciones cuando el usuario entra o sale del límite. Las geovallas son útiles para recordatorios basados en la ubicación, alertas, registros de presencia y entrega de contenido contextual.
En este artículo se muestra cómo crear una geovalla, supervisar los cambios de estado y controlar los eventos de geovalla en una aplicación de SDK de Aplicaciones para Windows (WinUI 3).
Prerequisites
- Un proyecto de WinUI 3 creado a partir de la plantilla Aplicación en blanco, empaquetada (WinUI 3 en escritorio).
- La funcionalidad Ubicación declarada en el manifiesto del paquete. Consulte Obtener la ubicación del usuario para obtener instrucciones.
Solicitud de acceso a la ubicación
Llama a Geolocator.RequestAccessAsync antes de crear o supervisar geovallas.
using Windows.Devices.Geolocation;
using Windows.Devices.Geolocation.Geofencing;
var accessStatus = await Geolocator.RequestAccessAsync();
if (accessStatus != GeolocationAccessStatus.Allowed)
{
StatusText.Text = "Location access is required for geofencing.";
return;
}
Crear una geovalla
Define una geovalla especificando un identificador, un centro geográfico, un radio en metros y qué transiciones de estado se van a supervisar (entrada, salida o eliminación).
var position = new BasicGeoposition
{
Latitude = 47.6062,
Longitude = -122.3321
};
var geocircle = new Geocircle(position, 200); // 200-meter radius
var geofence = new Geofence(
"SeattleDowntown", // Unique identifier
geocircle, // Geographic boundary
MonitoredGeofenceStates.Entered | // States to monitor
MonitoredGeofenceStates.Exited,
false, // Single use: false = persistent
TimeSpan.FromSeconds(10) // Dwell time before triggering
);
GeofenceMonitor.Current.Geofences.Add(geofence);
Parámetros de la geovalla
| Parameter | Descripción |
|---|---|
id |
Una cadena única que identifica la geovalla. Úsala para distinguir eventos de diferentes geovallas. |
geoshape |
Geocircle que define el límite. Solo se admiten límites circulares. |
monitoredStates |
Qué transiciones supervisar: Entered, Exited o Removed. Combínala con el operador |. |
singleUse |
Si es true, la geovalla se activa una vez y se elimina automáticamente. |
dwellTime |
Tiempo que el usuario debe permanecer dentro (o fuera) del límite antes de que se active el evento. Ayuda a filtrar los cruces breves. |
Supervisar eventos de geovalla en primer plano
Suscríbase al evento GeofenceMonitor.Current.GeofenceStateChanged para recibir notificaciones mientras se ejecuta la aplicación.
GeofenceMonitor.Current.GeofenceStateChanged += OnGeofenceStateChanged;
Lea los informes y actualice la interfaz de usuario. El evento se activa en un hilo en segundo plano, por lo que debes utilizar DispatcherQueue para administrar las actualizaciones de la interfaz de usuario.
private void OnGeofenceStateChanged(GeofenceMonitor sender, object args)
{
var reports = sender.ReadReports();
DispatcherQueue.TryEnqueue(() =>
{
foreach (var report in reports)
{
var state = report.NewState;
var id = report.Geofence.Id;
switch (state)
{
case GeofenceState.Entered:
StatusText.Text = $"Entered geofence: {id}";
break;
case GeofenceState.Exited:
StatusText.Text = $"Exited geofence: {id}";
break;
case GeofenceState.Removed:
StatusText.Text = $"Geofence removed: {id}";
// Re-add the geofence if it was removed due to expiration
break;
}
}
});
}
Supervisar cambios de estado de las geovallas
Utilice GeofenceMonitor.Current.StatusChanged para detectar cuándo se deshabilita la supervisión de zonas geográficas; por ejemplo, cuando el usuario desactiva los servicios de ubicación.
GeofenceMonitor.Current.StatusChanged += (sender, args) =>
{
DispatcherQueue.TryEnqueue(() =>
{
var status = sender.Status;
if (status == GeofenceMonitorStatus.Disabled)
{
StatusText.Text = "Geofence monitoring is disabled. Check location settings.";
}
});
};
Tip
Al utilizar geovallas, supervisa los cambios de permiso a través de GeofenceMonitor.StatusChanged en lugar de Geolocator.StatusChanged. Un valor de GeofenceMonitorStatus de Disabled es equivalente a un PositionStatus de Disabled, pero GeofenceMonitorStatus proporciona más contexto en escenarios de geoperimetraje.
Eliminar una geovalla
Elimina una geovalla buscándola en la colección GeofenceMonitor.Current.Geofences.
var geofences = GeofenceMonitor.Current.Geofences;
var target = geofences.FirstOrDefault(g => g.Id == "SeattleDowntown");
if (target != null)
{
geofences.Remove(target);
}
procedimientos recomendados
- Establezca un tiempo de permanencia razonable. Un tiempo de permanencia de al menos 10 segundos ayuda a filtrar la vibración del GPS y evita los desencadenadores falsos en bordes de límite.
- Utilice un radio de al menos 50 metros. La precisión del GPS varía según el dispositivo y el entorno. Un radio menor que 50 metros puede producir resultados poco confiables.
- Compruebe el acceso a Internet si es necesario. Si su aplicación realiza operaciones de red cuando se activa un evento de geovalla (por ejemplo, al enviar una notificación a un servidor), verifique que haya conectividad antes de crear la geovalla.
- Gestione el estado
Removed. El sistema puede eliminar las geovallas si caducan o si el sistema se ve sometido a una presión de recursos. Comprueba si existeGeofenceState.Removedy vuelve a crear la geovalla si tu escenario lo requiere. - No monitorice el primer plano y el segundo plano simultáneamente para la misma geocerca, a menos que sea necesario. Si lo haces, da de baja el oyente en primer plano cuando la aplicación se suspenda y vuelve a registrarlo cuando se reanude.