O app pode assinar mensagens de beacon do Bluetooth de baixa energia (BLE) usando o mesmo mecanismo usado para se inscrever em mensagens publicadas pela ou outros dispositivos por perto.
Por padrão, as assinaturas de beacon só funcionam quando o app está em primeiro plano. Quando seu app for para o segundo plano, as assinaturas serão interrompidas automaticamente em busca de sensores. Consulte Verificação em segundo plano para detalhes sobre como ativar a verificação em segundo plano.
Para se inscrever nos 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 do seu projeto e recebe todas as mensagens desses beacons. Se você quer receber mensagens de registrados com um namespace diferente, é possível passar um namespace no parâmetros de assinatura. Da mesma forma, se você quiser um tipo específico de mensagem, também podem transmitir um tipo de mensagem para filtragem. O snippet a seguir mostra como faça isto:
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 sensor verifica se há dois tipos de sensores: Eddystone e
iBeacon. Quando a verificação do iBeacon está ativada, os usuários recebem
permissão para que o app use os dados de local. A Info.plist
do app precisa
inclua a chave NSLocationWhenInUseUsageDescription
com uma breve explicação
por que a localização está sendo usada. Consulte
Documentação da Apple
para mais detalhes.
Para procurar apenas sensores Eddystone, você poderá desativar o iBeacon
no GNSBeaconStrategy
, e o iOS não vai pedir ao usuário
permissão para usar a localização. O snippet a seguir mostra como desativar o iBeacon
para verificar 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 pode resultar latências ao encontrar sensores Eddystone. Quando o modo de baixo consumo de energia está desativado, A leitura com iBeacon é usada para ajudar a encontrar sensores Eddystone, que podem reduzir esses latências diferentes. No entanto, isso resulta em um maior uso da bateria, e o iOS solicitará o permissão para usar a localização.
O snippet a seguir mostra como desativar o modo de baixo consumo de energia ao procurar 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 procurar iBeacons, a caixa de diálogo da permissão de localização do iOS é precedida por
a caixa de diálogo de permissão do Nearby. Se você quiser substituir essa caixa de diálogo (por
instância, para fornecer uma "simulação" caixa de diálogo que explica por que a permissão de localização
for necessário), defina permissionRequestHandler
como um bloco personalizado na
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 coisas que você deve considerar ao decidir usar o modo de segundo plano:
- Há um custo de bateria adicional para o BLE em segundo plano. O custo é baixo, mas você deve medi-la antes de decidir usar o modo de segundo plano.
- O iOS vai pedir permissão ao usuário para usar a localização em segundo plano se A leitura do iBeacon está ativada ou o modo de baixo consumo de energia está desativado.
Para ativar a verificação de sensores em segundo plano, siga estas etapas adicionais:
Ative o modo de segundo plano para sua assinatura transmitindo um objeto
GNSBeaconStrategy
configurado. 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 app:UIBackgroundModes
entradas:bluetooth-central
para verificação de BLE em segundo plano.location
para leitura do iBeacon em segundo plano usando o modo de alta energia. Você pode omitir essa informação se estiver fazendo uma leitura de baixa energia do Eddystone beacons.
String
NSLocationAlwaysUsageDescription
descrevendo o motivo do acompanhamento a localização do usuário em segundo plano. Por exemplo, "Seu local é para procurar sensores em segundo plano". Consulte Documentação da Apple para mais detalhes. Você pode omitir isso se estiver fazendo buscas de baixa energia Apenas sensores Eddystone.
O usuário pode ativar ou desativar a verificação em segundo plano no app? Nesse caso, precisa salvar o valor do modo de segundo plano como
NSUserDefaults
porque o iOS pode encerrar seu app a qualquer momento enquanto ele está em segundo plano. Seu app precisa fazer o seguintes:- Salve o valor do modo de segundo plano em
NSUserDefaults
sempre que o usuário a alterar. - Na inicialização, leia pelo
NSUserDefaults
e restaure o beacon assinatura se o modo de segundo plano estiver ativado.
- Salve o valor do modo de segundo plano em
Notificações em segundo plano
Se você quiser que seu aplicativo notifique o usuário quando sensores forem descobertos enquanto em segundo plano, você pode usar notificações locais. Para mais detalhes, consulte notificações em segundo plano.