Receber mensagens de beacon

O app pode se inscrever em mensagens de beacons do Bluetooth de baixa energia (BLE, na sigla em inglês) usando o mesmo mecanismo usado para se inscrever em mensagens publicadas por outros dispositivos próximos.

Por padrão, as assinaturas de beacons só funcionam quando o app está em primeiro plano. Quando o app é movido para o segundo plano, as assinaturas param automaticamente de procurar beacons. Consulte Verificação em segundo plano para mais detalhes sobre como ativar a verificação em segundo plano.

Para assinar 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 é possível 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 de iBeacon estiver ativada, os usuários vão receber uma solicitação para conceder permissão ao app para usar os dados de local. A 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, desative a verificação de iBeacon no GNSBeaconStrategy. 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 de 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 é ativada, o que às vezes pode resultar em latências altas ao encontrar beacons Eddystone. Quando o modo de baixo consumo está desativado, a verificação de 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 ao usuário permissão para usar a localização.

O snippet a seguir mostra como desativar o modo de baixo consumo ao procurar 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 detectar iBeacons, a caixa de diálogo de permissão de localização do iOS é precedida pela caixa de diálogo de permissão do app "Perto de você". 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 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 beacons usa BLE, ela pode funcionar em segundo plano. Confira alguns pontos que você precisa considerar ao decidir usar o modo em segundo plano:

  • Há um custo de bateria extra para 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 de iBeacon estiver ativada ou o modo de baixo consumo estiver desativado.

Para ativar a leitura de beacons 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 app:

    • UIBackgroundModes entradas:

      • bluetooth-central para a verificação de BLE em segundo plano.
      • location para a detecção de iBeacon em segundo plano usando o modo de alta potência. Você pode omitir isso se estiver fazendo a verificação de baixo consumo de energia apenas para beacons 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 detectar 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 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 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 de segundo plano em NSUserDefaults sempre que o usuário mudar.
    • Na inicialização, leia-o em NSUserDefaults e restaure a assinatura do beacon se o modo de segundo plano estiver ativado.

Notificações em segundo plano

Se você quiser que o app notifique o usuário quando os beacons forem descobertos em segundo plano, use notificações locais. Para saber mais, consulte notificações em segundo plano.