Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- github
- Realm
- Archive
- Xcode
- geofencing
- Code
- Session
- 한글
- 웹뷰
- Notification
- darkmode
- appstore
- UIButton
- error
- window
- iOS16
- SwiftUI
- mac
- Firebase
- rxswift
- IOS
- Apple
- MacOS
- stack
- Git
- JPA
- 개발자
- view
- FLUTTER
- Swift
Archives
- Today
- Total
EEYatHo 앱 깎는 이야기
Swift ) Geofencing 본문
반응형
개요
이 글 지오펜싱 튜토리얼이 아닌, 아래 지오펜싱 관련하여 WWDC, Document들을 정리하고, 직접 실험하여 알아낸 중요한 사실들을 정리
- WWDC23 ) 간소화된 location updates 알아보기
- Document ) 지리적 지역 근접성 Monitoring
- Document ) Core Location Monitor 소개
- Document ) iBeacon 장치와의 근접성 확인 (iBeacon 장치 감지, 거리 확인, +앱살리기)
- WWDC19 ) CoreLocation 새로운 소식 (iOS13)
- Document ) iOS 기기를 iBeacon 기기로 전환
지오펜싱 (Geofencing)
- 사용자의 위치가 미리 지정한 특정 위치(지오펜스)에 들어가거나 나갈 때 트리거되는 이벤트를 처리하는 기술
- CoreLocation 프레임워크를 사용해 지오펜싱을 구현
- 현재 위치가 Region의 안인지 밖인지 “상태”를 “모니터링”하는 기술
꺼져있는 앱 살리기 (Terminated 상태)
- 꺼져있는 앱은 Condition 모니터링(흔히 지오펜싱이라고 부름)을 이용해서 백그라운드로 살릴 수 있음 (앱 스위쳐에 보이진 않음)
- WWDC 2023에 소개된 새로운 API인 CLMonitor을 활용하려면, 최소지원 iOS17 필요
- iOS 17 미만의 경우, locationManager의 delegate를 활용하는 방식으로 해야함
- 꺼져있는 앱을 살리려면 “항상 허용” 위치 권한이 필요함
- iOS 13부터, 앱이 꺼져있을때 서비스가 필요할 경우에만 “항상 허용” 권한이 필요함
- 앱이 켜져있거나 백그라운드에서만 필요한 경우에는 “사용 중 허용” 만 있으면 됨
- 2가지의 모니터링할 수 있는 조건(Condition)이 있음
- 지리적 지역(geographic region) 설정
- 관련 키워드 Region Monitoring, CircularGeographicConfition, CLCircularRegoin
- 위도, 경도 설정한 지역에 들어가거나 나올때 앱을 살림
- 최대 20개 지역 가능
- iBeacon보다 정확도 떨어짐
- iBeacon보다 배터리소모 많음
- 최고 정확도 실험 결과
- 앱이 살아있을 경우: out 100m, in 40m (비교적 일정한 거리에서 작동)
- 꺼져 있을 경우: out 150~200m, in 15~30m (비교적 거리가 들쭉날쭉함)
- 배터리 평소보다 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? 부터 사용 가능)
- 지리적 지역(geographic region) 설정
위치 “항상 허용” 권한을 처음 제대로 받을 수 없음
- 처음엔 반드시 “사용 중 허용”으로만 받으며, “임시 항상 허용” 권한을 가지게됨 (iOS 13부터)
- 임시 권한일 경우, 앱이 “사용 중”이 아닐 때 CoreLocation이 모니터링을 진행은 하지만, 발생한 이벤트를 보관만하고 대리자에게 전달하진 않음
- 이벤트가 보관되었을 때, “항상 허용” 권한으로 업그레이드하기 위한 팝업을 띄울 적절한 타이밍을 기다림
- 팝업 노출 후 “항상 허용”으로 업그레이드 되었다면, 이벤트가 대리자에게 전달됨
- 팝업 노출 후 업그레이드 되지 않고 “사용 중 허용”으로 남는다면, 이벤트는 소멸됨
- 이벤트가 너무 오랬동안 대기되었다면 이벤트는 소멸됨
- 너무 오래된 위치 정보는 유저의 컨텍스트와 맞지 않기 때문
- 이 때문에, 처음 위치 권한을 얻을 때, 컨텍스트가 잘 맞지 않을 수 있음
- (이걸 모른채로 실험 할 떄, 화면이 꺼저있을 때, 잠겨있을 때, 다른 앱 사용 중일 때 자꾸 반응이 없어서 골치 아팠었음..)
- 궁금한 점
- “임시 항상 허용” 권한일 때, 이벤트를 보관할 때 앱을 살리는가?? → 실험 결과, 살리지 않음
모니터링으로 앱이 시작되면, 동일한 식별자로 모니터를 다시 만드는 것은 개발자의 책임
- 그렇지 않으면, 모니터링의 연속성이 깨짐
재부팅 했을 경우, 모니터링은 사용자가 기기를 잠금 해제한 후에만 발생할 수 있음
- 재부팅 후 위치 서비스가 부팅하는 시간은 몇초? 몇분?
모니터링은 항시 유지해야함
- 모니터링을 걸지않았을 때 이벤트가 발생하면, 해당 이벤트는 증발
- 지역에서 나갔는데 또 나가는 이상한 컨텍스트가 생길 수 있음
Monitoring ≠ Ranging
- Ranging : Background, Foreground 가능. 적극적으로 비콘과의 거리를 계산
- Monitoring : Terminate 에서도 가능. 영역 범위를 나가거나 들어오는 것을 감지.
Beacon Ranging은 정확한 거리를 제공하지 않으며, 비콘 신호의 강도에 의존하여 직접 해당 정보를 계산해서는 안됨
- 상대적 값을 사용하여 적절한 조치 과정을 결정합니다.
- Immediate < Near < Far < Unknown
Comments