앱은 다른 근처 기기에서 게시한 메시지를 구독하는 데 사용되는 것과 동일한 메커니즘을 사용하여 저전력 블루투스 (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
에서 읽고 백그라운드 모드가 사용 설정된 경우 비콘 구독을 복원합니다.
- 사용자가 백그라운드 모드 값을 변경할 때마다
백그라운드 알림
백그라운드에서 비콘이 감지될 때 앱이 사용자에게 알리도록 하려면 로컬 알림을 사용하면 됩니다. 자세한 내용은 백그라운드 알림을 참고하세요.