EEYatHo 앱 깎는 이야기

Document ) iBeacon 장치와의 근접성 확인 (iBeacon 장치 감지, 거리 확인, +앱살리기) 본문

iOS, Swift/WWDC, Session, Docu

Document ) iBeacon 장치와의 근접성 확인 (iBeacon 장치 감지, 거리 확인, +앱살리기)

EEYatHo 2024. 11. 15. 15:52
반응형

비콘을 감지하고 비콘과의 상대 거리를 확인합니다.

문서 링크

 

  • iBeacon은 귀하의 기기에서 감지할 수 있는 Bluetooth 신호를 방출하는 기기입니다.
  • 회사는 사용자에게 이로운 경험을 제공하기 위해, iBeacon 기기를 배치할 수 있으며, 앱은 비콘의 근접성을 사용하여 적절한 조치 과정을 결정할 수 있습니다.
  • 근처 비콘의 근접성에 따라 어떤 조치를 취할지 결정합니다.
  • 예를 들어, 백화점은 매장의 각 구역을 식별하는 비콘을 배치할 수 있으며, 해당 앱은 사용자가 각 구역 근처에 있을 때 세일 품목을 가리킬 수 있습니다.
  • 앱에 iBeacon 지원을 추가하려면 두 가지 다른 단계에서 비콘을 감지해야 합니다.
    1. 지역 모니터링을 사용하여 iBeacon의 존재를 감지합니다.
    2. 비콘 거리 측정을 사용하여 감지된 iBeacon과의 근접성을 확인합니다.
  • 비콘을 감지하는 2단계 프로세스를 사용하면 전력 소비가 크게 줄어듭니다.
    • 범위 측정에는 Bluetooth 신호 강도를 자주 측정하고 관련 비콘까지의 거리를 계산해야 합니다.
    • 반면, 지역 모니터링은 근처 비콘에 대한 수동적 청취만 포함하므로 전력 소비가 훨씬 적습니다.

 

iBeacon 하드웨어 배포

  • iBeacon 하드웨어를 배포할 때는 적절한 근접 UUID, 주요 값, 부차 값으로 프로그래밍해야 합니다.
    • 이러한 값은 각 비콘을 고유하게 식별하고 나중에 앱에서 이러한 비콘을 구별할 수 있도록 합니다.
    • uuid(범용 고유 식별자)는 앱의 비콘을 고유하게 식별하는 128비트 값입니다.
    • major은 동일한 UUID를 가진 비콘 그룹을 구별하는 데 사용되는 16비트 부호 없는 정수입니다.
    • minor은 동일한 UUID와 major값을 가진 비콘 그룹을 구별하는 데 사용되는 16비트 부호 없는 정수입니다.
      • (uuid = 시, major = 구, minor = 동 이런 느낌)
  • UUID만 필요할 수 있지만, 세 가지 값을 모두 iBeacon 하드웨어에 프로그래밍하는 것이 좋습니다.
  • 여러 iBeacon 을 사용할 경우, 상위 요소는 동일한 하위 집합을 지정하여 관련 비콘 그룹을 찾을 수 있습니다.

 

비콘 존재감지 - 지역 모니터링

  • 지역 모니터링을 사용하여 iBeacon이 근처에 있을 때 앱에 경고합니다.
  • 비콘을 모니터링하려면 CLLocationManager객체를 생성하고 startMonitoring(for:)메서드에 등록합니다.
  • 비콘 지역에는 감지하려는 비콘의 근접 UUID, major, minor 값이 포함됩니다. 일치하는 값을 가진 비콘만 대리자 객체에 대한 호출을 트리거합니다.
  • 아래 코드는 회사 비콘에 대한 지역 모니터링을 설정하는 방법의 예를 보여줍니다.
  • 일반적으로 회사의 UUID를 한 번 정의하고 나중에 변경하지 않기 때문에, 이 예에는 해당 값의 하드코딩된 버전이 포함됩니다.
  • 이 메서드를 호출하기 전에 CLLocationManager객체를 생성하고 대리자를 할당해야 합니다.
