Ihre App kann Bluetooth Low Energy (BLE) Beacon-Nachrichten mit demselben 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 sich Ihre App im Vordergrund befindet. Wenn Ihre App in den Hintergrund wechselt, wird die Suche nach Beacons automatisch beendet. Weitere Informationen zum Aktivieren der Hintergrundsuche finden Sie unter Hintergrundsuche 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 wünschen, können Sie auch einen Nachrichtentyp zum Filtern ü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 führen, wenn Eddystone-Beacons gesucht werden. 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 Dialogfeld für die iOS-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);
}
})
Hintergrundsuche
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 die Suche mit geringem Stromverbrauch für Eddystone-Beacons verwenden.
NSLocationAlwaysUsageDescription-String, der beschreibt, 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 die Suche mit geringem Stromverbrauch für Eddystone-Beacons verwenden.
Kann der Nutzer die Hintergrundsuche 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
Hintergrundbenachrichtigungen
Wenn Ihre App den Nutzer benachrichtigen soll, wenn Beacons im Hintergrund erkannt werden, können Sie lokale Benachrichtigungen verwenden. Weitere Informationen finden Sie unter Hintergrundbenachrichtigungen.