Beacon-Nachrichten abrufen

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.

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.