Контроль области и iBeacon

Базовая платформа Расположения обеспечивает два способа обнаружить вход и выход пользователя в определенные области: географический контроль области (iOS 4.0 и позже и OS X v10.8 и позже) и контроль области маркера (iOS 7.0 и позже). Географическая область является областью, определенной кругом указанного радиуса вокруг известной точки на поверхности Земли. Напротив, область маркера является областью, определенной близостью устройства к Bluetooth низкоэнергетические маркеры. Сами маркеры являются просто устройствами, распространяющими определенный Bluetooth низкоэнергетическая полезная нагрузка — можно даже превратить устройство на iOS в маркер с некоторой помощью со стороны Ядра платформа Bluetooth.

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

В iOS области, связанные с Вашим приложением, прослежены в любом случае, включая то, когда не работает приложение. Если граница области пересечена, в то время как приложение не работает, то приложение повторно запускается в фон для обработки события. Точно так же, если приложение приостановлено, когда событие имеет место, это разбужено и дано короткий срок (приблизительно 10 секунд) для обработки события. Когда необходимо, приложение может запросить больше фонового времени выполнения с помощью beginBackgroundTaskWithExpirationHandler: метод UIApplication класс.

В OS X контроль области работает только, в то время как приложение работает (или на переднем плане или на фоне), и система пользователя бодрствует. В результате система не запускает приложения для поставки связанных с областью уведомлений.

Определение доступности контроля области

Прежде, чем попытаться контролировать любые области, Ваше приложение должно проверить, поддерживается ли контроль области на текущем устройстве. Вот некоторые причины, почему контроль области не мог бы быть доступным:

В iOS 7.0 и позже, всегда вызывайте isMonitoringAvailableForClass: и authorizationStatus методы класса CLLocationManager прежде, чем попытаться контролировать области. (В OS X v10.8 и позже и в предыдущих версиях iOS, используйте regionMonitoringAvailable класс вместо этого.) isMonitoringAvailableForClass: метод говорит Вам, поддерживает ли используемое оборудование область, контролирующую для указанного класса вообще. Если возвращается тот метод NO, Ваше приложение не может использовать область, контролирующую на устройстве. Если это возвращается YES, вызовите authorizationStatus метод, чтобы определить, разрешается ли приложение в настоящее время использовать службы определения местоположения. Если состояние авторизации kCLAuthorizationStatusAuthorized, Ваше приложение может получить граничные уведомления пересечения для любых областей, которые оно зарегистрировало. Если состояние авторизации установлено в какое-либо другое значение, приложение не получает те уведомления.

Наконец, если Ваше приложение должно обработать обновления информации о местоположении в фоновом режиме, убедиться проверить backgroundRefreshStatus свойство UIApplication класс. Можно использовать значение этого свойства, чтобы определить, если выполнение так возможно и предупредить пользователя, если это не. Когда установка Background App Refresh отключена глобально или в частности для Вашего приложения, Обратите внимание на то, что система не будит Ваше приложение к уведомлениям области.

Контроль географических областей

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

Определение географической области, которая будет контролироваться

Чтобы начать контролировать географическую область, необходимо определить область и зарегистрировать ее в системе. В iOS 7.0 и позже, Вы определяете географические области с помощью CLCircularRegion класс. (В OS X v10.8 и позже и в предыдущих версиях iOS, Вы используете CLRegion класс вместо этого.) Каждая область, которую Вы создаете, должна включить и данные, определяющие желаемую географическую область и строку уникального идентификатора. Строка идентификатора является единственным гарантируемым путем к Вашему приложению для идентификации области позже. Для регистрации области вызовите startMonitoringForRegion: метод Вашего CLLocationManager объект.

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

  Создание перечисления 2-1 и регистрация географической области на основе наложения Набора Карты

- (void)registerRegionWithCircularOverlay:(MKCircle*)overlay andIdentifier:(NSString*)identifier {
 
   // If the overlay's radius is too large, registration fails automatically,
   // so clamp the radius to the max value.
   CLLocationDistance radius = overlay.radius;
   if (radius > self.locManager.maximumRegionMonitoringDistance) {
      radius = self.locManager.maximumRegionMonitoringDistance;
   }
 
   // Create the geographic region to be monitored.
   CLCircularRegion *geoRegion = [[CLCircularRegion alloc]
      initWithCenter:overlay.coordinate
              radius:radius
          identifier:identifier];
   [self.locManager startMonitoringForRegion:geoRegion];
}

