Beacon-Nachrichten abrufen

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.

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.