Geofence instellen

Een Geofence definieert een cirkelvormige geografische grens rond een nuttige plaats. Uw app ontvangt meldingen wanneer de gebruiker de grens binnenkomt of verlaat. Geofences zijn handig voor op locatie gebaseerde herinneringen, waarschuwingen, check-ins en contextuele levering van inhoud.

In dit artikel wordt beschreven hoe u een geofence maakt, statuswijzigingen bewaakt en geofence-gebeurtenissen verwerkt in een winUI 3-app (Windows App SDK).

Vereiste voorwaarden

  • Een WinUI 3-project dat is gemaakt op basis van de sjabloon Blank App, Packaged (WinUI 3 in Desktop).
  • De locatiemogelijkheid die is gedeclareerd in het pakketmanifest. Zie De locatie van de gebruiker ophalen voor instructies.

Toegang tot locatie aanvragen

Roep Geolocator.RequestAccessAsync aan voordat u geofences maakt of bewaakt.

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 maken

Definieer een geofence door een id, een geografisch centrum, een straal in meters op te geven en welke statusovergangen moeten worden bewaakt (ingevoerd, afgesloten of verwijderd).

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

Geofenceparameters

Parameter Description
id Een unieke tekenreeks die de geofence identificeert. Gebruik deze optie om gebeurtenissen van verschillende geofences te onderscheiden.
geoshape Een Geocircle die de grens definieert. Alleen cirkelgrenzen worden ondersteund.
monitoredStates Welke overgangen moeten worden gemonitord: Entered, Exited, of Removed. Combineren met de | operator.
singleUse Als true, wordt de geofence één keer geactiveerd en automatisch verwijderd.
dwellTime Hoe lang de gebruiker binnen (of buiten) de grens moet blijven voordat de gebeurtenis wordt geactiveerd. Helpt bij het filteren van korte kruisingen.

Geofence-gebeurtenissen op de voorgrond bewaken

Abonneer u op de gebeurtenis GeofenceMonitor.Current.GeofenceStateChanged om meldingen te ontvangen terwijl uw app wordt uitgevoerd.

GeofenceMonitor.Current.GeofenceStateChanged += OnGeofenceStateChanged;

Lees de rapporten en werk de gebruikersinterface bij. De gebeurtenis wordt geactiveerd op een achtergrondthread, dus gebruik DispatcherQueue om UI-updates naar de UI-thread door te geven.

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

Statuswijzigingen van geofence bewaken

Gebruik GeofenceMonitor.Current.StatusChanged om te detecteren wanneer geofence-bewaking is uitgeschakeld, bijvoorbeeld wanneer de gebruiker locatieservices uitschakelt.

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

Wanneer u geofences gebruikt, controleert u machtigingenwijzigingen via GeofenceMonitor.StatusChanged in plaats van Geolocator.StatusChanged. Een GeofenceMonitorStatus-waarde van Disabled komt overeen met een PositionStatus van Disabled, maar GeofenceMonitorStatus biedt meer context in geofencingscenario's.

Een geofence verwijderen

Verwijder een geofence door deze te vinden in de verzameling GeofenceMonitor.Current.Geofences .

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

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

Beste praktijken

  • Stel een redelijke vertragingstijd in. Een verblijftijd van ten minste 10 seconden helpt GPS-jitter uit te filteren en voorkomt valse activeringen bij grensranden.
  • Gebruik een straal van ten minste 50 meter. Gps-nauwkeurigheid varieert per apparaat en omgeving. Een straal kleiner dan 50 meter kan onbetrouwbare resultaten opleveren.
  • Controleer indien nodig de internettoegang. Als uw app netwerkbewerkingen uitvoert wanneer een geofence-gebeurtenis wordt geactiveerd (zoals het verzenden van een melding naar een server), controleert u de connectiviteit voordat u de geofence maakt.
  • Verwerk de Removed toestand. Geofences kunnen door het systeem worden verwijderd als ze verlopen of als het systeem onder resourcedruk staat. Controleer of GeofenceState.Removed aanwezig is en maak de geofence opnieuw aan als uw scenario dit vereist.
  • Bewaak de voorgrond en achtergrond niet tegelijkertijd voor dezelfde geofence, tenzij dat nodig is. Als u dit doet, moet u de registratie van de voorgrondlistener ongedaan maken wanneer de app wordt onderbroken en opnieuw registreren wanneer deze wordt hervat.