Beacon-Nachrichten abrufen

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.plist Ihrer App die erforderlichen Einträge hinzu:

    • UIBackgroundModes-Einträge:

      • bluetooth-central für die BLE-Suche im Hintergrund.
      • location fü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 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 ihn beim Start aus NSUserDefaults und stellen Sie das Beacon-Abo wieder her, wenn der Hintergrundmodus aktiviert ist.

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.