Контроль географической области сразу начинается после регистрации для разрешенных приложений. Однако не ожидайте получать событие сразу же, потому что только граничные пересечения генерируют событие. В частности если расположение пользователя уже в области в регистрационное время, менеджер расположения автоматически не генерирует событие. Вместо этого Ваше приложение должно ожидать пользователя для пересечения границы области, прежде чем событие будет сгенерировано и отправлено делегату. Чтобы проверить, является ли пользователь уже в границе области, используйте requestStateForRegion: метод CLLocationManager класс.

Будьте разумны при указании набора областей для контроля. Области являются совместно используемым системным ресурсом, и общее количество областей, доступных в масштабе всей системы, ограничивается. Поэтому Базовое Расположение ограничивает 20 число областей, которые могут одновременно контролироваться отдельным приложением. Для работы вокруг этого предела считайте регистрацию только теми областями в непосредственной близости пользователя. Когда расположение пользователя изменяется, можно удалить области, которые являются теперь более далеким путем и добавляют области, подходящие на пути пользователя. При попытке зарегистрировать область, и пространство недоступно, вызовы диспетчера расположения locationManager:monitoringDidFailForRegion:withError: метод его делегата с kCLErrorRegionMonitoringFailure код ошибки.

Обработка пересекающих границу событий для географической области

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

Можно настроить, который пересекающие границу события уведомляют приложение путем явной установки notifyOnEntry и notifyOnExit свойства CLRegion класс, когда Вы определяете и регистрируете область. (Значение по умолчанию обоих свойств YES.), Например, если Вы хотите быть уведомленными только, когда пользователь выходит из границы области, можно установить значение области notifyOnEntry свойство к NO.

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

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

Контроль областей маркера

Контроль области маркера использует встроенное радио устройства на iOS для обнаружения, когда пользователь является около Bluetooth низкоэнергетическими устройствами, распространяющими iBeacon информацию. Когда пользователь вводит или выходит из области маркера, как с географическим контролем области, можно использовать эту возможность генерировать предупреждения или предоставить другую релевантную информацию. Вместо того, чтобы идентифицироваться фиксированными географическими координатами, однако, область маркера идентифицируется близостью устройства к Bluetooth низкоэнергетические маркеры, распространяющие комбинацию следующих значений:

Поскольку единственная область маркера может представлять многократные маркеры, контроль области маркера поддерживает несколько интересных вариантов использования. Например, приложение, выделенное улучшению опыта клиентов в определенном универмаге, может использовать ту же близость UUID для контроля всех хранилищ в цепочке универмага. Когда пользователь приближается к хранилищу, приложение обнаруживает маркеры хранилища и использует главные и незначительные значения тех маркеров для определения дополнительной информации, такой как, с каким определенным хранилищем встретились или в каком разделе хранилища пользователь находится. (Обратите внимание на то, что несмотря на то, что каждый маркер должен распространить близость UUID, главные и незначительные значения являются дополнительными.)

Определение области маркера, которая будет контролироваться

Чтобы начать контролировать область маркера, определите область и зарегистрируйте ее в системе. Вы определяете область маркера с помощью надлежащего метода инициализации CLBeaconRegion класс. Когда Вы создаете a CLBeaconRegion объект, Вы указываете proximityUUID, major, и minor свойства маркеров, которые Вы хотите контролировать (близость UUID требуется; главные и незначительные значения являются дополнительными). Необходимо также предоставить строку, однозначно определяющую область так, чтобы можно было обратиться к ней в коде. Обратите внимание на то, что идентификатор области не связан с информацией об идентификации, которую распространяет маркер.

Для регистрации области маркера вызовите startMonitoringForRegion: метод Вашего CLLocationManager объект. Перечисление 2-2 показывает выборочный метод, создающий и регистрирующий область маркера.

  Создание перечисления 2-2 и регистрация области маркера

- (void)registerBeaconRegionWithUUID:(NSUUID *)proximityUUID andIdentifier:(NSString*)identifier {
 
   // Create the beacon region to be monitored.
   CLBeaconRegion *beaconRegion = [[CLBeaconRegion alloc]
      initWithProximityUUID:proximityUUID
                 identifier:identifier];
 
   // Register the beacon region with the location manager.
   [self.locManager startMonitoringForRegion:beaconRegion];
}

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

