Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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
Removedtoestand. Geofences kunnen door het systeem worden verwijderd als ze verlopen of als het systeem onder resourcedruk staat. Controleer ofGeofenceState.Removedaanwezig 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.
Verwante artikelen
Windows developer