Ваше приложение может подписаться на сообщения маяков 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 предваряется диалоговым окном запроса разрешения на определение местоположения поблизости. Если вы хотите переопределить это диалоговое окно (например, чтобы предоставить предварительное диалоговое окно, объясняющее, почему требуется разрешение на определение местоположения), установите параметр 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и восстановить подписку на маяк, если включен фоновый режим.
- Значение режима фоновой работы всегда сохраняется в переменной
Фоновые уведомления
Если вы хотите, чтобы ваше приложение уведомляло пользователя об обнаружении маяков в фоновом режиме, вы можете использовать локальные уведомления . Подробнее см. в разделе «Фоновые уведомления» .