표지 메시지 받기

앱은 다른 근처 기기에서 게시한 메시지를 구독하는 데 사용되는 것과 동일한 메커니즘을 사용하여 저전력 블루투스 (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 비콘을 찾을 때 지연 시간이 길어질 수도 있습니다. 저전력 모드가 사용 중지되면 iBeacon 스캔을 사용하여 Eddystone 비콘을 찾아 지연 시간을 줄일 수 있습니다. 하지만 이 경우 배터리 사용량이 증가하며 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개:

      • 백그라운드에서의 BLE 검색을 위한 bluetooth-central
      • location - 고전력 모드를 사용하여 백그라운드에서 iBeacon 스캔 Eddystone 비콘만 저전력 스캔하는 경우에는 생략해도 됩니다.
    • 백그라운드에서 사용자 위치를 추적하는 이유를 설명하는 NSLocationAlwaysUsageDescription 문자열입니다. 예: '백그라운드에서 비콘을 검색하려면 사용자 위치가 필요합니다.' 자세한 내용은 Apple 문서를 참조하세요. Eddystone 비콘만 저전력 스캔하는 경우에는 생략해도 됩니다.

  • 사용자가 앱에서 백그라운드 검사를 사용 설정하거나 사용 중지할 수 있나요? 이 경우 백그라운드 모드 값을 NSUserDefaults에 저장해야 합니다. iOS가 백그라운드에 있는 동안 언제든지 앱을 종료할 수 있기 때문입니다. 앱은 다음을 실행해야 합니다.

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

백그라운드 알림

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