Статьи

Геозоны в Windows Phone 8.1

Windows Phone 8.1 привносит концепцию геозоны в нашу любимую платформу Windows Phone. Геозона позволяет нам запускать действие, когда пользователь находится в заданном наборе координат. Windows Phone 8.1 регистрирует геозоны в ОС, поэтому нашему приложению не нужно запускаться для срабатывания триггеров. Для этого поста мы будем вызывать приветственное сообщение всякий раз, когда кто-то находится в здании 9 кампуса Microsoft Redmond.

Приложение

Создайте новое приложение для Windows Phone 8.1. Добавьте возможность размещения в Package.appxmanifest. Нам явно нужны возможности определения местоположения для этогоGlimlach

Давайте погрузимся в код. Это приложение будет иметь только пустую главную страницу и диалоговое окно с сообщением, которое появляется, когда мы приближаемся к зданию 9.

Первое, что нам нужно, это ссылка на текущий GeofenceMonitor.

    GeofenceMonitor _monitor = GeofenceMonitor.Current;

Установка местоположения Geofence и подключение события происходит в конструкторе

    public MainPage()
    {
        InitializeComponent();
     
        _monitor.GeofenceStateChanged += MonitorOnGeofenceStateChanged;
     
        //Microsoft Redmond building 9
        BasicGeoposition pos = new BasicGeoposition { Latitude = 47.6397, Longitude = -122.1289 };
     
        Geofence fence = new Geofence("building9", new Geocircle(pos, 100));
     
        try
        {
            _monitor.Geofences.Add(fence);
        }
        catch (Exception)
        {
            //geofence already added to system
        }
    }

Сначала мы подключаем событие GeofenceStateChanged, через минуту мы рассмотрим обработчик событий. Затем мы создаем BasicGeoPosition, который содержит координаты, в нашем случае, здания 9 кампуса Microsoft в Редмонде. Затем мы создаем геозону. Конструктор Geofence принимает два параметра: строку, которая функционирует как идентификатор, поэтому она должна быть уникальной, и IGeoShape. Другие перегрузки для Geofence позволяют нам указать, хотим ли мы запускать событие всякий раз, когда мы входим или покидаем область геозоны.

Для идентификатора мы используем строку, для IGeoShape мы используем GeoCircle. Другие встроенные возможности

  • Geoboundingbox
  • Geocircle
  • Geopath
  • GeoPoint

Geocircle принимает два параметра, положение и радиус (в метрах). Мы уже определили позицию как BasicGeoposition, которая в точности соответствует типу, ожидаемому Geocircle, и мы определяем радиус 100 метров. Наконец, мы пытаемся добавить геозону к геозонам, зарегистрированным в ОС. Если геозона с таким идентификатором уже существует, она выдаст исключение, сообщающее, что объект уже существует.

Давайте посмотрим на обработчик событий

private void MonitorOnGeofenceStateChanged(GeofenceMonitor sender, object args)
{
    var fences = sender.ReadReports();
 
    foreach (var report in fences)
    {
        if (report.Geofence.Id != "building9")
            continue;
 
        switch (report.NewState)
        {
            case GeofenceState.Entered:
                Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () =>
                {
                    MessageDialog dialog = new MessageDialog("Welcome to building 9");
 
                    await dialog.ShowAsync();
                });
                break;
            case GeofenceState.Exited:
                Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () =>

Прежде чем мы сможем показать сообщение, нам нужно знать, какая геозона вызвала событие. Мы делаем это, вызывая ReadReports в GeofenceMonitor. Этот метод возвращает ReadOnlyList, содержащий GeofenceStateChangedReports. Итерируя по этим отчетам, мы можем проверить идентификатор геозоны и принять меры, когда ожидаемая геозона сработает. В этом случае мы хотим показать приветственное сообщение, когда кто-то приходит, и сообщение об уходе, когда кто-то уходит. Давайте попробуем это!

Запустите приложение в эмуляторе (если вы физически не в сборке 9, то вы можете использовать устройство WP8.1 Glimlach), откройте инструменты эмулятора и установите местоположение в сборке 9. Вам придется подождать несколько секунд, прежде чем сообщение появляется, чтобы предотвратить срабатывание триггеров при прохождении через геозону. Вы можете управлять этой задержкой, используя перегрузку конструктора Geofence и устанавливая параметр DwellTime (TimeSpan).

Очистите свое местоположение и установите его где-нибудь подальше от здания 9, подождите несколько секунд и посмотрите оставленное сообщение.

Вывод

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

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

Как обычно, код можно найти на моем OneDrive