Ihre App kann Bluetooth Low Energy (BLE) Beacon-Nachrichten über denselben Mechanismus abonnieren, der auch für das Abonnieren von Nachrichten verwendet wird, die von anderen Geräten in der Nähe veröffentlicht werden.
Standardmäßig funktionieren Beacon-Abos nur, wenn Ihre App im Vordergrund ausgeführt wird. Wenn Ihre App in den Hintergrund wechselt, wird die Suche nach Beacons automatisch beendet. Weitere Informationen zum Aktivieren der Suche im Hintergrund finden Sie unter Suche im Hintergrund für Details.
Wenn Sie Beacons abonnieren möchten, legen Sie den Parameter deviceTypesToDiscover in den Abo-Parametern auf kGNSDeviceBLEBeacon fest. Das folgende Snippet zeigt, wie das geht:
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
})
Mit dem oben genannten Abo werden nur Beacons ermittelt, die Ihrem Projekt gehören, und alle Nachrichten von diesen Beacons empfangen. Wenn Sie Nachrichten von Beacons empfangen möchten, die mit einem anderen Namespace registriert sind, können Sie in den Abo-Parametern einen Namespace übergeben. Wenn Sie eine bestimmte Art von Nachricht erhalten möchten, können Sie auch einen Nachrichtentyp zur Filterung übergeben. Das folgende Snippet zeigt, wie das geht:
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"
})
Standardmäßig werden bei einem Beacon-Abo beide Arten von Beacons gesucht: Eddystone und iBeacon. Wenn die iBeacon-Suche aktiviert ist, werden Nutzer aufgefordert, der App die Berechtigung zur Verwendung ihrer Standortdaten zu erteilen. Die Datei Info.plist Ihrer App muss den Schlüssel NSLocationWhenInUseUsageDescription mit einer kurzen Erklärung enthalten, warum der Standort verwendet wird. Weitere Informationen finden Sie in der
Dokumentation von Apple.
Wenn Sie nur nach Eddystone-Beacons suchen möchten, können Sie die iBeacon-Suche in GNSBeaconStrategy deaktivieren. iOS fordert den Nutzer dann nicht auf, die Berechtigung zur Verwendung des Standorts zu erteilen. Das folgende Snippet zeigt, wie Sie die iBeacon-Suche für das oben genannte ursprüngliche Abo deaktivieren:
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
})
})
Standardmäßig ist die Suche mit geringem Stromverbrauch aktiviert. Dies kann manchmal zu großen Latenzen beim Auffinden von Eddystone-Beacons führen. Wenn der Energiesparmodus deaktiviert ist, wird die iBeacon-Suche verwendet, um Eddystone-Beacons zu finden. Dadurch können diese Latenzen reduziert werden. Dies führt jedoch zu einem höheren Akkuverbrauch und iOS fordert den Nutzer auf, die Berechtigung zur Verwendung des Standorts zu erteilen.
Das folgende Snippet zeigt, wie Sie den Energiesparmodus deaktivieren, wenn Sie nach Eddystone-Beacons suchen.
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
})
})
Bei der Suche nach iBeacons wird dem iOS-Dialogfeld für die Berechtigung zur Standortermittlung das Dialogfeld für die Berechtigung für Geräte in der Nähe vorangestellt. Wenn Sie dieses Dialogfeld überschreiben möchten (z. B. um ein Dialogfeld vor dem Start zu präsentieren, in dem erklärt wird, warum die Berechtigung zur Standortermittlung erforderlich ist), legen Sie permissionRequestHandler in den Abo-Parametern auf einen benutzerdefinierten Block fest. Das folgende Snippet zeigt, wie das geht:
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);
}
})
Suche im Hintergrund
Da die Beacon-Suche BLE verwendet, kann sie im Hintergrund ausgeführt werden. Hier sind einige Dinge, die Sie beachten sollten, wenn Sie den Hintergrundmodus verwenden möchten:
- Für BLE im Hintergrund fallen zusätzliche Akkukosten an. Die Kosten sind gering, aber Sie sollten sie messen, bevor Sie sich für die Verwendung des Hintergrundmodus entscheiden.
- iOS fordert den Nutzer auf, die Berechtigung zur Verwendung des Standorts im Hintergrund zu erteilen, wenn die iBeacon-Suche aktiviert oder der Energiesparmodus deaktiviert ist.
So aktivieren Sie die Beacon-Suche im Hintergrund:
Aktivieren Sie den Hintergrundmodus für Ihr Abo, indem Sie ein ordnungsgemäß konfiguriertes
GNSBeaconStrategy-Objekt übergeben. Das folgende Snippet zeigt, wie das geht: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 }) })Fügen Sie der Datei
Info.plistIhrer App die erforderlichen Einträge hinzu:UIBackgroundModes-Einträge:bluetooth-centralfür die BLE-Suche im Hintergrund.locationfür die iBeacon-Suche im Hintergrund im Modus mit hohem Stromverbrauch. Sie können diesen Eintrag weglassen, wenn Sie nur mit geringem Stromverbrauch nach Eddystone-Beacons suchen.
NSLocationAlwaysUsageDescription-String, in dem beschrieben wird, warum Sie den Standort des Nutzers im Hintergrund erfassen. Beispiel: „Ihr Standort ist erforderlich, um im Hintergrund nach Beacons zu suchen.“ Weitere Informationen finden Sie in der Dokumentation von Apple. Sie können diesen Eintrag weglassen, wenn Sie nur mit geringem Stromverbrauch nach Eddystone-Beacons suchen.
Kann der Nutzer die Suche im Hintergrund in Ihrer App aktivieren oder deaktivieren? Wenn ja, sollten Sie den Wert für den Hintergrundmodus in
NSUserDefaultsspeichern, da iOS Ihre App jederzeit beenden kann, wenn sie im Hintergrund ausgeführt wird. Ihre App sollte Folgendes tun:- Speichern Sie den Wert für den Hintergrundmodus in
NSUserDefaults, wenn der Nutzer ihn ändert. - Lesen Sie ihn beim Start aus
NSUserDefaultsund stellen Sie das Beacon-Abo wieder her, wenn der Hintergrundmodus aktiviert ist.
- Speichern Sie den Wert für den Hintergrundmodus in
Benachrichtigungen im Hintergrund
Wenn Ihre App den Nutzer benachrichtigen soll, wenn Beacons im Hintergrund gefunden werden, können Sie lokale Benachrichtigungenverwenden. Weitere Informationen finden Sie unter Benachrichtigungen im Hintergrund.