EEYatHo 앱 깎는 이야기

Document ) iOS 기기를 iBeacon 기기로 전환 본문

iOS, Swift/WWDC, Session, Docu

Document ) iOS 기기를 iBeacon 기기로 전환

EEYatHo 2024. 11. 26. 09:57
반응형

문서 링크

 

 

 개요

  • Bluetooth low energy를 사용하여 데이터 공유를 지원하는 모든 iOS 기기는 iBeacon으로 전환할 수 있음
  • 기본 iOS 기기를 iBeacon으로 사용하는 앱은 포그라운드에서 실행되어야함
  • 이 기능을 POS 앱이나 어차피 포그라운드에서 실행되도록 의도된 앱에 사용
  • 다른 유형의 iBeacon 구현의 경우 타사 제조업체의 전용 비콘 하드웨어를 사용합니다
  • 다음 과정을 따르면됨
    1. 장치에 대한 128비트 UUID를 얻거나 생성합니다.
    2. 적합한 major, minor 값과 UUID 값을 포함하는 CLBeaconRegion객체를 생성합니다.
    3. CoreBluetooth 프레임워크를 사용하여 비콘 정보를 알립니다.

 

기기의 UUID 생성

  • iBeacon을 식별하는 주요 방법은 UUID
  • 하나 이상의 비콘을 배포할 때, 클라이언트에게 비콘의 목적을 전달하는 UUID를 할당합니다
  • 비콘의 정확한 목적은 사용자가 정의하는 것 입니다.
    • 예를 들어, 백화점 체인은 배포된 모든 비콘에 동일한 UUID를 사용하거나 각 매장에 다른 UUID를 할당할 수 있습니다.
    • 감지에는 특정 UUID가 있는 비콘을 찾기 위해 지역 모니터링을 사용하므로 UUID를 적게 사용하면 관리하기가 더 쉽습니다.
  • iBeacon 배포를 위한 새 UUID를 만들려면 uuidgen명령줄 도구를 사용합니다.
    • Terminal을 열고 uuidgen명령줄에 입력하고 Return을 누릅니다.
    $ uuidgen
    39ED98FF-2900-441A-802F-9C398FC199D2 
    
    • 이 도구는 고유한 128비트 값을 생성하고 이를 하이픈으로 구분된 ASCII 문자열로 포맷합니다

 

비콘 지역 구성

  • CLBeaconRegion 객체를 사용하여 비콘의 ID를 구성합니다
  • 비콘 영역을 사용하여 나중에 Bluetooth를 통해 광고할 수 있는 정보 사전을 생성합니다.
func createBeaconRegion() -> CLBeaconRegion? {
    let proximityUUID = UUID(uuidString: "39ED98FF-2900-441A-802F-9C398FC199D2")
    let major: CLBeaconMajorValue = 100
    let minor: CLBeaconMinorValue = 1
    let beaconID = "com.example.myDeviceRegion"
        
    return CLBeaconRegion(proximityUUID: proximityUUID!, 
                major: major, minor: minor, identifier: beaconID)
}

 

블루투스 비콘 알림(advertsing)

  • iOS 기기에서 비콘의 ID를 브로드캐스트하려면 Core Bluetooth 프레임워크를 사용하여 iOS 기기를 Bluetooth 주변 기기로 구성합니다.
  • 주변 기기로 구성하면 iOS 기기가 Bluetooth 하드웨어를 사용하여 비콘 정보를 다른 기기로 브로드캐스트합니다.
  • 다른 기기는 해당 정보를 사용하여 범위 측정을 수행하고 iOS 기기와의 근접성을 감지합니다.
  • Xcode 프로젝트에 Core Bluetooth 프레임워크를 추가합니다.
  • 코드에서 CBPeripheralManager객체를 만들고 startAdvertising(_:)를 호출하여 비콘 데이터를 브로드캐스팅하기 시작합니다.
  • startAdvertising(_:) 메서드는 비콘 정보가 포함된 딕셔너리 매개변수를 사용합니다.
  • 이전에 만든 CLBeaconRegion에서 peripheralData(withMeasuredPower:)메서드를 호출하여, 비콘과 관련된 데이터가 포함된 사전을 가져옵니다.
func advertiseDevice(region : CLBeaconRegion) {
    let peripheral = CBPeripheralManager(delegate: self, queue: nil)
    let peripheralData = region.peripheralData(withMeasuredPower: nil)
        
    peripheral.startAdvertising(((peripheralData as NSDictionary) as! [String : Any]))
}

  • 데이터 딕셔너리를 얻기 위해 peripheralData(withMeasuredPower:)메서드를 호출할 때, 일반적으로 iOS 기기와 관련된 기본 수신 신호 강도 표시기(RSSI) 값을 지정하기 위해 전달합니다.
  • withMeasuredPower는 기기에서 1m 떨어진 곳에서 측정한 신호 강도(데시벨)를 나타냅니다.
  • 특정 환경에서 더 나은 범위 성능을 위해 기기를 보정해야 하는 경우 사용자 지정 값을 지정할 수 있습니다.
  • 주변 장치 관리자 객체를 만들면, 해당 객체의 대리자 객체의 peripheralManagerDidUpdateState(_:)메서드를 호출합니다.
  • Bluetooth low energy가 지원되고 iOS 기기에서 사용할 수 있도록 하려면 이 대리자 메서드를 구현해야 합니다.

 

중요

  • 앱을 비콘으로 광고한 후, 앱은 필요한 블루투스 신호를 브로드캐스트하기 위해 포그라운드에서 계속 실행되어야 합니다.
  • 사용자가 앱을 종료하면 시스템은 블루투스를 통해 기기를 주변 기기로 광고하는 것을 중단합니다.

 

범위 지정 중에 Core Location이 동일한 iOS 기기에 대해 두 개의 CLBeacon객체를 생성하는 짧은 기간이 있을 수 있습니다.

  • 이 동작은 iOS가 사용자의 개인 정보를 보호하기 위해 기기의 Bluetooth 식별자를 주기적으로 변경하고, 한 비콘이 이전 식별자를 나타내고 다른 비콘이 새 식별자를 나타내기 때문에 발생합니다.
  • 식별자가 변경된 후 2초 이내에 이전 식별자가 있는 비콘의 근접성 속성이 CLProximity.unknown로 설정됩니다 . 10초 이내에 이전 식별자가 있는 비콘은 더 이상 보고되지 않습니다.
Comments