Геофенсинг. Что это? Установка и настройка geofencing в iOS

В течение многих лет email маркетинг был одним из основных способов привлечения внимания в интернете. На замену большим ПК пришли мобильные устройства. За последние 2 года push уведомления хочет присылать каждое второе приложение, при этом стоящих уведомлений единицы. В этом случае владелец бизнеса будет посылать уведомления всем своим клиентам, таким образом можно потерять лояльную аудиторию. Решение приходит вместе с появлением технологии геофенсинг. 

Новая технология позволит взаимодействовать с пользователями, находящимися в заданном радиусе от объекта. QR коды на вывесках в магазинах привлекают внимание, но для этого требуется дополнительные действия со стороны пользователей. Geofencing работает автоматически. В этом случае приложение может прислать уведомление конкретному пользователю. Зная, что клиенты находятся неподалеку компанию могут делать уникальные предложения (даже в зависимости от времени суток). 

Кроме выгоды для клиента, сразу очевидна еще одно преимущество для владельца бизнеса - аналитика. Возможность узнать, какие места более посещаемы пользователями мобильных приложений. Узнать, какие предложения действуют больше чем другие, вовлечь аудиторию в магазины. Геймификация (награды за различные действия) будут стимулировать пользователей посещать ваши объекты чаще и чаще.

геофенсинг

Настройка геофенсинга в iOS

Геофенсинг доступен с версии 7.0 операционной системы. В версии 7.1 он будет работать и в фоновом режиме. Как пишет Apple:

Note: Apps can expect a notification as soon as the device moves 500 meters or more from its previous notification. It should not expect notifications more frequently than once every five minutes. If the device is able to retrieve data from the network, the location manager is much more likely to deliver notifications in a timely manner.

Службы геофенсинга работают на уровне системы и будут уведомлять приложение (если оно подписано) не чаще чем раз в 500 метров. Также есть временное ограничение - примерно раз в 5 минут. По тестами можно с уверенностью сказать, что ограничение по расстояние действительно есть. А по времени - события приходят практически мгновенно. 

Также есть ограничение на максимальное количество одновременно отслеживаемых регионов = 20 шт. Поэтому правильным решением будет регистрация на события по ближайшим к пользователю объектам. При этом, при изменении положения пользователя (или по другому признаку), при обновлении геомониторинга - старые регионы обязательно нужно “отписать”.

Еще одной особенностью является то, что iOS уведомит нас именно о событии пересечения черты, то есть когда пользователь либо вошел в регион, либо покинул его. Необходимо вручную (об этом ниже в примере) проверять, нахожусь ли я уже внутри региона.

Monotouch iOS Geofencing

Для начала создадим объект CLLocationManager.

var LocMgr = new CLLocationManager();

Мы регистрируем области, представляющие из себя круглые регионы:

CLCircularRegion region = new CLCircularRegion(new CLLocationCoordinate2D(59.9343,30.3101), 10000, “Санкт-Петербург”)

Объект создается из параметров центральной точки и радиуса действия в метрах. Конструктор принимает StringIdentifier (идентификатор объекта в системе геофенсионга iOS). В нашем случае это идентификатор объекта (int).

В общем случае код для подписи на события геофенсинга выглядит следующим образом:

//Включена или доступна служба геофенсинга (работает с iOS 7.0)
if (CLLocationManager.LocationServicesEnabled)
{
    //разрешил ли пользователь доступ к геоданным
    if (CLLocationManager.Status != CLAuthorizationStatus.Denied)
    {
        //Еще одна проверка для запуска
        if (CLLocationManager.IsMonitoringAvailable(typeof(CLCircularRegion)))
        {
            //Получаем список регионов для регистрации с сервера
            //В нашем случае мы учиываем координаты пользователя и возвращаем ближайшие 20 объектов
            _regions = await LocationRegionModel.GetLocationRegions(latitude, longitude);
            if (_regions != null)
            {
                foreach (LocationRegionModel region in _regions)
                {
                    CLCircularRegion clRegion = new CLCircularRegion(new CLLocationCoordinate2D(region.Latitude, region.Longitude), region.Radius, region.StringIdentifier);
                    _locMgr.StartMonitoring(clRegion);
                    Console.WriteLine(“Start monitoring: “ + region.ID + ” radius: “ + region.Radius);
                    //Вручную проверяем, не находимся ли мы в уже каком-нибудь регионе
                    CheckState(clRegion, region, latitude, longitude);
                }
                return false;
            }
        }
        else
        {
            Console.WriteLine(“This app requires region monitoring, which is unavailable on this device”);
            return false;
        }
        LocMgr.Failed += (o, e) =>
        {
            Console.WriteLine(e.Error);
        };

}
else
{
    Console.WriteLine("App is not authorized to use location data");
    return false;
}

} else { Console.WriteLine(“Location services not enabled, please enable this in your Settings”); return false; }

Для проверки нахождения пользователя внутри определенного региона у объекта класса CLCircularRegion есть метод ContainsCoordinate, который укажет об этом.

Подпись на события:

_locMgr = new CLLocationManager();
_locMgr.RegionEntered += async (sender, e) => await HandleRegionEntered(sender, e);
_locMgr.RegionLeft += HandleRegionLeft;

Обработка события входа в регион

private async Task OnRegionEntered(CLRegion region)
{
    //Получаем информацию о том регионе, в котором оказался пользователь (по его строчному идентификатору)
    LocationRegionModel regionInfo = _regions.FirstOrDefault(a => a.StringIdentifier == region.Identifier);
    if (regionInfo != null)
    {
        //Мы показываем сообщения пользователю не чаще чем раз в 5 минут
        if (IsEnabledToShowMessage(regionInfo.ID, regionInfo.UpdateDate))
        {
            try
            {
                Console.WriteLine(“Enter on region enter in try”);
                //Здесь необходимо записать, что этому пользователю уже показано определенное сообщение
                LocationMessageModel message = null;
                //Само сообщение получается с сервера через интернет (т. е. сообщение будет всегда актуальное)
                message = await LocationMessageModel.GetMessage(regionInfo.ID);
                if (message != null)
                    //Создаем локальный PUSH
                    CreateLocalMessage(message);
                else
                    Console.Write(“Message = null”);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

    }
}

}

Настройка проекта

С программной точки зрения мы рассмотрели вопросы геофенсинга. Теперь необходимо настроить проект для включения этой возможности.

Настройки проекта Monotouch для доступа к геофенсинг

В ApplicationDelegate нужно обработать события сворачивания и разворачивания. Т. к. геофенсинг при открытом приложении работает в обычном режиме, а при закрытом приложении работает в фоновом режиме. Режимы включаются вручную и имеют свои особенности.

public override void WillEnterForeground(UIApplication application)
{
    base.WillEnterForeground(application);

if (LocalSettings.HaveGeoFencing)
    AppLocationManager.Instance.WillEnterForeground();

}

public override void DidEnterBackground(UIApplication application) { base.DidEnterBackground(application); if (LocalSettings.HaveGeoFencing) AppLocationManager.Instance.DidEnterBackground(); }

Комментарии

comments powered by Disqus