Swift + iOS/iOS

[ios] iBeacon - basic

군옥수수수 2018. 5. 29. 00:37

iBeacon - basic


안녕하세요. 저는 현재 졸업 작품으로 "비콘을 활용한 실내 측위 마케팅 솔루션"이라는 주제로 프로젝트를 진행하고 있습니다. 평소에 비콘에 관심이 많았고 졸업 작품을 계기로 이를 직접 구현해보게 되었습니다.


간단하게 주제를 설명드리자면 코엑스나 스타필드 같이 대형 복합 상업 시설에서 비콘을 활용해 사용자가 선호하는 브랜드들을 바탕으로 할인 정보나 각종 이벤트 정보를 전달해주는 동시에 비콘의 영역 내/외부 판단과 매장 비콘으로부터의 거리 정보, 영역안에 머문 시간등의 데이터들을 실시간으로 서버에 전송하여 사업자로 하여금 마케팅에 활용할 수 있게끔 이러한 데이터들을 제공하는 솔루션입니다.


이를 위해서는 iOS에서의 비콘 프로그래밍에 대해 공부를 하였고 이를 통해 알게 된 사실들을 기록하고자 이렇게 글을 작성하게 되었습니다.


비콘이란?

비콘이란 근거리 무선 통신 기술을 바탕으로 신호를 발산하는 소형 장치를 일컫는 말입니다. 근거리 무선 통신에는 NFC와 블루투스도 존재합니다. NFC는 상당히 근접한 거리에서만 가능하다는 단점과 블루투스는 페어링이라는 과정을 거쳐야 한다는 단점이 존재합니다.


반면에 비콘은 최대 50m라는 비교적 넓은 범위를 제공하며 상호 페어링 과정이 필요없다는 장점이 존재합니다. 또한 실내에서 GPS보다 정확한 위치 파악이 가능하고 비콘과 통신하는데 전력이 많이 소모되지 않는다는 장점등이 존재합니다.


하지만 생각보다 비콘의 기능은 한정적이기도 합니다. 일단 비콘과 디바이스간의 양방향 통신은 불가능합니다. 비콘은 오로지 신호를 전송하는 것만 가능합니다. 또한 비콘은 어떠한 정보를 전달하는 것이 아닌 단순히 비콘 자신의 고유 신호만을 전송합니다. 이러한 신호의 정보를 서버에 등록하여 이를 바탕으로 디바이스가 신호를 인식하면 해당 신호에 대한 정보를 서버로부터 받아와 사용자에게 전달하는 방식으로 설계를 해야합니다.


Settings

비콘을 활용하기 위해선 비콘의 영역을 감지하고 비콘과의 대략적인 거리를 판단하는 기능이 필요합니다. 이를 각각 MonitoringRanging이라고 합니다. 이에 대해서는 밑에서 더욱 자세히 다루기로 하고 이 두 기능을 가능케 하려면 몇 가지 설정이 필요합니다.


먼저 위치 서비스는 앱의 사용 유무와 상관없이 항상 켜져있어야 합니다. 이는 info.plist 에 명시해주어야 하고 앱이 실행됨과 동시에 위치 서비스에 대한 권한을 사용자에게 요청해야합니다.


다음은 Background에서도 현재 위치가 계속해서 갱신되어야 합니다. 이를 위해서는 Xcode 내에서 TARGETS -> Capabilities -> Background Modes 에서 Location updates 를 활성화 해주면 됩니다.


마지막으로 항상 디바이스는 블루투스 Detecting 기능이 켜져 있어야 합니다.



Monitoring & Ranging

Monitoring은 비콘의 영역 내/외부를 판단하는 행위입니다. 이는 위에서 언급한 앱의 실행 유무와 상관없는 위치 서비스와 백그라운드 위치 갱신 서비스의 설정이 선행된 후에 가능한 기능입니다. 이에 대해 애플의 공식 문서는 다음과 같이 언급하고 있습니다.


Important

Apps must have always authorization to use region monitoring, and they must be configured with the Location updates background mode to be launched.

이렇게 Monitoring 을 통해 현재 디바이스가 비콘의 영역의 내부에 있다는 것이 판단되면 Ranging 을 통해 해당 비콘과의 근접도를 판단합니다.


