La tua app può abbonarsi ai messaggi dei 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, gli abbonamenti interrompono automaticamente la scansione dei beacon. Per informazioni dettagliate su come attivare la scansione in background, consulta Scansione in background.
Per abbonarti ai beacon, imposta il parametro deviceTypesToDiscover su kGNSDeviceBLEBeacon nei parametri di abbonamento. Il seguente snippet mostra come farlo:
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 sopra riportato 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 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 farlo:
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 file Info.plist della tua app deve includere la chiave NSLocationWhenInUseUsageDescription con una breve spiegazione del motivo per cui viene utilizzata la posizione. Per informazioni dettagliate, consulta la documentazione
di Apple.
Se vuoi scansionare solo i beacon Eddystone, puoi disattivare la scansione iBeacon in GNSBeaconStrategy e iOS non chiederà all'utente l'autorizzazione a utilizzare la posizione. Il seguente snippet mostra come disattivare la scansione iBeacon per l'abbonamento originale sopra riportato:
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, la scansione a basso consumo è attivata, il che a volte può comportare latenze elevate durante la ricerca 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, ciò comporta un maggiore utilizzo della batteria e iOS chiederà all'utente l'autorizzazione a utilizzare la posizione.
Il seguente snippet mostra come disattivare la modalità a basso consumo 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
})
})
Quando si esegue 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 di Nearby. Se vuoi sostituire 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 farlo:
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 BLE, può funzionare in background. Ecco alcuni aspetti da tenere presenti quando decidi di utilizzare la modalità in background:
- È previsto un costo aggiuntivo per la batteria per il BLE in background. Il costo è basso, ma devi 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à a basso consumo è disattivata.
Per attivare la scansione dei beacon in background, segui questi passaggi aggiuntivi:
Attiva la modalità in background per l'abbonamento passando un oggetto
GNSBeaconStrategyconfigurato correttamente. Il seguente snippet mostra come farlo: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 file
Info.plistdella tua app:Voci
UIBackgroundModes:bluetooth-centralper la scansione BLE in background.locationper la scansione iBeacon in background utilizzando la modalità ad alta potenza. Puoi omettere questo passaggio se esegui la scansione a basso consumo solo per i beacon Eddystone.
Stringa
NSLocationAlwaysUsageDescriptionche 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 informazioni dettagliate, consulta la documentazione di Apple. Puoi omettere questo passaggio se esegui la scansione a basso consumo solo per i beacon Eddystone.
L'utente può attivare o disattivare la scansione in background nella tua app? In caso affermativo, devi salvare il valore della modalità in background in
NSUserDefaultsperché iOS può chiudere la tua app in qualsiasi momento mentre è in background. La tua app deve:- Salvare il valore della modalità in background in
NSUserDefaultsogni volta che l'utente lo modifica. - All'avvio, leggerlo da
NSUserDefaultse ripristinare l'abbonamento ai beacon se la modalità in background è attivata.
- Salvare il valore della modalità in background in
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 informazioni dettagliate, consulta Notifiche in background.