Получить сообщения маяка

Ваше приложение может подписываться на сообщения маяка Bluetooth Low Energy (BLE), используя тот же механизм, который используется для подписки на сообщения, публикуемые другими устройствами поблизости.

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

Чтобы подписаться на маяки, установите параметр deviceTypesToDiscover на kGNSDeviceBLEBeacon в параметрах подписки. Следующий фрагмент демонстрирует, как это сделать:

Objective-C

id<GNSSubscription> beaconSubscription = [messageManager
    subscriptionWithMessageFoundHandler:myMessageFoundHandler
                     messageLostHandler:myMessageLostHandler
                            paramsBlock:^(GNSSubscriptionParams *params) {
                              params.deviceTypesToDiscover = kGNSDeviceBLEBeacon;
                            }];

Быстрый

let beaconSubscription = messageManager.subscriptionWithMessageFoundHandler(
    myMessageFoundHandler, messageLostHandler: myMessageLostHandler,
    paramsBlock: { (params: GNSSubscriptionParams!) in
      params.deviceTypesToDiscover = .BLEBeacon
    })

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

Objective-C

id<GNSSubscription> beaconSubscription = [messageManager
    subscriptionWithMessageFoundHandler:myMessageFoundHandler
                     messageLostHandler:myMessageLostHandler
                            paramsBlock:^(GNSSubscriptionParams *params) {
                              params.deviceTypesToDiscover = kGNSDeviceBLEBeacon;
                              params.messageNamespace = @"com.mycompany.mybeaconservice";
                              params.type = @"mybeacontype";
                            }];

Быстрый

let beaconSubscription = messageManager.subscriptionWithMessageFoundHandler(
    myMessageFoundHandler, messageLostHandler: myMessageLostHandler,
    paramsBlock: { (params: GNSSubscriptionParams!) in
      params.deviceTypesToDiscover = .BLEBeacon
      params.messageNamespace = "com.mycompany.mybeaconservice"
      params.type = "mybeacontype"
    })

По умолчанию подписка на маяк сканирует оба типа маяков, Eddystone и iBeacon. Когда сканирование iBeacon включено, пользователям будет предложено дать разрешение приложению использовать данные о своем местоположении. Info.plist вашего приложения должен включать ключ NSLocationWhenInUseUsageDescription с кратким объяснением того, почему используется местоположение. Подробности см. в документации Apple .

Если вы хотите сканировать только маяки Eddystone, вы можете отключить сканирование iBeacon в GNSBeaconStrategy , и iOS не будет спрашивать у пользователя разрешение на использование местоположения. Следующий фрагмент показывает, как отключить сканирование iBeacon для исходной подписки выше:

Objective-C

