Настроить геозону

Геозона задаёт круговую географическую область вокруг точки интереса. Приложение получает уведомления при входе или выходе из границы. Геозоны полезны для напоминаний с учетом местоположения, оповещений, отметок о посещении и показа контекстного контента.

В этой статье показано, как создать геозону, отслеживать изменения состояния и обрабатывать события геозоны в приложении Windows App SDK (WinUI 3).

Необходимые условия

Запросить доступ к местоположению

Вызовите 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 и при необходимости повторно создайте геозону в соответствии с вашим сценарием.
  • Не отслеживайте передний план и фон одновременно для одной геозоны, если это не необходимо. Если это так, отмените регистрацию обработчика переднего плана, когда приложение приостанавливается, и повторно зарегистрируйте его, когда оно возобновляет работу.