func monitorBeacons() {
    if CLLocationManager.isMonitoringAvailable(for: 
                  CLBeaconRegion.self) {
        // Match all beacons with the specified UUID
        let proximityUUID = UUID(uuidString: 
               "39ED98FF-2900-441A-802F-9C398FC199D2")
        let beaconID = "com.example.myBeaconRegion"
            
        // Create the region and begin monitoring it.
        let region = CLBeaconRegion(proximityUUID: proximityUUID!,
               identifier: beaconID)
        self.locationManager.startMonitoring(for: region)
    }
}

[중요]

  • 비콘이 감지될 때 앱이 실행 중이 아니면 시스템은 앱을 시작하려고 시도합니다.
  • 앱은 지역 모니터링을 사용할 권한이 있어야 하며, 시작하려면 위치 업데이트 백그라운드 모드로 구성되어야 합니다. 자세한 내용은 위치 서비스 사용 권한 요청을 참조하세요 .

 

비콘과의 근접성 확인 - 거리 측정

  • iBeacon을 감지한 후, 범위 측정을 사용하여 비콘과 사용자 기기 간의 상대적 거리를 확인합니다.
  • 범위 측정은 두 기기가 멀리 떨어져 있거나, 가까이 있거나, 바로 근처에 있을 때 보고합니다.
  • 정확한 거리를 제공하지 않으며, 비콘 신호의 강도에 의존하여 직접 해당 정보를 계산해서는 안 됩니다.
  • 상대적 값을 사용하여 적절한 조치 과정을 결정합니다.
  • 예를 들어, 미술관 앱은 사용자가 iBeacon 바로 근처에 있을 때까지 기다렸다가 해당 작품에 대한 정보를 제공할 수 있습니다.

 

  • 아래 코드는 감지된 비콘에 대한 범위 지정을 켜는 이 대리자 메서드의 구현을 보여줍니다.
  • 이 메서드는 또한 앱이 언제든지 범위 지정을 중지하고 다시 시작할 수 있도록 비콘을 내부 배열에 추가합니다.
  • 예를 들어, 전원을 절약하기 위해 앱이 백그라운드에 있을 때 범위 지정을 중지할 수 있습니다.
func locationManager(_ manager: CLLocationManager, didEnterRegion region: CLRegion) {
    if region is CLBeaconRegion {
        // Start ranging only if the devices supports this service.
        if CLLocationManager.isRangingAvailable() {
            manager.startRangingBeacons(in: region as! CLBeaconRegion)

            // Store the beacon so that ranging can be stopped on demand.
            beaconsToRange.append(region as! CLBeaconRegion)        
        }
    }
}

 

  • 범위가 활성화되어 있는 경우, 위치 관리자 객체는 보고할 변경 사항이 있을 때마다 대리자의 locationManager(_:didRangeBeacons:in:)메서드를 호출합니다.
  • 이 메서드를 사용하여 근처 비콘의 근접성에 따라 조치를 취합니다.
  • 아래 코드는 박물관 앱이 근접성 값을 사용하여 가장 가까운 전시에 대한 정보를 표시하는 방법을 보여줍니다. 이 예에서 박물관은 주요 값과 부차 값을 사용하여 각 전시를 식별합니다.
func locationManager(_ manager: CLLocationManager, 
            didRangeBeacons beacons: [CLBeacon], 
            in region: CLBeaconRegion) {
    if beacons.count > 0 {
        let nearestBeacon = beacons.first!
        let major = CLBeaconMajorValue(nearestBeacon.major)
        let minor = CLBeaconMinorValue(nearestBeacon.minor)
            
        switch nearestBeacon.proximity {
        case .near, .immediate:
            // Display information about the relevant exhibit.
            displayInformationAboutExhibit(major: major, minor: minor)
            break
                
        default:
           // Dismiss exhibit information, if it is displayed.
           dismissExhibit(major: major, minor: minor)
           break
           }
        }
    }
}
Comments