Otrzymywanie obrazów typu beacon

Aplikacja może subskrybować wiadomości beacon Bluetooth Low Energy (BLE) za pomocą tego samego mechanizmu, który służy do subskrybowania wiadomości publikowanych przez z innymi urządzeniami w pobliżu.

Domyślnie subskrypcje typu beacon działają tylko wtedy, gdy aplikacja działa na pierwszym planie. Gdy aplikacja działa w tle, subskrypcje są automatycznie zatrzymywane w poszukiwaniu beaconów. Zobacz Skanowanie w tle, aby dowiedzieć się, jak – znajdziesz szczegółowe informacje o tym, jak włączyć skanowanie w tle.

Aby subskrybować beacony, ustaw parametr deviceTypesToDiscover na kGNSDeviceBLEBeacon w parametrach subskrypcji. Ten fragment kodu pokazuje, jak to zrobić:

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
    })

Powyższa subskrypcja wykrywa tylko beacony należące do Twojego projektu i otrzymuje wszystkie wiadomości z tych beaconów. Jeśli chcesz otrzymywać wiadomości od beaconów zarejestrowanych w innej przestrzeni nazw, możesz przekazać przestrzeń nazw w parametrów subskrypcji. Analogicznie, jeśli chcesz przesłać wiadomość konkretnego typu, mogą też przekazywać typ wiadomości do filtrowania. Ten fragment kodu pokazuje, jak wykonaj następujące czynności:

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"
    })

Domyślnie subskrypcja beaconów skanuje obydwa typy beaconów, Eddystone i iBeacon Gdy skanowanie iBeacon jest włączone, użytkownicy są proszeni o podanie dostępu aplikacji do danych o lokalizacji. Info.plist w Twojej aplikacji musi dołącz klucz NSLocationWhenInUseUsageDescription z krótkim wyjaśnieniem dlaczego lokalizacja jest używana. Zobacz Dokumentacja Apple .

Jeśli chcesz skanować tylko w poszukiwaniu beaconów Eddystone, wyłącz iBeacon w GNSBeaconStrategy, a iOS nie będzie prosić użytkownika o dostępu do lokalizacji. Fragment kodu poniżej pokazuje, jak wyłączyć funkcję iBeacon skanowanie w poszukiwaniu oryginalnej subskrypcji powyżej:

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
          })
    })

Domyślnie włączone jest skanowanie o niskim zużyciu energii, co może czasem prowadzić do dużych czas oczekiwania przy szukaniu beaconów Eddystone. Gdy tryb oszczędzania baterii jest wyłączony, Skanowanie iBeacon pozwala znaleźć sygnały Eddystone, które mogą ograniczyć i opóźnieniach. Jednak powoduje to jednak większe wykorzystanie baterii, a iOS wysyła pytanie, o pozwolenie na korzystanie z lokalizacji.

Ten fragment kodu pokazuje, jak wyłączyć tryb oszczędzania baterii podczas skanowania Eddystone beacon.

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
          })
    })

Podczas skanowania w poszukiwaniu iBeacons okno uprawnień dostępu do lokalizacji w iOS jest poprzedzone znakiem okna z uprawnieniami dostępu do urządzeń w pobliżu. Jeśli chcesz zastąpić to okno (dla na przykład, aby udostępnić „proces wstępny” okno z wyjaśnieniem, dlaczego dostęp do lokalizacji jest wymagany), ustaw permissionRequestHandler na niestandardowy blok w parametrów subskrypcji. Jak to zrobić:

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);
      }
    })

Skanowanie w tle

Skanowanie beaconów korzysta z BLE, więc może działać w tle. Oto kilka o czym musisz pamiętać, wybierając tryb działania w tle:

  • Jest dodatkowy koszt baterii w przypadku obsługi BLE w tle. Koszt jest niewielki, ale należy go zmierzyć przed użyciem trybu działania w tle.
  • iOS poprosi użytkownika o pozwolenie na używanie lokalizacji w tle, jeśli Skanowanie iBeacon jest włączone lub tryb oszczędzania baterii jest wyłączony.

Aby włączyć skanowanie przy użyciu beaconu w tle, wykonaj te dodatkowe czynności:

  • Włącz tryb działania w tle dla swojej subskrypcji, przekazując poprawnie skonfigurowany obiekt GNSBeaconStrategy. Ten fragment pokazuje, jak to zrobić to:

    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
              })
        })
    

  • Dodaj wymagane wpisy do Info.plist aplikacji:

    • UIBackgroundModes wpisów:

      • bluetooth-central do skanowania BLE w tle.
      • location w przypadku skanowania iBeacon w tle w trybie wysokiego zużycia energii. Możesz to pominąć, jeśli wykonujesz skanowanie przy niskim poziomie energii Eddystone tylko za pomocą beaconów.
    • NSLocationAlwaysUsageDescription ciąg tekstowy opisujący, dlaczego śledzisz z informacjami o lokalizacji użytkownika w tle. Na przykład „Twoja lokalizacja to konieczne jest skanowanie w poszukiwaniu beaconów w tle”. Zobacz Dokumentacja Apple . Możesz to pominąć, jeśli przeprowadzasz skanowanie o niskim zużyciu energii Tylko eddystone beacon.

  • Czy użytkownik może włączyć lub wyłączyć skanowanie w tle w Twojej aplikacji? Jeśli tak, należy zapisać wartość trybu działania w tle na NSUserDefaults, bo iOS może możesz jej używać w każdej chwili, gdy działa ona w tle. Aplikacja powinna wykonywać :

    • Zapisuj wartość trybu działania w tle na NSUserDefaults za każdym razem, gdy użytkownik ją zmienić.
    • Po uruchomieniu odczytaj dane z urządzenia NSUserDefaults i przywróć beacon subskrypcji, jeśli włączony jest tryb działania w tle.

Powiadomienia w tle

Jeśli chcesz, by aplikacja powiadamiała użytkownika o wykryciu beaconów w trakcie tła, można użyć powiadomień lokalnych. Więcej informacji: powiadomień w tle.