거리가 아닌 근접도라고 표현하는 이유는 비콘과 디바이스 간의 거리는 신호의 안정도와 세기에 따라 순간적으로 다르게 나타날 수 있기 때문입니다. 그러므로 거리의 수치에 따른 구현은 옳지 않습니다. 그렇기 때문에 공식 문서에서도 Distance가 아닌 Proximity로 표현하고 있고 이에 대해 명시하고 있습니다. 근접도의 단계에는 네 가지가 존재합니다


  1. Immediate : 비콘과 디바이스가 상당히 가까운 상태로 거의 디바이스에 붙어 있는 수준
  2. Near : 대략적으로 1 ~ 3 미터 내외의 거리로 비교적 가까운 수준이거나 신호가 Immediate에 비해 약할 때
  3. Far : 물리적인 거리가 NearImmediate보다 떨어져 있거나 신호의 세기가 이들보다 약한 경우
  4. Unknown : 신호의 세기나 거리에 따른 근접도의 판단이 불가능할 때, 방금 막 Ranging이 시작되었을 때 등과 같이 측정을 하기 충분한 상황이 아닐 때.

위 내용들을 살펴보면 근접도는 단순한 물리적 거리뿐만아니라 신호의 세기도 영향을 받는다는 것을 알 수 있습니다. 


안드로이드 환경과 다르게 iOS에서는 MonitoringRanging 에 제약이 존재합니다.


먼저 Monitoring 할 수 있는 영역이 20개로 제한됩니다. 즉 영역을 판단할 수 있는 비콘의 UUID 값이 최대 20개까지라는 것입니다. 그렇기 때문에 하나의 영역에서 각각의 비콘들을 식별하기 위해서는 major와 minor 값을 이용해야합니다.


다음은 Ranging 은 반드시 앱이 실행된 이후에 가능하다는 것입니다. Monitoring은 앱이 Terminate 되어 있는 상황에서도 기능이 작동하지만 Ranging 은 반드시 앱이 한번 실행된 이후에 가능합니다. 즉 Ranging 은 Background와 Foreground 모두에서 가능하지만 Terminate된 상황에서는 불가능하다는 것입니다.


Implementation

위의 정보들을 바탕으로 제공되는 메소드를 바탕으로 코드를 작성해보았습니다.


먼저 locationManager 객체를 생성하여 프로젝트 설정과 별개로 위치 서비스 권한 요청과 백그라운드 위치 갱신등의 코드들을 작성합니다. 또한 위치 서비스에 대한 권한이 받아들여졌다면 monitorBeacons 메소드를 통해 비콘의 영역을 Monitoring 합니다.


먼저 현재 Monitoring이 가능한 상태라면 Monitoring 을 진행합니다. 이에 앞서 notifyEntryStateOnDisplaytrue 로 설정함으로써 디바이스가 이미 영역 안에 있거나 앱이 실행되고 있지 않은 상황에서도 영역 내부안에 들어오면 백그라운드에서 앱을 실행시켜 해당 notification을 받을 수 있게 합니다. 


또한 notifyOnExitnotifyOnEntry 를 통해 영역 안에 들어온 순간, 나간 순간에 해당 notification을 받을 수 있게 합니다.

그리고 하나의 비콘 영역의 객체는 다음과 같이 생성합니다.

self.beaconRegion = CLBeaconRegion(proximityUUID: UUID(uuidString: "UUID")!, identifier: "IDENTIFIER")

UUID는 비콘 디바이스에 설정된 값으로 작성해야하고 identifier는 임의의 식별할 수 있는 값으로 설정해주시면 됩니다.

이렇게 Monitoring이 실행된 후 영역의 판단이 이루어지는 순간에 다음 메소드가 실행됩니다.


.inside.outside 는 각각 영역 안에 들어온 순간과 나간 순간을 의미하며 그 순간에 동작해야할 코드들을 이에 맞게 작성해주면 됩니다. 저는 영역안에 들어왔을 때 해당 비콘과의 근접도를 측정하는 Ranging 을 시작하게 하였고 영역을 나가는 순간 Ranging 을 멈추는 행위를 작성하였습니다.


그리고 위의 메소드는 다음의 두 메소드를 추가로 호출합니다.


그리고 다음 메소드를 통해 Ranging 의 결과에 따른 코드를 작성해줄 수 있습니다.


현재 Ranging 이 가능한 비콘들 중 하나를 뽑아 근접도에 따른 코드를 작성할 수 있습니다.


마무리

오늘은 이렇게 비콘을 활용하여 프로젝트를 진행하기 위해 알아야 하는 몇 가지에 대해 간단히 기록을 해보았습니다. 이후에는 메소드 단위로 정확히 어떤 상황에 어떻게 사용해야하는지에 대해 공부해보고 이에 대해 정리해보는 시간을 갖도록 하겠습니다. 감사합니다.


참고자료


  1. Getting started with iBeacon
  2. Determining the Proximity to an iBeacon
  3. Beacon ranging in Background
  4. Getting started with iBeacon : A Swift Tutorial
  5. iOS iBeacon Background Region Monitoring
  6. What are region Monitoring and Ranging?