Seu app pode se inscrever em mensagens de beacon do Bluetooth de baixa energia (BLE) usando o mesmo mecanismo usado para se inscrever em mensagens publicadas por outros dispositivos próximos.
Por padrão, as assinaturas de sensores só funcionam quando o app está em primeiro plano. Quando seu app vai para o segundo plano, as assinaturas param automaticamente de procurar beacons. Consulte Verificação em segundo plano para ver detalhes sobre como ativar esse recurso.
Para se inscrever em beacons, defina o parâmetro deviceTypesToDiscover
como kGNSDeviceBLEBeacon
. O snippet abaixo
demonstra como fazer isso:
Objective-C
id<GNSSubscription> beaconSubscription = [messageManager
subscriptionWithMessageFoundHandler:myMessageFoundHandler
messageLostHandler:myMessageLostHandler
paramsBlock:^(GNSSubscriptionParams *params) {
params.deviceTypesToDiscover = kGNSDeviceBLEBeacon;
}];
Swift
let beaconSubscription = messageManager.subscriptionWithMessageFoundHandler(
myMessageFoundHandler, messageLostHandler: myMessageLostHandler,
paramsBlock: { (params: GNSSubscriptionParams!) in
params.deviceTypesToDiscover = .BLEBeacon
})
A assinatura acima só descobre beacons pertencentes ao seu projeto e recebe todas as mensagens deles. Se você quiser receber mensagens de beacons registrados com um namespace diferente, transmita um namespace nos parâmetros de assinatura. Da mesma forma, se você quiser um tipo específico de mensagem, também pode transmitir um tipo de mensagem para filtragem. O snippet a seguir mostra como fazer isso:
Objective-C
id<GNSSubscription> beaconSubscription = [messageManager
subscriptionWithMessageFoundHandler:myMessageFoundHandler
messageLostHandler:myMessageLostHandler
paramsBlock:^(GNSSubscriptionParams *params) {
params.deviceTypesToDiscover = kGNSDeviceBLEBeacon;
params.messageNamespace = @"com.mycompany.mybeaconservice";
params.type = @"mybeacontype";
}];
Swift
let beaconSubscription = messageManager.subscriptionWithMessageFoundHandler(
myMessageFoundHandler, messageLostHandler: myMessageLostHandler,
paramsBlock: { (params: GNSSubscriptionParams!) in
params.deviceTypesToDiscover = .BLEBeacon
params.messageNamespace = "com.mycompany.mybeaconservice"
params.type = "mybeacontype"
})
Por padrão, a assinatura de um sensor procura os dois tipos, Eddystone e iBeacon. Quando a verificação de iBeacon está ativada, os usuários são solicitados a dar permissão para que o app use os dados de local deles. O Info.plist
do app precisa
incluir a chave NSLocationWhenInUseUsageDescription
com uma breve explicação do
motivo de uso da localização. Consulte a
documentação da Apple
para mais detalhes.
Se você quiser verificar apenas beacons Eddystone, desative a verificação de iBeacon no GNSBeaconStrategy
. Assim, o iOS não vai pedir permissão ao usuário para usar a localização. O snippet a seguir mostra como desativar a verificação do iBeacon para a assinatura original acima:
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;
};
}];
Swift
let beaconSubscription = messageManager.subscriptionWithMessageFoundHandler(
myMessageFoundHandler, messageLostHandler: myMessageLostHandler,
paramsBlock: { (params: GNSSubscriptionParams!) in
params.deviceTypesToDiscover = .BLEBeacon
params.beaconStrategy =
GNSBeaconStrategy(paramsBlock: { (params: GNSBeaconStrategyParams!) in
params.includeIBeacons = false
})
})
Por padrão, a verificação de baixa energia está ativada, o que às vezes pode resultar em grandes latências ao encontrar sensores Eddystone. Quando o modo de baixa energia está desativado, a verificação do iBeacon é usada para ajudar a encontrar beacons Eddystone, que podem reduzir essas latências. No entanto, isso resulta em maior uso da bateria, e o iOS vai pedir permissão ao usuário para usar a localização.
O snippet a seguir mostra como desativar o modo de baixa energia ao procurar por sensores 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;
};
}];
Swift
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
})
})
Ao verificar iBeacons, a caixa de diálogo de permissão de localização do iOS é precedida pela
caixa de diálogo de permissão do Nearby. Se você quiser substituir essa caixa de diálogo (por
exemplo, para fornecer uma caixa de diálogo de "simulação" que explique por que a permissão de localização
é necessária), defina permissionRequestHandler
como um bloco personalizado nos
parâmetros de assinatura. O snippet a seguir mostra como fazer isso:
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);
};
}];
Swift
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);
}
})
Varredura em segundo plano
Como a verificação de sensores usa BLE, ela pode funcionar em segundo plano. Confira alguns fatores que você precisa considerar ao decidir usar o modo em segundo plano:
- O custo da bateria é extra para o BLE em segundo plano. O custo é baixo, mas é necessário medir antes de decidir usar o modo em segundo plano.
- O iOS vai pedir permissão ao usuário para usar a localização em segundo plano se a verificação do iBeacon estiver ativada ou se o modo de baixo consumo de energia estiver desativado.
Para ativar a leitura de sensores em segundo plano, siga estas etapas:
Ative o modo de segundo plano para sua assinatura transmitindo um objeto
GNSBeaconStrategy
configurado corretamente. O snippet a seguir mostra como fazer isso: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; }]; }];
Swift
let beaconSubscription = messageManager.subscriptionWithMessageFoundHandler( myMessageFoundHandler, messageLostHandler: myMessageLostHandler, paramsBlock: { (params: GNSSubscriptionParams!) in params.deviceTypesToDiscover = .BLEBeacon params.beaconStrategy = GNSBeaconStrategy(paramsBlock: { (params: GNSBeaconStrategyParams!) in params.allowInBackground = true }) })
Adicione as entradas necessárias ao
Info.plist
do seu app:UIBackgroundModes
entradas:bluetooth-central
para verificação de BLE em segundo plano.location
para leitura de iBeacon em segundo plano usando o modo de alta energia. Você poderá omitir isso se estiver fazendo varreduras de baixa energia apenas para sensores Eddystone.
String
NSLocationAlwaysUsageDescription
que descreve por que você vai rastrear a localização do usuário em segundo plano. Por exemplo: "Sua localização é necessária para procurar sensores em segundo plano". Consulte a documentação da Apple para mais detalhes. Você poderá omitir isso se estiver fazendo varreduras de baixa energia apenas para beacons Eddystone.
O usuário pode ativar ou desativar a verificação em segundo plano no app? Nesse caso, salve o valor do modo de segundo plano em
NSUserDefaults
, porque o iOS pode encerrar seu app a qualquer momento enquanto ele estiver em segundo plano. Seu app precisa fazer o seguinte:- Salve o valor do modo de segundo plano em
NSUserDefaults
sempre que ele for alterado pelo usuário. - Na inicialização, leia o comando
NSUserDefaults
e restaure a assinatura do sensor se o modo em segundo plano estiver ativado.
- Salve o valor do modo de segundo plano em
Notificações em segundo plano
Se você quiser que seu app notifique o usuário quando beacons forem descobertos em segundo plano, use as notificações locais. Para mais detalhes, consulte notificações em segundo plano.