Ihre App kann BLE-Beacon-Nachrichten (Bluetooth Low Energy) über denselben Mechanismus abonnieren, der auch zum 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 verschoben wird, wird die Suche nach Beacons automatisch beendet. Weitere Informationen zum Aktivieren der Suche im Hintergrund finden Sie unter Suche im Hintergrund.
Wenn Sie Beacons abonnieren möchten, legen Sie den Parameter deviceTypesToDiscover
in den Abonnierungsparametern 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 erkannt, 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 einen Namespace in den Abonnierungsparametern übergeben. Wenn Sie einen bestimmten Nachrichtentyp 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 sowohl Eddystone- als auch iBeacon-Beacons gescannt. Wenn das iBeacon-Scanning aktiviert ist, werden Nutzer aufgefordert, der App die Berechtigung zur Verwendung ihrer Standortdaten zu erteilen. Die 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 das iBeacon-Scanning in der GNSBeaconStrategy
deaktivieren. iOS fragt den Nutzer dann nicht um die Erlaubnis, den Standort zu verwenden. Das folgende Snippet zeigt, wie das iBeacon-Scanning für das ursprüngliche Abo oben deaktiviert wird:
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 das Scannen mit geringem Stromverbrauch aktiviert, was manchmal zu großen Latenzen beim Auffinden von Eddystone-Beacons führen kann. Wenn der Energiesparmodus deaktiviert ist, wird das iBeacon-Scanning verwendet, um Eddystone-Beacons zu finden. Dadurch können diese Latenzen reduziert werden. Dies führt jedoch zu einem höheren Akkuverbrauch und iOS fragt den Nutzer nach der Berechtigung zur Verwendung des Standorts.
Das folgende Snippet zeigt, wie der Energiesparmodus deaktiviert wird, wenn nach Eddystone-Beacons gesucht wird.
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
})
})
Beim Scannen nach iBeacons wird dem iOS-Berechtigungsdialog für den Standort der Berechtigungsdialog für Geräte in der Nähe vorangestellt. Wenn Sie diesen Dialog überschreiben möchten (z. B. um einen „Preflight“-Dialog zu präsentieren, in dem erklärt wird, warum die Standortberechtigung erforderlich ist), legen Sie permissionRequestHandler
in den Aboparametern 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);
}
})
Scannen im Hintergrund
Da beim Beacon-Scanning BLE verwendet wird, kann es im Hintergrund ausgeführt werden. Hier sind einige Dinge, die Sie beachten sollten, wenn Sie sich für die Verwendung des Hintergrundmodus entscheiden:
- Für Bluetooth Low Energy 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 fragt den Nutzer nach der Berechtigung, den Standort im Hintergrund zu verwenden, wenn das iBeacon-Scanning aktiviert oder der Stromsparmodus deaktiviert ist.
So aktivieren Sie das Scannen von Beacons im Hintergrund:
Aktiviere den Hintergrundmodus für dein Abo, indem du ein korrekt konfiguriertes
GNSBeaconStrategy
-Objekt übergibst. 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.plist
Ihrer App die erforderlichen Einträge hinzu:UIBackgroundModes
Einträge:bluetooth-central
für BLE-Scans im Hintergrund.location
für iBeacon-Scans im Hintergrund im Modus mit hoher Leistung. Sie können diesen Schritt auslassen, wenn Sie nur Eddystone-Beacons mit geringem Stromverbrauch scannen.
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 Schritt auslassen, wenn Sie nur Eddystone-Beacons mit geringem Stromverbrauch scannen.
Kann der Nutzer das Scannen im Hintergrund in Ihrer App aktivieren oder deaktivieren? Wenn ja, sollten Sie den Wert für den Hintergrundmodus in
NSUserDefaults
speichern, 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 sie beim Start aus
NSUserDefaults
und 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.