EEYatHo 앱 깎는 이야기

Swift ) Geofencing 본문

iOS, Swift/Geofencing

Swift ) Geofencing

EEYatHo 2024. 11. 26. 10:10
반응형

개요

이 글 지오펜싱 튜토리얼이 아닌, 아래 지오펜싱 관련하여 WWDC, Document들을 정리하고, 직접 실험하여 알아낸 중요한 사실들을 정리

 

지오펜싱 (Geofencing)

  • 사용자의 위치가 미리 지정한 특정 위치(지오펜스)에 들어가거나 나갈 때 트리거되는 이벤트를 처리하는 기술
  • CoreLocation 프레임워크를 사용해 지오펜싱을 구현
  • 현재 위치가 Region의 안인지 밖인지 “상태”를 “모니터링”하는 기술

 

 

꺼져있는 앱 살리기 (Terminated 상태)

  • 꺼져있는 앱은 Condition 모니터링(흔히 지오펜싱이라고 부름)을 이용해서 백그라운드로 살릴 수 있음 (앱 스위쳐에 보이진 않음)
    • WWDC 2023에 소개된 새로운 API인 CLMonitor을 활용하려면, 최소지원 iOS17 필요
    • iOS 17 미만의 경우, locationManager의 delegate를 활용하는 방식으로 해야함
  • 꺼져있는 앱을 살리려면 “항상 허용” 위치 권한이 필요
    • iOS 13부터, 앱이 꺼져있을때 서비스가 필요할 경우에만 “항상 허용” 권한이 필요함
    • 앱이 켜져있거나 백그라운드에서만 필요한 경우에는 “사용 중 허용” 만 있으면 됨
  • 2가지의 모니터링할 수 있는 조건(Condition)이 있음
    1. 지리적 지역(geographic region) 설정
      • 관련 키워드 Region Monitoring, CircularGeographicConfition, CLCircularRegoin
      • 위도, 경도 설정한 지역에 들어가거나 나올때 앱을 살림
        • 최대 20개 지역 가능
        • iBeacon보다 정확도 떨어짐
        • iBeacon보다 배터리소모 많음
      • 최고 정확도 실험 결과
        • 앱이 살아있을 경우: out 100m, in 40m (비교적 일정한 거리에서 작동)
        • 꺼져 있을 경우: out 150~200m, in 15~30m (비교적 거리가 들쭉날쭉함)
      • 배터리 평소보다 2배는 빨리 닳는듯
    2. iBeacon 펌웨어 이용 (Beacon Monitoring)
      • 관련 키워드 Beacon Monitoring, BeaconIdentityCondition, CLBeaconRegion, CLBeaconIdentityConstraint
      • iBeacon는 실내 측위를 주목적으로 하는 애플에서 제안한 Beacon의 한 종류
      • BLE(Bluetooth Low Energy) 기술을 활용하여 구현
      • iBeacon은 BLE의 communication 과정중 알림(advertising)만을 사용
        • iBeacon의 주목적이 데이터 교환이 아니라 특정 ID가 부여된 장비에 대한 존재유무 파악이기 때문
      • 아이폰을 iBeacon으로 사용 가능
    • 위 두 방법 모두 앱을 살릴 때 실행 방법은 location” 임
    • startMonitoring 으로 지리적 region이든 beacon region이든 모니터링에 추가
      • 명시적으로 중지하거나, 재부팅하기 전까지 계속 모니터링함
      • CLMonitor을 사용할 경우, region으로 condition을 만들어서, condition을 모니터에 추가하는 형태 (iOS 17? 18? 부터 사용 가능)

 

위치 “항상 허용” 권한을 처음 제대로 받을 수 없음

  • 처음엔 반드시 “사용 중 허용”으로만 받으며, “임시 항상 허용” 권한을 가지게됨 (iOS 13부터)
  • 임시 권한일 경우, 앱이 “사용 중”이 아닐 때 CoreLocation이 모니터링을 진행은 하지만, 발생한 이벤트를 보관만하고 대리자에게 전달하진 않음
    • 이벤트가 보관되었을 때, “항상 허용” 권한으로 업그레이드하기 위한 팝업을 띄울 적절한 타이밍을 기다림
    • 팝업 노출 후 “항상 허용”으로 업그레이드 되었다면, 이벤트가 대리자에게 전달됨
    • 팝업 노출 후 업그레이드 되지 않고 “사용 중 허용”으로 남는다면, 이벤트는 소멸됨
    • 이벤트가 너무 오랬동안 대기되었다면 이벤트는 소멸됨
      • 너무 오래된 위치 정보는 유저의 컨텍스트와 맞지 않기 때문
  • 이 때문에, 처음 위치 권한을 얻을 때, 컨텍스트가 잘 맞지 않을 수 있음
    • (이걸 모른채로 실험 할 떄, 화면이 꺼저있을 때, 잠겨있을 때, 다른 앱 사용 중일 때 자꾸 반응이 없어서 골치 아팠었음..)
  • 궁금한 점
    • “임시 항상 허용” 권한일 때, 이벤트를 보관할 때 앱을 살리는가?? → 실험 결과, 살리지 않음

 

모니터링으로 앱이 시작되면, 동일한 식별자로 모니터를 다시 만드는 것은 개발자의 책임

  • 그렇지 않으면, 모니터링의 연속성이 깨짐

 

재부팅 했을 경우, 모니터링은 사용자가 기기를 잠금 해제한 후에만 발생할 수 있음

  • 재부팅 후 위치 서비스가 부팅하는 시간은 몇초? 몇분?

 

모니터링은 항시 유지해야함

  • 모니터링을 걸지않았을 때 이벤트가 발생하면, 해당 이벤트는 증발
  • 지역에서 나갔는데 또 나가는 이상한 컨텍스트가 생길 수 있음

 

Monitoring ≠ Ranging

  • Ranging : Background, Foreground 가능. 적극적으로 비콘과의 거리를 계산
  • Monitoring : Terminate 에서도 가능. 영역 범위를 나가거나 들어오는 것을 감지.

 

Beacon Ranging은 정확한 거리를 제공하지 않으며, 비콘 신호의 강도에 의존하여 직접 해당 정보를 계산해서는 안됨

  • 상대적 값을 사용하여 적절한 조치 과정을 결정합니다.
  • Immediate < Near < Far < Unknown

 

Comments