Ricevere messaggi beacon

La tua app può abbonarsi ai messaggi beacon Bluetooth Low Energy (BLE) utilizzando lo stesso meccanismo utilizzato per abbonarsi ai messaggi pubblicati da altri dispositivi nelle vicinanze.

Per impostazione predefinita, gli abbonamenti ai beacon funzionano solo quando l'app è in primo piano. Quando l'app passa in background, le scansioni dei beacon vengono interrotte automaticamente. Consulta la sezione Scansione in background per informazioni dettagliate su come attivare la scansione in background.

Per abbonarti ai beacon, imposta il parametro deviceTypesToDiscover su kGNSDeviceBLEBeacon nei parametri di abbonamento. Il seguente snippet mostra come procedere:

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
    })

L'abbonamento precedente rileva solo i beacon di proprietà del tuo progetto e riceve tutti i messaggi da questi beacon. Se vuoi ricevere messaggi dai beacon registrati con uno spazio dei nomi diverso, puoi passare uno spazio dei nomi nei parametri di abbonamento. Allo stesso modo, se vuoi un tipo specifico di messaggio, puoi anche passare un tipo di messaggio per il filtro. Il seguente snippet mostra come eseguire questa operazione:

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"
    })

Per impostazione predefinita, un abbonamento ai beacon esegue la scansione di entrambi i tipi di beacon, Eddystone e iBeacon. Quando la scansione iBeacon è attivata, agli utenti verrà chiesto di concedere l'autorizzazione all'app per utilizzare i dati sulla posizione. Il Info.plist della tua app deve includere la chiave NSLocationWhenInUseUsageDescription con una breve spiegazione del motivo per cui viene utilizzata la posizione. Per maggiori dettagli, consulta la documentazione di Apple.

Se vuoi eseguire la scansione solo per i beacon Eddystone, puoi disattivare la scansione iBeacon in GNSBeaconStrategy e iOS non chiederà all'utente l'autorizzazione a utilizzare la posizione. Lo snippet seguente mostra come disattivare la scansione iBeacon per l'abbonamento originale riportato sopra:

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
          })
    })

Per impostazione predefinita, è attivata la scansione a basso consumo energetico, che a volte può comportare latenze elevate durante la ricerca dei beacon Eddystone. Quando la modalità Risparmio energetico è disattivata, la scansione iBeacon viene utilizzata per trovare i beacon Eddystone, il che può ridurre queste latenze. Tuttavia, ciò comporta un maggiore utilizzo della batteria e iOS chiederà all'utente l'autorizzazione per utilizzare la posizione.

Lo snippet seguente mostra come disattivare la modalità di risparmio energetico durante la scansione dei beacon 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
          })
    })

Durante la scansione di iBeacon, la finestra di dialogo per l'autorizzazione di accesso alla posizione di iOS è preceduta dalla finestra di dialogo per l'autorizzazione Dispositivi nelle vicinanze. Se vuoi ignorare questa finestra di dialogo (ad esempio, per fornire una finestra di dialogo "preflight" che spiega perché è necessaria l'autorizzazione di accesso alla posizione), imposta permissionRequestHandler su un blocco personalizzato nei parametri di abbonamento. Il seguente snippet mostra come procedere:

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);
      }
    })

Scansione in background

Poiché la scansione dei beacon utilizza il Bluetooth Low Energy, può funzionare in background. Ecco alcuni aspetti da tenere presente quando decidi di utilizzare la modalità in background:

  • Per il Bluetooth Low Energy in background è previsto un costo aggiuntivo per la batteria. Il costo è basso, ma dovresti misurarlo prima di decidere di utilizzare la modalità in background.
  • iOS chiederà all'utente l'autorizzazione a utilizzare la posizione in background se la scansione iBeacon è attivata o la modalità Risparmio energetico è disattivata.

Per attivare la scansione dei beacon in background, segui questi passaggi aggiuntivi:

  • Attiva la modalità background per l'abbonamento passando un oggetto GNSBeaconStrategy configurato correttamente. Il seguente snippet mostra come eseguire questa operazione:

    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
              })
        })
    

  • Aggiungi le voci richieste al Info.plist della tua app:

    • UIBackgroundModes voci:

      • bluetooth-central per la scansione BLE in background.
      • location per la scansione iBeacon in background utilizzando la modalità ad alta potenza. Puoi ometterlo se esegui la scansione a basso consumo energetico solo per i beacon Eddystone.
    • Stringa NSLocationAlwaysUsageDescription che descrive il motivo per cui monitorerai la posizione dell'utente in background. Ad esempio, "La tua posizione è necessaria per la scansione dei beacon in background". Per maggiori dettagli, consulta la documentazione di Apple. Puoi ometterlo se esegui la scansione a basso consumo energetico solo per i beacon Eddystone.

  • L'utente può attivare o disattivare la scansione in background nella tua app? In questo caso, devi salvare il valore della modalità in background in NSUserDefaults perché iOS può chiudere la tua app in qualsiasi momento mentre è in background. La tua app deve:

    • Salva il valore della modalità in background in NSUserDefaults ogni volta che l'utente lo modifica.
    • All'avvio, leggilo da NSUserDefaults e ripristina l'abbonamento ai beacon se la modalità in background è attiva.

Notifiche in background

Se vuoi che la tua app invii una notifica all'utente quando vengono rilevati beacon in background, puoi utilizzare le notifiche locali. Per maggiori dettagli, vedi notifiche in background.