id<GNSSubscription> beaconSubscription = [messageManager
    subscriptionWithMessageFoundHandler:myMessageFoundHandler
                     messageLostHandler:myMessageLostHandler
                            paramsBlock:^(GNSSubscriptionParams *params) {
                              params.deviceTypesToDiscover = kGNSDeviceBLEBeacon;
                              params.beaconStrategy =
                                  [GNSBeaconStrategy strategyWithParamsBlock:^(GNSBeaconStrategyParams *params) {
                                    params.includeIBeacons = NO;
                                  };
                            }];

Быстрый

let beaconSubscription = messageManager.subscriptionWithMessageFoundHandler(
    myMessageFoundHandler, messageLostHandler: myMessageLostHandler,
    paramsBlock: { (params: GNSSubscriptionParams!) in
      params.deviceTypesToDiscover = .BLEBeacon
      params.beaconStrategy =
          GNSBeaconStrategy(paramsBlock: { (params: GNSBeaconStrategyParams!) in
            params.includeIBeacons = false
          })
    })

По умолчанию включено сканирование с низким энергопотреблением, что иногда может приводить к большим задержкам при поиске маяков Eddystone. Когда режим низкого энергопотребления отключен, для поиска маяков Eddystone используется сканирование iBeacon, что может сократить эти задержки. Однако это приводит к большему использованию батареи, и iOS будет запрашивать у пользователя разрешение на использование местоположения.

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

Objective-C

id<GNSSubscription> beaconSubscription = [messageManager
    subscriptionWithMessageFoundHandler:myMessageFoundHandler
                     messageLostHandler:myMessageLostHandler
                            paramsBlock:^(GNSSubscriptionParams *params) {
                              params.deviceTypesToDiscover = kGNSDeviceBLEBeacon;
                              params.beaconStrategy =
                                  [GNSBeaconStrategy strategyWithParamsBlock:^(GNSBeaconStrategyParams *params) {
                                    params.includeIBeacons = NO;
                                    params.lowPowerPreferred = NO;
                                  };
                            }];

Быстрый

let beaconSubscription = messageManager.subscriptionWithMessageFoundHandler(
    myMessageFoundHandler, messageLostHandler: myMessageLostHandler,
    paramsBlock: { (params: GNSSubscriptionParams!) in
      params.deviceTypesToDiscover = .BLEBeacon
      params.beaconStrategy =
          GNSBeaconStrategy(paramsBlock: { (params: GNSBeaconStrategyParams!) in
            params.includeIBeacons = false
            params.lowPowerPreferred = false
          })
    })

При сканировании iBeacons диалогу разрешения местоположения iOS предшествует диалог разрешения Nearby. Если вы хотите переопределить этот диалог (например, чтобы предоставить «предполетный» диалог, объясняющий, почему требуется разрешение местоположения), установите permissionRequestHandler в пользовательский блок в параметрах подписки. В следующем фрагменте показано, как это сделать:

Objective-C

id<GNSSubscription> beaconSubscription = [messageManager
    subscriptionWithMessageFoundHandler:myMessageFoundHandler
                     messageLostHandler:myMessageLostHandler
                            paramsBlock:^(GNSSubscriptionParams *params) {
                              params.deviceTypesToDiscover = kGNSDeviceBLEBeacon;
                              params.permissionRequestHandler = ^(GNSPermissionHandler permissionHandler) {
                                // Show your custom dialog here, and don't forget to call permissionHandler after it is dismissed
                                permissionHandler(userGavePermission);
                              };
                            }];

Быстрый

let beaconSubscription = messageManager.subscriptionWithMessageFoundHandler(
    myMessageFoundHandler, messageLostHandler: myMessageLostHandler,
    paramsBlock: { (params: GNSSubscriptionParams!) in
      params.deviceTypesToDiscover = .BLEBeacon
      params.permissionRequestHandler = { (permissionHandler: GNSPermissionHandler!) in
        // Show your custom dialog here, and don't forget to call permissionHandler after it is dismissed
        permissionHandler(userGavePermission);
      }
    })

Фоновое сканирование

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

  • Для фонового BLE есть дополнительная стоимость батареи. Стоимость низкая, но вы должны измерить ее, прежде чем решить использовать фоновый режим.
  • iOS запросит у пользователя разрешение на использование данных о местоположении в фоновом режиме, если включено сканирование iBeacon или отключен режим низкого энергопотребления.

Чтобы включить сканирование маяков в фоновом режиме, выполните следующие дополнительные действия:

  • Включите фоновый режим для вашей подписки, передав правильно настроенный объект GNSBeaconStrategy . Следующий фрагмент показывает, как это сделать:

    Objective-C

    id<GNSSubscription> beaconSubscription = [messageManager
        subscriptionWithMessageFoundHandler:myMessageFoundHandler
                         messageLostHandler:myMessageLostHandler
                                paramsBlock:^(GNSSubscriptionParams *params) {
                                  params.deviceTypesToDiscover = kGNSDeviceBLEBeacon;
                                  params.beaconStrategy = [GNSBeaconStrategy
                                      strategyWithParamsBlock:^(GNSBeaconStrategyParams *params) {
                                        params.allowInBackground = YES;
                                      }];
                                }];
    

    Быстрый

    let beaconSubscription = messageManager.subscriptionWithMessageFoundHandler(
        myMessageFoundHandler, messageLostHandler: myMessageLostHandler,
        paramsBlock: { (params: GNSSubscriptionParams!) in
          params.deviceTypesToDiscover = .BLEBeacon
          params.beaconStrategy =
              GNSBeaconStrategy(paramsBlock: { (params: GNSBeaconStrategyParams!) in
                params.allowInBackground = true
              })
        })
    

  • Добавьте необходимые записи в Info.plist вашего приложения:

    • Записи UIBackgroundModes :

      • bluetooth-central для сканирования BLE в фоновом режиме.
      • location для сканирования iBeacon в фоновом режиме с использованием режима высокой мощности. Вы можете пропустить это, если вы выполняете сканирование с низкой мощностью только для маяков Eddystone.
    • NSLocationAlwaysUsageDescription строка, описывающая, почему вы будете отслеживать местоположение пользователя в фоновом режиме. Например, «Ваше местоположение необходимо для сканирования маяков в фоновом режиме». Подробности см. в документации Apple . Вы можете пропустить это, если вы выполняете сканирование с низким энергопотреблением только для маяков Eddystone.

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

    • Сохраняйте значение фонового режима в NSUserDefaults всякий раз, когда пользователь его изменяет.
    • При запуске прочитайте его из NSUserDefaults и восстановите подписку на маяк, если включен фоновый режим.

Фоновые уведомления

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