Seu app pode se inscrever em mensagens de beacon Bluetooth Low Energy (BLE) usando o mesmo mecanismo usado para se inscrever em mensagens publicadas por outros dispositivos próximos.
Por padrão, as assinaturas de beacon funcionam apenas quando o app está em primeiro plano. Quando o app passa para o segundo plano, as assinaturas interrompem automaticamente a busca por beacons. Consulte Verificação em segundo plano para mais detalhes sobre como ativar a verificação em segundo plano.
Para se inscrever em beacons, defina o parâmetro deviceTypesToDiscover como kGNSDeviceBLEBeacon nos parâmetros de assinatura. O snippet a seguir 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 desses beacons. 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 poderá 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, uma assinatura de beacon verifica os dois tipos de beacons, Eddystone e iBeacon. Quando a verificação do iBeacon está ativada, os usuários recebem uma solicitação de permissão para que o app use os dados de localização. O Info.plist do app precisa incluir a chave NSLocationWhenInUseUsageDescription com uma breve explicação de por que a localização está sendo usada. Consulte
a documentação da Apple
para mais detalhes.
Se você quiser verificar apenas beacons Eddystone, poderá desativar a verificação do iBeacon no GNSBeaconStrategy, e 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 potência está ativada, o que às vezes pode resultar em grandes latências ao encontrar beacons Eddystone. Quando o modo de baixo consumo está desativado, a verificação do iBeacon é usada para ajudar a encontrar beacons Eddystone, o que pode 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 baixo consumo ao verificar beacons 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 "Por perto". Se você quiser substituir essa caixa de diálogo (por exemplo, para fornecer uma caixa de diálogo "pré-voo" que explique por que a permissão de localização é necessária), defina o 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);
}
})
Verificação em segundo plano
Como a verificação de beacon usa BLE, ela pode funcionar em segundo plano. Confira algumas coisas que você precisa saber ao decidir usar o modo em segundo plano:
- Há um custo de bateria adicional para o BLE em segundo plano. O custo é baixo, mas você precisa medi-lo 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 o modo de baixo consumo estiver desativado.
Para ativar a verificação de beacon em segundo plano, siga estas etapas adicionais:
Ative o modo em segundo plano para sua assinatura transmitindo um objeto
GNSBeaconStrategyconfigurado 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.plistdo app:Entradas
UIBackgroundModes:bluetooth-centralpara verificação de BLE em segundo plano.locationpara verificação do iBeacon em segundo plano usando o modo de alta potência. Você pode omitir isso se estiver fazendo a verificação de baixa potência apenas para beacons Eddystone.
String
NSLocationAlwaysUsageDescriptiondescrevendo por que você vai rastrear a localização do usuário em segundo plano. Por exemplo, "Sua localização é necessária para verificar beacons em segundo plano". Consulte a documentação da Apple para mais detalhes. Você pode omitir isso se estiver fazendo a verificação de baixa potência apenas para beacons Eddystone.
O usuário pode ativar ou desativar a verificação em segundo plano no seu app? Se sim, salve o valor do modo em segundo plano em
NSUserDefaults, porque o iOS pode encerrar o app a qualquer momento enquanto ele estiver em segundo plano. O app precisa fazer o seguinte:- Salve o valor do modo em segundo plano em
NSUserDefaultssempre que o usuário o alterar. - Na inicialização, leia o valor de
NSUserDefaultse restaure a assinatura de beacon se o modo em segundo plano estiver ativado.
- Salve o valor do modo em segundo plano em
Notificações em segundo plano
Se você quiser que o app notifique o usuário quando beacons forem descobertos em segundo plano, use notificações locais. Para mais detalhes, consulte Notificações em segundo plano.