Геофенсинг в Windows Phone 8.1

Windows Phone 8.1 принёс концепцию геофенсинга в нашу любимую платформу Windows Phone. Geofencing позволяет вызвать действие, когда пользователь находится в координате из заранее определенного набора. Windows Phone 8.1 регистрирует геозоны в операционной системе, поэтому нашему приложению не нужно быть запущенным для срабатывания триггеров. В этой статье мы будем вызывать приветственное сообщение каждый раз, когда кто-то прибывает в 9 здание кампуса Microsoft в Редмонде.
dzw45l[1]

Приложение
Создадим новое приложение для Windows Phone 8.1. Добавим возможность Location в Package.appxmanifest. Конечно, ведь нам же нужна возможность геолокации в приложении 🙂
foditu[1]
Погрузимся в наш код. Это приложение будет иметь только пустой MainPage и всплывающее сообщение, которое появляется, когда мы у здания 9.
Первое, что нам нужно, это подключить ссылка на пространство имён GeofenceMonitor (монитор геозоны).

  1. GeofenceMonitor _monitor = GeofenceMonitor.Current;

Установим местоположение для отслеживания геолокации и подключим в конструкторе событие, которое должно происходить по достижении местоположения.

  1. public MainPage()
  2. {
  3. InitializeComponent();
  4. _monitor.GeofenceStateChanged += MonitorOnGeofenceStateChanged;
  5. //Microsoft Redmond building 9
  6. BasicGeoposition pos = new BasicGeoposition { Latitude = 47.6397, Longitude = 122.1289 };
  7. Geofence fence = new Geofence(«building9», new Geocircle(pos, 100));
  8. try
  9. {
  10. _monitor.Geofences.Add(fence);
  11. }
  12. catch (Exception)
  13. {
  14. //geofence already added to system
  15. }
  16. }

Сначала мы подключимся к событию GeofenceStateChanged и будем следить за обработчиком события. После этого мы создаём геопозицию BasicGeoPosition, которая содержит координаты, в нашем случае, здание 9 кампуса Microsoft в Редмонде. Затем создаём объект Geofence. Конструктор Geofence принимает два параметра: строку, которая используется как ID поэтому он должен быть уникальным, а также IGeoShape.  Другие перегрузки для Geofence позволяют указать, если мы хотим инициировать событие всякий раз, когда мы входим или покидаем зону GeoFence.
Для ID мы используем строку, для IGeoShape мы используем тип GeoCircle. Существуют другие встроенные типы для геометрических форм геопространств:
— Geoboundingbox
— Geocircle
— Geopath
— Geopoint
Geocircle имеет два параметра: положение и радиус (в метрах). Мы уже определили положение как BasicGeoposition, это именно тот тип, который используется в Geocircle; а радиус мы зададим в 100 метров. Наконец мы пытаемся добавить Geofence к геозонам, зарегистрированным в ОС. Если Geofence с тем же ID уже существует, он будет давать исключение, сообщая, что объект уже существует.
rrpfns[1]
Давайте посмотрим на обработчик события

  1. private void MonitorOnGeofenceStateChanged(GeofenceMonitor sender, object args)
  2. {
  3. var fences = sender.ReadReports();
  4. foreach (var report in fences)
  5. {
  6. if (report.Geofence.Id != «building9»)
  7. continue;
  8. switch (report.NewState)
  9. {
  10. case GeofenceState.Entered:
  11. Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () =>
  12. {
  13. MessageDialog dialog = new MessageDialog(«Welcome to building 9»);
  14. await dialog.ShowAsync();
  15. });
  16. break;
  17. case GeofenceState.Exited:
  18. Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () =>
  19. {
  20. MessageDialog dialog = new MessageDialog(«Leaving building 9»);
  21. await dialog.ShowAsync();
  22. });
  23. break;
  24. }
  25. }
  26. }

Прежде чем мы сможем показать сообщение мы должны знать, что Geofence вызвал событие. Мы делаем это путем вызова ReadReports в GeofenceMonitor. Этот метод будет возвращать ReadOnlyList, содержащий GeofenceStateChangedReports.  Перебирая эти отчёты мы можем проверить идентификатор геозоны и принять меры, когда ожидаемый Geofence срабатывает. В данном случае мы хотим показать приветствие, когда кто-то приходит и прощание, когда кто-то уходит. Давайте опробуем!
Запустим приложение в эмуляторе (когда вы будете физически у здания 9, вы сможете воспользоваться устройством на WP8.1), откроем инструметы эмулятора и установим положение в координатах здания 9. Нужно подождать несколько секунд, чтобы появилось всплывающее сообщение. Это сделано для предотвращения ложного срабатывания, когда вы просто проходите через зону геолокации. Вы можете манипулировать этой задержкой, используя перегрузку конструктора Geofence и параметр DwellTime (TimeSpan).
r88mkg[1]
Очистите местоположение и установить его куда-нибудь подальше от здания 9, подождите несколько секунд и посмотрите на прощальное сообщение.
icijw1[1]

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

Перевод статьи: «Geofencing in Windows Phone 8.1»
Автор: Nico Vermeir
Перевёл: С. Урусов (с разрешения автора)

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *