Ricevere messaggi beacon

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

Per impostazione predefinita, le iscrizioni ai beacon funzionano solo quando l'app è in primo piano. Quando l'app passa in background, le iscrizioni interrompono automaticamente la ricerca dei beacon. Per informazioni dettagliate su come attivare la ricerca in background, consulta la sezione Ricerca in background.

Per iscriverti ai beacon, imposta il parametro deviceTypesToDiscover su kGNSDeviceBLEBeacon nei parametri di sottoscrizione. Lo snippet che segue mostra come eseguire questa operazione:

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 riportato sopra rileva solo i beacon di proprietà del tuo progetto e riceve tutti i messaggi da questi beacon. Se vuoi ricevere messaggi da beacon registrati con uno spazio dei nomi diverso, puoi passare uno spazio dei nomi nei parametri di sottoscrizione. Analogamente, se vuoi un tipo di messaggio specifico, puoi anche passare un tipo di messaggio per il filtro. Lo snippet seguente 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, una sottoscrizione beacon esegue la ricerca di entrambi i tipi di beacon, Eddystone e iBeacon. Quando la ricerca iBeacon è attiva, agli utenti viene chiesto di dare all'app l'autorizzazione a utilizzare i dati sulla posizione. Il file Info.plist della tua app deve includere la chiave NSLocationWhenInUseUsageDescription con una breve spiegazione del motivo per cui viene utilizzata la posizione. Per ulteriori dettagli, consulta la documentazione di Apple.

Se vuoi eseguire la ricerca solo di beacon Eddystone, puoi disattivare la ricerca di iBeacon in GNSBeaconStrategy e iOS non chiederà all'utente l'autorizzazione per l'utilizzo della posizione. Lo snippet seguente mostra come disattivare la ricerca di 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 ricerca a basso consumo, che a volte può comportare latenze elevate durante il rilevamento dei beacon Eddystone. Quando la modalità a basso consumo è disattivata, la scansione iBeacon viene utilizzata per trovare i beacon Eddystone, il che può ridurre queste latenze. Tuttavia, questo comporta un maggiore utilizzo della batteria e iOS chiederà all'utente l'autorizzazione per l'utilizzo della posizione.

Lo snippet seguente mostra come disattivare la modalità a basso consumo durante la ricerca di 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
          })
    })

Quando viene eseguita la ricerca di iBeacon, la finestra di dialogo di autorizzazione di accesso alla posizione di iOS è preceduta dalla finestra di dialogo di autorizzazione Nelle vicinanze. Se vuoi sostituire questa finestra di dialogo (ad esempio per fornire una finestra di dialogo di "preflight" che spieghi perché è necessaria l'autorizzazione di accesso alla posizione), imposta permissionRequestHandler su un blocco personalizzato nei parametri di abbonamento. 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.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 ricerca di beacon utilizza BLE, può funzionare in background. Ecco alcuni aspetti da tenere presente quando decidi di utilizzare la modalità in background:

  • Il BLE in background comporta 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 per utilizzare la posizione in background se la ricerca iBeacon è attivata o la modalità di risparmio energetico è disattivata.

Per attivare la ricerca di beacon in background:

  • Attiva la modalità in background per l'abbonamento passando un oggetto GNSBeaconStrategy configurato correttamente. Lo snippet seguente 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:

    • voci UIBackgroundModes:

      • bluetooth-central per la ricerca BLE in background.
      • location per la scansione iBeacon in background utilizzando la modalità ad alta potenza. Puoi omettere questo parametro se esegui la ricerca a basso consumo 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 eseguire la ricerca di beacon in background". Per ulteriori dettagli, consulta la documentazione di Apple. Puoi omettere questo parametro se esegui la ricerca in modalità a basso consumo solo per i beacon Eddystone.

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

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

Notifiche in background

Se vuoi che la tua app avvisi l'utente quando vengono rilevati i beacon in background, puoi utilizzare le notifiche locali. Per maggiori dettagli, vedi notifiche in background.