Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Геозона задаёт круговую географическую область вокруг точки интереса. Приложение получает уведомления при входе или выходе из границы. Геозоны полезны для напоминаний с учетом местоположения, оповещений, отметок о посещении и показа контекстного контента.
В этой статье показано, как создать геозону, отслеживать изменения состояния и обрабатывать события геозоны в приложении Windows App SDK (WinUI 3).
Необходимые условия
- Проект WinUI 3, созданный из шаблона "Пустое приложение" (WinUI 3 в классическом режиме).
- Функция location , объявленная в манифесте пакета. Инструкции см. в разделе "Получение расположения пользователя ".
Запросить доступ к местоположению
Вызовите 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;
}
Создайте геозону
Определите геозону, указав идентификатор, географические координаты центра, радиус в метрах и переходы между состояниями, которые нужно отслеживать (вход, выход или удаление).
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);
Параметры геозоны
| Parameter | Описание |
|---|---|
id |
Уникальная строка, определяющая геозону. Используйте это для отличия событий от разных геозон. |
geoshape |
Геоциркл, определяющий границу. Поддерживаются только круглые границы. |
monitoredStates |
Какие переходы отслеживать: Entered, Exited или Removed. Объедините с оператором |. |
singleUse |
Если true, геозона срабатывает один раз и удаляется автоматически. |
dwellTime |
Сколько времени пользователь должен оставаться внутри (или вне) границы до срабатывания события. Помогает отфильтровать короткие пересечения. |
Мониторинг событий геозоны на переднем плане
Подпишитесь на событие GeofenceMonitor.Current.GeofenceStateChanged , чтобы получать уведомления во время работы приложения.
GeofenceMonitor.Current.GeofenceStateChanged += OnGeofenceStateChanged;
Чтение отчетов и обновление пользовательского интерфейса. Событие запускается в фоновом потоке, поэтому используется DispatcherQueue для маршалирования обновлений пользовательского интерфейса.
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;
}
}
});
}
Мониторинг изменений состояния геозоны
Используйте GeofenceMonitor.Current.StatusChanged, чтобы определить, когда мониторинг геозон отключается, — например, когда пользователь отключает службы геолокации.
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
При использовании геозон отслеживайте изменения разрешений с помощью GeofenceMonitor.StatusChanged , а не Geolocator.StatusChanged. Значение Disabled эквивалентно PositionStatusDisabledзначению, но GeofenceMonitorStatus предоставляет больше контекста для сценариев геофенсинга.
Удалить геозону
Удалите геозону, найдя ее в коллекции GeofenceMonitor.Current.Geofences .
var geofences = GeofenceMonitor.Current.Geofences;
var target = geofences.FirstOrDefault(g => g.Id == "SeattleDowntown");
if (target != null)
{
geofences.Remove(target);
}
Лучшие практики
- Задайте разумное время ожидания. Минимальная длительность пребывания не менее 10 секунд помогает отфильтровать колебания сигнала GPS и предотвращает ложные срабатывания на границах зоны.
- Используйте радиус не менее 50 метров. Точность GPS зависит от устройства и среды. Радиус меньше 50 метров может привести к ненадежным результатам.
- Проверьте доступ к Интернету при необходимости. Если приложение выполняет сетевые операции при срабатывании события геозонии (например, отправка уведомления на сервер), проверьте подключение перед созданием геозоны.
- Обработайте состояние
RemovedГеозоны могут быть удалены системой, если срок их действия истекает, или если система находится под давлением ресурсов. Проверьте наличиеGeofenceState.Removedи при необходимости повторно создайте геозону в соответствии с вашим сценарием. - Не отслеживайте передний план и фон одновременно для одной геозоны, если это не необходимо. Если это так, отмените регистрацию обработчика переднего плана, когда приложение приостанавливается, и повторно зарегистрируйте его, когда оно возобновляет работу.
Связанные статьи
Windows developer