Configurer une limite géographique

Une limite géographique définit une limite géographique circulaire autour d’un point d’intérêt. Votre application reçoit des notifications lorsque l’utilisateur entre ou quitte la limite. Les limites géographiques sont utiles pour les rappels basés sur la localisation, les alertes, les enregistrements de présence et la diffusion de contenu contextuel.

Cet article montre comment créer une limite géographique, surveiller les modifications d’état et gérer des événements de limite géographique dans une application SDK d'application Windows (WinUI 3).

Prerequisites

  • Un projet WinUI 3 créé à partir du modèle Application vide, empaquetée (WinUI 3 dans Desktop).
  • Fonctionnalité d’emplacement déclarée dans le manifeste du package. Consultez Obtenir l’emplacement de l’utilisateur pour obtenir des instructions.

Demander l’accès à la localisation

Appelez Geolocator.RequestAccessAsync avant de créer ou de surveiller des limites géographiques.

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;
}

Créer une limite géographique

Définissez un géorepère en spécifiant un identifiant, un centre géographique, un rayon en mètres et les transitions d’état à surveiller (entrée, sortie ou suppression).

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);

Paramètres de géorepérage

Parameter Description
id Chaîne unique qui identifie la limite géographique. Utilisez cette option pour distinguer les événements des différentes limites géographiques.
geoshape Géocircon qui définit la limite. Seules les limites circulaires sont prises en charge.
monitoredStates Transitions à surveiller : Entered, Exited, ou Removed. Combinez avec l’opérateur |.
singleUse Si true, la limite géographique se déclenche une fois et est supprimée automatiquement.
dwellTime Durée pendant laquelle l’utilisateur doit rester à l’intérieur (ou à l’extérieur) du périmètre avant que l’événement ne se déclenche. Permet de filtrer les brefs franchissements.

Surveiller les événements de limite géographique au premier plan

Abonnez-vous à l’événement GeofenceMonitor.Current.GeofenceStateChanged pour recevoir des notifications pendant l’exécution de votre application.

GeofenceMonitor.Current.GeofenceStateChanged += OnGeofenceStateChanged;

Lisez les rapports et mettez à jour l’interface utilisateur. L’événement se déclenche sur un thread en arrière-plan ; utilisez donc DispatcherQueue pour dispatcher les mises à jour de l’interface utilisateur.

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;
            }
        }
    });
}

Surveiller les modifications de l’état de la limite géographique

Utilisez GeofenceMonitor.Current.StatusChanged pour détecter quand la surveillance de la limite géographique est désactivée, par exemple lorsque l’utilisateur désactive les services d’emplacement.

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

Lorsque vous utilisez des limites géographiques, surveillez les modifications d’autorisation via GeofenceMonitor.StatusChanged plutôt que geolocator.StatusChanged. Une valeur de GeofenceMonitorStatus de Disabled est équivalente à PositionStatus de Disabled, mais GeofenceMonitorStatus fournit davantage de contexte pour les scénarios de géorepérage.

Supprimer une limite géographique

Supprimez une limite géographique en la trouvant dans la collection GeofenceMonitor.Current.Geofences .

var geofences = GeofenceMonitor.Current.Geofences;
var target = geofences.FirstOrDefault(g => g.Id == "SeattleDowntown");

if (target != null)
{
    geofences.Remove(target);
}

Bonnes pratiques

  • Définissez un temps d’attente raisonnable. Une durée de vie d’au moins 10 secondes permet de filtrer la gigue GPS et empêche les faux déclencheurs aux bords limites.
  • Utilisez un rayon d’au moins 50 mètres. La précision GPS varie selon l’appareil et l’environnement. Un rayon inférieur à 50 mètres peut produire des résultats peu fiables.
  • Vérifiez l’accès à Internet si nécessaire. Si votre application effectue des opérations réseau lorsqu’un événement de limite géographique se déclenche (par exemple, l’envoi d’une notification à un serveur), vérifiez la connectivité avant de créer la limite géographique.
  • Gérez l’état Removed. Les limites géographiques peuvent être supprimées par le système si elles expirent ou si le système est sous pression sur les ressources. Vérifiez GeofenceState.Removed et recréez la limite géographique si votre scénario l’exige.
  • Ne surveillez pas le premier plan et l’arrière-plan simultanément pour la même limite géographique, sauf si nécessaire. Si vous le faites, annulez l’inscription de l’écouteur de premier plan lorsque l’application est suspendue et réinscrivez-la lorsqu’elle reprend.