앱은 다른 근처 기기에서 게시한 메시지를 구독하는 데 사용되는 동일한 메커니즘을 사용하여 저전력 블루투스 (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 위치 정보 액세스 권한 대화상자 앞에 근처 권한 대화상자가 표시됩니다. 이 대화상자를 재정의하려면 (예: 위치 정보 액세스 권한이 필요한 이유를 설명하는 '프리플라이트' 대화상자를 제공하려는 경우) 구독 매개변수에서 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 비콘만 저전력 스캔하는 경우 이 단계를 생략할 수 있습니다.
- 백그라운드에서 BLE 검색을 위한
NSLocationAlwaysUsageDescription
백그라운드에서 사용자의 위치를 추적하는 이유를 설명하는 문자열입니다. 예: '백그라운드에서 비콘을 검색하려면 위치가 필요합니다.' 자세한 내용은 Apple 문서를 참고하세요. Eddystone 비콘만 저전력으로 스캔하는 경우 이를 생략할 수 있습니다.
사용자가 앱에서 백그라운드 검색을 사용 설정 또는 사용 중지할 수 있나요? 이 경우 백그라운드 모드 값을
NSUserDefaults
에 저장해야 합니다. iOS는 앱이 백그라운드에 있는 동안 언제든지 앱을 종료할 수 있기 때문입니다. 앱은 다음을 실행해야 합니다.- 사용자가 변경할 때마다 백그라운드 모드 값을
NSUserDefaults
에 저장합니다. - 시작 시
NSUserDefaults
에서 읽고 백그라운드 모드가 사용 설정된 경우 비콘 구독을 복원합니다.
- 사용자가 변경할 때마다 백그라운드 모드 값을
백그라운드 알림
앱이 백그라운드에 있는 동안 비콘이 발견되면 사용자에게 알리려면 로컬 알림을 사용하면 됩니다. 자세한 내용은 백그라운드 알림을 참고하세요.