Обработка пересекающих границу событий для области маркера

Когда пользователь вводит зарегистрированную область маркера, вызовы диспетчера расположения locationManager:didEnterRegion: из его объекта делегата. Точно так же, когда пользователь больше не находится в диапазоне никаких маркеров в зарегистрированной области маркера, вызовы диспетчера расположения locationManager:didExitRegion: из его объекта делегата. Обратите внимание на то, что пользователь должен пересечь границу области для инициирования одного из этих вызовов; в частности менеджер расположения не вызывает locationManager:didEnterRegion: если пользователь уже в области. Можно реализовать эти методы делегата предупредить пользователя соответственно или к специфичному для местонахождения UI.

Можно указать, который пересекающие границу события должны уведомить приложение путем установки notifyOnEntry и notifyOnExit свойства области маркера. (Значение по умолчанию обоих свойств YES.), Например, если Вы хотите быть уведомленными только, когда пользователь выходит из границы области, можно установить значение области notifyOnEntry свойство к NO.

Можно также отложить уведомлять пользователя относительно ввода области маркера, пока пользователь не включает дисплей устройства. Для этого просто установите значение области маркера notifyEntryStateOnDisplay значение свойства к YES и набор область notifyOnEntry свойство к NO когда Вы регистрируете область маркера. Чтобы препятствовать тому, чтобы избыточные уведомления были поставлены пользователю, отправьте локальное уведомление только один раз на запись области.

Определение близости маркера Используя расположение

В то время как устройство пользователя в зарегистрированной области маркера, приложения могут использовать startRangingBeaconsInRegion: метод CLLocationManager класс, чтобы определить относительную близость одного или более маркеров в области и быть уведомленным, когда изменяется то расстояние. (Всегда вызывайте isRangingAvailable метод класса CLLocationManager класс прежде, чем попытаться расположиться маркеры в области маркера.) Знание относительного расстояния до маркера может быть полезно для многих приложений. Например, вообразите музей, помещающий маркер на каждом приложении. Специфичное для музея приложение могло использовать близость определенного приложения в качестве сигнала для предоставления информации о том приложении, а не другом.

Вызовы диспетчера расположения locationManager:didRangeBeacons:inRegion: из его объекта делегата каждый раз, когда маркеры в указанной области маркера прибывают в диапазоне, выйдите из диапазона или их изменений близости. Этот метод делегата обеспечивает массив CLBeacon объекты, в настоящее время представляющие маркеры в диапазоне. Массив маркеров упорядочивается приблизительным расстоянием от устройства с самым близким маркером в начале массива. Можно использовать информацию в этих объектах определить близость пользователя к каждому маркеру. Значение в proximity свойство CLBeacon объект дает общий смысл относительного расстояния до маркера.

Вдохновленный демонстрационным приложением музея, описанным ранее в этом разделе, Перечисление 2-3 показывает, как использовать маркер proximity свойство для определения его относительного расстояния от устройства пользователя. Код представляет UI, предоставляющий больше информации об определенной музейной выставке, когда близость самого близкого маркера в массиве относительно близко к пользователю (как определено CLProximityNear постоянный).

Перечисление 2-3  , Определяющее относительное расстояние между маркером и устройством

