Ihre App kann Beacon-Nachrichten (Bluetooth Low Energy) mit demselben 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 wechselt, wird die Suche nach Beacons durch die Abos automatisch beendet. Weitere Informationen zum Aktivieren der Hintergrundscans finden Sie unter Hintergrundscans.
Wenn Sie Beacons abonnieren möchten, müssen Sie den deviceTypesToDiscover
-Parameter in den Aboparametern auf kGNSDeviceBLEBeacon
setzen. Das folgende Snippet zeigt, wie das funktioniert:
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
})
Das obige Abo erkennt nur Beacons, die zu Ihrem Projekt gehören, und empfängt alle Nachrichten von diesen Beacons. Wenn du Nachrichten von Beacons empfangen möchtest, die mit einem anderen Namespace registriert sind, kannst du einen Namespace in den Aboparametern übergeben. Ebenso können Sie, wenn Sie eine bestimmte Art von Nachricht wünschen, einen Nachrichtentyp zum Filtern übergeben. Das folgende Snippet zeigt, wie dies funktioniert:
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"
})
Ein Beacon-Abo scannt standardmäßig beide Arten von Beacons, Eddystone und iBeacon. Wenn das iBeacon-Scan aktiviert ist, werden Nutzer aufgefordert, der App die Verwendung ihrer Standortdaten zu erlauben. Das 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 GNSBeaconStrategy
deaktivieren. iOS wird den Nutzer dann nicht um Erlaubnis zur Verwendung des Standorts bitten. 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 Energieverbrauch aktiviert, was bei der Suche nach Eddystone-Beacons manchmal zu hohen Latenzen führen kann. Wenn der Energiesparmodus deaktiviert ist, wird das iBeacon-Scanning verwendet, um Eddystone-Beacons zu finden, wodurch diese Latenzen reduziert werden können. Dies führt jedoch zu einer höheren Akkunutzung und iOS fordert den Nutzer auf, die Berechtigung zur Verwendung des Standorts zu erhalten.
Das folgende Snippet zeigt, wie Sie den Energiesparmodus beim Suchen nach Eddystone-Beacons 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;
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-Dialogfeld für die Berechtigung zur Standortermittlung das Dialogfeld „Nearby-Berechtigung“ vorangestellt. Wenn du dieses Dialogfeld überschreiben möchtest (z. B. um ein Preflight-Dialogfeld anzuzeigen, in dem die Berechtigung zur Standortermittlung erforderlich ist), setze permissionRequestHandler
in den Aboparametern auf einen benutzerdefinierten Block. Das folgende Snippet zeigt, wie dies funktioniert:
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);
}
})
Hintergrundscans
Da Beacon-Scans BLE verwenden, kann sie im Hintergrund ausgeführt werden. Wenn Sie sich für den Hintergrundmodus entscheiden, sollten Sie Folgendes beachten:
- Für Hintergrund-BLE fallen zusätzliche Akkukosten an. Die Kosten sind niedrig, aber Sie sollten sie messen, bevor Sie sich für den Hintergrundmodus entscheiden.
- iOS fordert den Nutzer um Erlaubnis zur Standortermittlung im Hintergrund an, wenn das iBeacon-Scanning 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 dies funktioniert: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 dem
Info.plist
Ihrer Anwendung die erforderlichen Einträge hinzu:UIBackgroundModes
Einträge:bluetooth-central
für BLE-Scans im Hintergrund.location
für das iBeacon-Scanning im Hintergrund im Energiesparmodus. Sie können diesen Schritt auslassen, wenn Sie nur für Eddystone-Beacons einen energiesparenden Scan durchführen.
Der String
NSLocationAlwaysUsageDescription
, der beschreibt, warum Sie den Standort des Nutzers im Hintergrund erfassen. Beispiel: „Ihr Standort wird benötigt, 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 für Eddystone-Beacons einen Scan mit geringem Energieverbrauch durchführen.
Kann der Nutzer das Scannen von Hintergrund in Ihrer App aktivieren oder deaktivieren? In diesem Fall sollten Sie den Wert des Hintergrundmodus unter
NSUserDefaults
speichern, da iOS Ihre App jederzeit beenden kann, während sie im Hintergrund ausgeführt wird. Ihre Anwendung sollte Folgendes tun:- Speichern Sie den Wert für den Hintergrundmodus immer dann in
NSUserDefaults
, wenn der Nutzer ihn ändert. - Beim Start aus
NSUserDefaults
auslesen und das Beacon-Abo wiederherstellen, wenn der Hintergrundmodus aktiviert ist.
- Speichern Sie den Wert für den Hintergrundmodus immer dann in
Hintergrundbenachrichtigungen
Wenn Sie möchten, dass Nutzer von Ihrer App benachrichtigt werden, wenn Beacons im Hintergrund erkannt werden, können Sie lokale Benachrichtigungen verwenden. Weitere Informationen findest du unter Hintergrundbenachrichtigungen.