표지 메시지 받기

앱은 다른 근처 기기에서 게시한 메시지를 구독하는 데 사용되는 것과 동일한 메커니즘을 사용하여 저전력 블루투스 (BLE) 비콘 메시지를 구독할 수 있습니다.

기본적으로 비콘 구독은 앱이 포그라운드에 있을 때만 작동합니다. 앱이 백그라운드로 전환되면 구독에서 비콘 스캔을 자동으로 중지합니다. 백그라운드 스캔을 사용 설정하는 방법에 관한 자세한 내용은 백그라운드 스캔을 참고하세요.

비콘을 구독하려면 구독 매개변수에서 deviceTypesToDiscover 매개변수를 kGNSDeviceBLEBeacon로 설정합니다. 다음 스니펫은 이 방법을 보여줍니다.

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

위의 구독은 프로젝트에서 소유한 비콘만 검색하고 이러한 비콘의 모든 메시지를 수신합니다. 다른 네임스페이스에 등록된 비콘에서 메시지를 수신하려면 정기 결제 매개변수에서 네임스페이스를 전달하면 됩니다. 마찬가지로 특정 유형의 메시지를 원하는 경우 필터링을 위해 메시지 유형을 전달할 수도 있습니다. 다음 스니펫은 이를 수행하는 방법을 보여줍니다.

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

기본적으로 비콘 구독은 Eddystone과 iBeacon이라는 두 가지 유형의 비콘을 모두 스캔합니다. iBeacon 스캔이 사용 설정되면 사용자에게 앱에서 위치 데이터를 사용할 수 있는 권한을 부여하라는 메시지가 표시됩니다. 앱의 Info.plist에는 위치가 사용되는 이유에 관한 간단한 설명과 함께 NSLocationWhenInUseUsageDescription 키가 포함되어야 합니다. 자세한 내용은 Apple 문서를 참고하세요.

Eddystone 비콘만 스캔하려면 GNSBeaconStrategy에서 iBeacon 스캔을 사용 중지하면 됩니다. 그러면 iOS에서 사용자에게 위치 사용 권한을 요청하지 않습니다. 다음 스니펫은 위의 원래 구독에 대해 iBeacon 스캔을 사용 중지하는 방법을 보여줍니다.

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

기본적으로 저전력 스캔이 사용 설정되어 있으므로 Eddystone 비콘을 찾을 때 지연 시간이 길어질 수 있습니다. 저전력 모드가 사용 중지되면 Eddystone 비콘을 찾는 데 iBeacon 스캔이 사용되므로 이러한 지연 시간이 줄어들 수 있습니다. 하지만 이렇게 하면 배터리 사용량이 늘어나고 iOS에서 사용자에게 위치 사용 권한을 요청합니다.

다음 스니펫은 Eddystone 비콘을 스캔할 때 저전력 모드를 사용 중지하는 방법을 보여줍니다.

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

iBeacon을 스캔할 때 iOS 위치 정보 액세스 권한 대화상자 앞에 Nearby 권한 대화상자가 표시됩니다. 이 대화상자를 재정의하려면 (예: 위치 정보 액세스 권한이 필요한 이유를 설명하는 '사전 비행' 대화상자를 제공) 정기 결제 매개변수에서 permissionRequestHandler를 맞춤 블록으로 설정하세요. 다음 스니펫은 이 방법을 보여줍니다.

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

백그라운드 스캔

비콘 스캔은 BLE를 사용하므로 백그라운드에서 작동할 수 있습니다. 백그라운드 모드를 사용할지 결정할 때 알아야 할 몇 가지 사항은 다음과 같습니다.

  • 백그라운드 BLE에는 추가 배터리 비용이 있습니다. 비용은 낮지만 백그라운드 모드를 사용하기 전에 측정해야 합니다.
  • iBeacon 스캔이 사용 설정되어 있거나 저전력 모드가 사용 중지된 경우 iOS는 백그라운드에서 위치를 사용할 권한을 사용자에게 요청합니다.

백그라운드에서 비콘 스캔을 사용 설정하려면 다음 추가 단계를 따르세요.

  • 올바르게 구성된 GNSBeaconStrategy 객체를 전달하여 정기 결제의 백그라운드 모드를 사용 설정합니다. 다음 스니펫은 이를 수행하는 방법을 보여줍니다.

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

  • 앱의 Info.plist에 필수 항목을 추가합니다.

    • UIBackgroundModes 항목:

      • bluetooth-central: 백그라운드에서 BLE를 스캔합니다.
      • 고전력 모드를 사용하여 백그라운드에서 iBeacon을 스캔하는 location Eddystone 비콘에 대해서만 저전력 스캔을 실행하는 경우에는 이 부분을 생략할 수 있습니다.
    • 백그라운드에서 사용자의 위치를 추적하는 이유를 설명하는 NSLocationAlwaysUsageDescription 문자열입니다. 예를 들어 '백그라운드에서 비콘을 스캔하려면 위치 정보가 필요합니다.' 자세한 내용은 Apple 문서를 참고하세요. Eddystone 비콘에 대해서만 저전력 스캔을 실행하는 경우에는 이 부분을 생략할 수 있습니다.

  • 사용자가 앱에서 백그라운드 스캔을 사용 설정 또는 사용 중지할 수 있나요? 이 경우 iOS가 백그라운드에서 앱을 언제든지 종료할 수 있으므로 백그라운드 모드 값을 NSUserDefaults에 저장해야 합니다. 앱은 다음을 실행해야 합니다.

    • 사용자가 백그라운드 모드 값을 변경할 때마다 NSUserDefaults에 저장합니다.
    • 시작 시 NSUserDefaults에서 읽고 백그라운드 모드가 사용 설정된 경우 비콘 구독을 복원합니다.

백그라운드 알림

백그라운드에서 비콘이 감지될 때 앱이 사용자에게 알리도록 하려면 로컬 알림을 사용하면 됩니다. 자세한 내용은 백그라운드 알림을 참고하세요.