Einrichten eines Geofence

Ein Geofence definiert eine kreisförmige geografische Grenze um einen interessanten Punkt. Ihre App empfängt Benachrichtigungen, wenn der Benutzer die Grenze eingibt oder verlässt. Geofences sind nützlich für standortbasierte Erinnerungen, Warnungen, Check-Ins und kontextbezogene Inhaltsübermittlung.

In diesem Artikel wird erläutert, wie Sie geofence-Ereignisse erstellen, Zustandsänderungen überwachen und Geofence-Ereignisse in einer Windows App SDK -App (WinUI 3) behandeln.

Voraussetzungen

  • Ein WinUI 3-Projekt, das aus der Vorlage "Leere App, Verpackt" (WinUI 3 in Desktop) erstellt wurde.
  • Die im Paketmanifest deklarierte Standort-Funktion. Anweisungen finden Sie unter Den Standort des Benutzers abrufen.

Anfordern des Standortzugriffs

Rufen Sie Geolocator.RequestAccessAsync auf, bevor Sie Geofences erstellen oder überwachen.

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

Geofence erstellen

Definieren Sie einen Geofence-Bereich, indem Sie einen Bezeichner, ein geografisches Zentrum, einen Radius in Metern angeben und welche Zustandsübergänge überwacht werden (eingegeben, beendet oder entfernt).

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

Geofence-Parameter

Parameter Description
id Eine eindeutige Zeichenfolge, die den Geofence-Bereich identifiziert. Verwenden Sie dies, um Ereignisse von verschiedenen Geofences zu unterscheiden.
geoshape Ein Geokreis , der die Grenze definiert. Es werden nur Kreisgrenzen unterstützt.
monitoredStates Welche Übergänge überwacht werden sollen: Entered, , Exitedoder Removed. Mit dem | Operator kombinieren.
singleUse Wenn true, wird der Geofence einmal ausgelöst und automatisch entfernt.
dwellTime Wie lange der Benutzer innerhalb (oder außerhalb) der Grenze bleiben muss, bevor das Ereignis ausgelöst wird. Hilft, kurze Übergänge herauszufiltern.

Geofence-Ereignisse im Vordergrund überwachen

Abonnieren Sie das GeofenceMonitor.Current.GeofenceStateChanged-Ereignis , um Benachrichtigungen zu empfangen, während Ihre App ausgeführt wird.

GeofenceMonitor.Current.GeofenceStateChanged += OnGeofenceStateChanged;

Lesen Sie die Berichte, und aktualisieren Sie die Benutzeroberfläche. Das Ereignis wird in einem Hintergrundthread ausgelöst. Verwenden Sie daher DispatcherQueue zum Marshallen von UI-Updates.

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

Überwachen von Geofence-Statusänderungen

Verwenden Sie GeofenceMonitor.Current.StatusChanged , um zu erkennen, wann die Geofence-Überwachung deaktiviert ist , z. B. wenn der Benutzer Standortdienste deaktiviert.

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

Überwachen Sie bei Verwendung von Geofences Berechtigungsänderungen über GeofenceMonitor.StatusChanged anstelle von Geolocator.StatusChanged. Ein GeofenceMonitorStatus-WertDisabled entspricht einem PositionStatus von Disabled, bietet jedoch GeofenceMonitorStatus mehr Kontext für Geofencing-Szenarien.

Geofence entfernen

Entfernen Sie einen Geofence, indem Sie ihn in der Auflistung GeofenceMonitor.Current.Geofences suchen.

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

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

Bewährte Methoden

  • Legen Sie eine angemessene Verweilzeit fest. Eine Verweilzeit von mindestens 10 Sekunden hilft, GPS-Jitter herauszufiltern und falsche Auslöser an Grenzgrenzen zu verhindern.
  • Verwenden Sie einen Radius von mindestens 50 Metern. Die GPS-Genauigkeit variiert je nach Gerät und Umgebung. Ein Radius kleiner als 50 Meter kann zu unzuverlässigen Ergebnissen führen.
  • Überprüfen Sie bei Bedarf den Internetzugriff. Wenn Ihre App Netzwerkvorgänge ausführt, wenn ein Geofence-Ereignis eintritt (etwa um eine Benachrichtigung an einen Server zu senden), überprüfen Sie die Netzwerkverbindung, bevor Sie den Geofence einrichten.
  • Behandeln Sie den Zustand Removed. Geofences können vom System entfernt werden, wenn sie ablaufen oder wenn das System unter Ressourcendruck steht. Prüfen Sie GeofenceState.Removed und erstellen Sie den Geofence neu, falls Ihr Szenario dies erfordert.
  • Überwachen Sie den Vordergrund und den Hintergrund nicht gleichzeitig auf denselben Geofence-Raum, es sei denn, dies ist erforderlich. Wenn Sie dies tun, melden Sie den Foreground-Listener ab, wenn die App angehalten wird, und registrieren Sie ihn erneut, wenn sie wieder aktiv wird.