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