Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Geofence wyznacza okrągłą granicę geograficzną wokół punktu zainteresowania. Aplikacja otrzymuje powiadomienia, gdy użytkownik wchodzi lub zamyka granicę. Geofencingi są przydatne w przypadku przypomnień opartych na lokalizacji, alertów, ewidencjonów i dostarczania zawartości kontekstowej.
W tym artykule pokazano, jak utworzyć geofencing, monitorować zmiany stanu i obsługiwać zdarzenia geofencingu w aplikacji Zestaw SDK do aplikacji systemu Windows (WinUI 3).
Prerequisites
- Projekt WinUI 3 utworzony z szablonu Pusta aplikacja w pakiecie (WinUI 3 na pulpicie).
- Funkcja Location zadeklarowana w manifeście pakietu. Aby uzyskać instrukcje, zobacz Pobieranie lokalizacji użytkownika .
Żądanie dostępu do lokalizacji
Przed utworzeniem lub monitorowaniem geofencingów geograficznych wywołaj metodę Geolocator.RequestAccessAsync .
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;
}
Tworzenie geofencingu
Zdefiniuj geostrefę, określając identyfikator, środek geograficzny, promień w metrach oraz przejścia stanów do monitorowania (wejście, wyjście lub usunięcie).
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);
Parametry geofencingu
| Parameter | Opis |
|---|---|
id |
Unikatowy ciąg znaków, który identyfikuje daną geostrefę. Użyj tego, aby odróżniać zdarzenia pochodzące z różnych stref geograficznych. |
geoshape |
Geocircle definiujące granicę. Obsługiwane są tylko granice kołowe. |
monitoredStates |
Które przejścia monitorować: Entered, Exited lub Removed. Połącz z operatorem | . |
singleUse |
Jeśli true, geofencing uruchamia się raz i jest automatycznie usuwany. |
dwellTime |
Jak długo użytkownik musi pozostać wewnątrz obszaru (lub poza nim), zanim zdarzenie zostanie wywołane. Pomaga odfiltrować krótkie przejścia. |
Monitorowanie zdarzeń geofencingu na pierwszym planie
Zasubskrybuj zdarzenie GeofenceMonitor.Current.GeofenceStateChanged , aby otrzymywać powiadomienia podczas działania aplikacji.
GeofenceMonitor.Current.GeofenceStateChanged += OnGeofenceStateChanged;
Przeczytaj raporty i zaktualizuj interfejs użytkownika. Zdarzenie jest uruchamiane w wątku w tle, dlatego służy DispatcherQueue do marshalingu aktualizacji interfejsu użytkownika.
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;
}
}
});
}
Monitorowanie zmian stanu geofencingu
Użyj elementu GeofenceMonitor.Current.StatusChanged , aby wykryć, kiedy monitorowanie geofencingu jest wyłączone — na przykład gdy użytkownik wyłączy usługi lokalizacji.
GeofenceMonitor.Current.StatusChanged += (sender, args) =>
{
DispatcherQueue.TryEnqueue(() =>
{
var status = sender.Status;
if (status == GeofenceMonitorStatus.Disabled)
{
StatusText.Text = "Geofence monitoring is disabled. Check location settings.";
}
});
};
Wskazówka
W przypadku korzystania z geofencingów monitoruj zmiany uprawnień za pomocą elementu GeofenceMonitor.StatusChanged , a nie Geolocator.StatusChanged. Wartość GeofenceMonitorStatus równa Disabled jest równoważna wartości PositionStatus równej Disabled, ale GeofenceMonitorStatus zapewnia więcej kontekstu dla scenariuszy geofencingu.
Usuwanie geofencingu
Usuń geofencing, wyszukując go w kolekcji GeofenceMonitor.Current.Geofences .
var geofences = GeofenceMonitor.Current.Geofences;
var target = geofences.FirstOrDefault(g => g.Id == "SeattleDowntown");
if (target != null)
{
geofences.Remove(target);
}
Najlepsze rozwiązania
- Ustaw rozsądny czas zamieszkania. Czas przebywania wynoszący co najmniej 10 sekund pomaga odfiltrować niestabilność sygnału GPS i zapobiega fałszywym wyzwoleniom na granicach obszaru.
- Użyj promienia co najmniej 50 metrów. Dokładność GPS różni się w zależności od urządzenia i środowiska. Promień mniejszy niż 50 metrów może spowodować niewiarygodne wyniki.
- Sprawdź dostęp do Internetu w razie potrzeby. Jeśli aplikacja wykonuje operacje sieciowe po uruchomieniu zdarzenia geofencingu (na przykład wysyłania powiadomienia do serwera), przed utworzeniem geofencingu sprawdź łączność.
- Obsłuż stan
Removed. Geostrefy mogą zostać usunięte przez system, jeśli wygasną lub jeśli systemowi brakuje zasobów. SprawdźGeofenceState.Removedi utwórz geostrefę ponownie, jeśli dany scenariusz tego wymaga. - Nie monitoruj jednocześnie działania na pierwszym planie i w tle dla tej samej geostrefy, chyba że jest to konieczne. W przeciwnym razie wyrejestruj odbiornik pierwszego planu, gdy aplikacja zostanie zawieszona i ponownie zarejestruj się po wznowieniu.