Receber mensagens de beacon

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.

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.