// Delegate method from the CLLocationManagerDelegate protocol.
- (void)locationManager:(CLLocationManager *)manager
        didRangeBeacons:(NSArray *)beacons
               inRegion:(CLBeaconRegion *)region {
 
   if ([beacons count] > 0) {
      CLBeacon *nearestExhibit = [beacons firstObject];
 
      // Present the exhibit-specific UI only when
      // the user is relatively close to the exhibit.
      if (CLProximityNear == nearestExhibit.proximity) {
         [self presentExhibitInfoWithMajorValue:nearestExhibit.major.integerValue];
      } else {
         [self dismissExhibitInfo];
   }
}

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

Превращение устройства на iOS в iBeacon

Любое устройство на iOS, поддерживающее совместное использование данных с помощью низкой энергии Bluetooth, может использоваться в качестве iBeacon. Поскольку приложение, которое Вы пишете, должно работать на переднем плане, iBeacon поддержка на устройствах на iOS предназначается для тестирования и для приложений, всегда работающих на переднем плане так или иначе, таком как приложения торговой точки. Для других типов iBeacon реализаций необходимо получить выделенные аппаратные средства маркера от сторонних производителей.

Поскольку превращение Вашего устройства на iOS в маркер требует использования Ядра платформа Bluetooth, несомненно, соединят Ваше приложение с CoreBluetooth.framework в Вашем проекте XCode. Для доступа к классам и заголовкам платформы включайте #import <CoreBluetooth/CoreBluetooth.h> оператор наверху любых файлов соответствующего источника.

Создание и распространение области маркера

Для использования устройства на iOS в качестве маркера Вы сначала генерируете 128-разрядный UUID, который будет Вашей близостью области маркера UUID. Откройте Terminal и тип uuidgen на командной строке. Вы получаете уникальное 128-разрядное значение в строке ASCII, акцентированной дефисами, как в этом примере.

$ uuidgen
39ED98FF-2900-441A-802F-9C398FC199D2

Затем, создайте область маркера с UUID, Вы генерировали для близости маркера UUID, определив главные и незначительные значения по мере необходимости. Обязательно также используйте уникальный идентификатор строки для новой области. Этот код показывает, как создать новую область маркера с помощью примера UUID выше.

   NSUUID *proximityUUID = [[NSUUID alloc]
      initWithUUIDString:@"39ED98FF-2900-441A-802F-9C398FC199D2"];
 
   // Create the beacon region.
   CLBeaconRegion *beaconRegion = [[CLBeaconRegion alloc]
      initWithProximityUUID:proximityUUID
                 identifier:@"com.mycompany.myregion"

Теперь, когда Вы создали область маркера, необходимо распространить близость маркера UUID (и любое главное или незначительное значение, которое Вы указали), использование CBPeripheralManager класс Ядра платформа Bluetooth. В Ядре Bluetooth периферийное устройство является устройством, распространяющим и совместно использующим данные с помощью низкой энергии Bluetooth. Распространение данных Вашего маркера является единственным способом, которым другие устройства могут обнаружить и расположиться Ваш маркер.

Для распространения периферийных данных в Ядре Bluetooth Вы вызываете startAdvertising: метод CBPeripheralManager класс на экземпляре a CBPeripheralManager объект. Этот метод ожидает словарь (экземпляр NSDictionary) из данных рекламы. Поскольку следующий пример показывает, используйте peripheralDataWithMeasuredPower: метод CLBeaconRegion класс для получения словаря, кодирующего информацию об идентификации маркера вместе с другой информацией, необходимой для Ядра Bluetooth для распространения маркера как периферийного устройства.

   // Create a dictionary of advertisement data.
   NSDictionary *beaconPeripheralData =
      [beaconRegion peripheralDataWithMeasuredPower:nil];

Затем, создайте экземпляр CBPeripheralManager класс, и просит, чтобы он распространил Ваш маркер для других устройств для обнаружения, как показано в коде ниже.

   // Create the peripheral manager.
   CBPeripheralManager *peripheralManager = [[CBPeripheralManager alloc]
      initWithDelegate:selfqueue:nil options:nil];
 
   // Start advertising your beacon's data.
   [peripheralManager startAdvertising:beaconPeripheralData];

После распространения Вашего приложения как маркер Ваше приложение должно продолжать работать на переднем плане для широковещательной передачи необходимых Сигналов Bluetooth. Если пользователь выходит из приложения, система прекращает распространять Ваше устройство как периферийное устройство.

Для получения дополнительной информации о том, как использовать периферийного менеджера для распространения данных с помощью низкой энергии Bluetooth, посмотрите Ссылку класса CBPeripheralManager и Ядро Руководство по программированию Bluetooth.

Тестирование Контрольной Поддержки Области приложения для iOS

При тестировании контрольного кода области в Средстве моделирования iOS или на устройстве, поймите, что события области могут сразу не произойти после того, как граница области пересечена. Для предотвращения побочных уведомлений iOS не поставляет уведомления области, пока не удовлетворяют условиям определенного порога. В частности расположение пользователя должно пересечь границу области, переехать от границы минимальным расстоянием и остаться на том минимальном расстоянии в течение по крайней мере 20 секунд, прежде чем сообщат об уведомлениях.

Определенные пороговые расстояния определяются аппаратными средствами и технологиями расположения, которые в настоящее время доступны. Например, если Wi-Fi отключен, контроль области значительно менее точен. Однако для тестирования можно предположить, что минимальное расстояние составляет приблизительно 200 метров.