Beacon-Nachrichten abrufen

Ihre App kann BLE-Beacon-Nachrichten (Bluetooth Low Energy) abonnieren. mit demselben Mechanismus, wie beim Abonnieren von Nachrichten, andere Geräte in der Nähe.

Standardmäßig funktionieren Beacon-Abos nur, wenn Ihre App im Vordergrund ausgeführt wird. Wenn deine App in den Hintergrund wechselt, werden die Abos automatisch beendet nach Beacons suchen. Weitere Informationen finden Sie unter Hintergrundscans. wie Sie das Scannen im Hintergrund aktivieren.

Wenn Sie Beacons abonnieren möchten, setzen Sie den Parameter deviceTypesToDiscover auf kGNSDeviceBLEBeacon in den Aboparametern. 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
    })

Das obige Abo erkennt nur Beacons Ihres Projekts und empfängt alle Nachrichten von diesen Beacons. Wenn Sie Nachrichten von Beacons registriert haben, können Sie einen Namespace im Aboparameter. Wenn Sie eine bestimmte Art von Nachricht erhalten möchten, kann auch einen Nachrichtentyp zum Filtern übergeben. Das folgende Snippet zeigt, Gehen Sie wie folgt vor:

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 sucht ein Beacon-Abo nach Beacon-Typen, Eddystone und iBeacon Wenn iBeacon-Scans aktiviert sind, werden Nutzer aufgefordert, dass die App ihre Standortdaten verwenden darf. Die Info.plist deiner App muss Fügen Sie den Schlüssel NSLocationWhenInUseUsageDescription mit einer kurzen Erklärung warum der Standort verwendet wird. Weitere Informationen finden Sie unter Dokumentation von Apple .

Wenn Sie nur nach Eddystone-Beacons suchen möchten, können Sie iBeacon deaktivieren. und iOS fragt den Nutzer nicht nach GNSBeaconStrategy Berechtigung zur Nutzung des Standorts. Im folgenden Snippet sehen Sie, wie iBeacon deaktiviert wird nach dem obigen ursprünglichen Abo 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;
                                  };
                            }];

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. Dies kann manchmal zu großen Latenzen bei der Suche nach Eddystone-Beacons auftreten. Wenn der Energiesparmodus deaktiviert ist, iBeacon-Scans werden eingesetzt, um Eddystone-Beacons zu finden, wodurch diese Latenzen. Dies führt jedoch zu einer höheren Akkunutzung und iOS fragt nach der um die Berechtigung zur Verwendung des Standorts zu erhalten.

Das folgende Snippet zeigt, wie der Energiesparmodus deaktiviert wird, wenn nach Eddystone-Beacons.

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 Dialogfeld für die Berechtigung zur Standortermittlung unter iOS ein Dialogfeld mit den Berechtigungen „Nearby“. Wenn Sie dieses Dialogfeld überschreiben möchten (für um einen Preflight- Standard bereitzustellen, Dialogfeld, in dem erklärt wird, warum die Berechtigung zur Standortermittlung erforderlich ist, legen Sie für permissionRequestHandler einen benutzerdefinierten Block in der Aboparameter. 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);
      }
    })

Suchlauf im Hintergrund

Da das Beacon-Scanning BLE verwendet, kann es im Hintergrund ausgeführt werden. Hier sind einige Wichtige Hinweise zur Verwendung des Hintergrundmodus:

  • Für BLE im Hintergrund fallen zusätzliche Akkukosten an. Die Kosten sind niedrig, aber Sie bevor Sie sich für den Hintergrundmodus entscheiden.
  • iOS fordert den Nutzer um die Berechtigung zur Verwendung der Standortermittlung im Hintergrund, wenn Die iBeacon-Suche ist aktiviert oder der Energiesparmodus ist deaktiviert.

So aktivieren Sie das Beacon-Scanning im Hintergrund:

  • Aktiviere den Hintergrundmodus für dein Abo, indem du eine konfiguriertes GNSBeaconStrategy-Objekt. Das folgende Snippet zeigt, wie Sie dies:

    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 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 Hochenergiemodus. Sie können dies weglassen, wenn Sie einen Scan mit geringem Energieverbrauch für Eddystone ausführen. Beacons sind zulässig.
    • NSLocationAlwaysUsageDescription-String, der beschreibt, warum das Tracking durchgeführt wird den Standort des Nutzers im Hintergrund. Beispiel: „Dein Standort ist um im Hintergrund nach Beacons zu suchen.“ Weitere Informationen finden Sie unter Dokumentation von Apple . Sie können dies auslassen, wenn Sie für Nur Eddystone-Beacons.

  • Kann der Nutzer das Scannen im Hintergrund in Ihrer App aktivieren oder deaktivieren? In diesem Fall sollte den Wert für den Hintergrundmodus unter NSUserDefaults speichern, da iOS Ihre App jederzeit und überall ansehen, während sie im Hintergrund läuft. Ihre App sollte Folgendes tun: Folgendes:

    • Speichert den Wert für den Hintergrundmodus jedes Mal in NSUserDefaults, wenn der Nutzer und ändert es.
    • Beim Start aus NSUserDefaults lesen und das Beacon wiederherstellen Abo, wenn der Hintergrundmodus aktiviert ist.

Hintergrundbenachrichtigungen

Wenn Sie möchten, dass Ihre App den Nutzer benachrichtigt, wenn Beacons während Hintergrund hinzugefügt haben, können Sie lokale Benachrichtigungen. Weitere Informationen finden Sie unter Hintergrundbenachrichtigungen