[iOS] Core Location Framework
Core Location framework
기기의 방향 및 지리적 위치를 확인한다.
Core Location은 기기의 지리적 위치, 높이(고도,해발) 방향을 측정서비스, 또는 근처 아이비콘 기기의 상대적인 위치를 제공한다.
프레임워크는 Wi-Fi, GPS, Bluetooth, 자기계, 기압계, cellular hardware를 포함하는 기기의 사용가능한 모든 주요구성을 이용하여 데이터를 수집한다.
CLLocationManager 클래스의 인스턴스를 사용하여 Core Location 서비스의 구성, 시작 및 중지 한다.
locationManager 객체가 지원하는 설명된 위치관련 활동은 다음과 같다.
표준 및 중요 위치 업데이트 : 구성가능한 정확도로 사용자 현재위치에서 크거나 작은 변화를 추적한다
영역 감시 : 사용자가 해당영역 진입 또는 이탈시 별개의 관심 영역을 모니터링하고 위치 이벤트를 생성한다
Beacon 영역: 근처의 비콘 위치검색
나침반 방향: 탑재된 나침반으로부터 방향의 변화를 보고
위치 서비스를 사용하기위해 앱은 허가를 요청하고, 시스템이 사용자에게 수락 및 거절하도록 요청한다
iOS 기기에서 사용자는 설정 앱에서 언제든지 위치 서비스 설정을 변경할 수 있어 개별 앱이나 장치 전체에 영향을 미칠 수 있다. 앱은 CLLocationManagerDelegate 프로토콜에 부합하는 locationManager의 델리게이트 객체에서 승인 변경을 포함한 이벤트를 수신한다.
CllocationManager
앱에서 위치관련 이벤트 전송을 시작하고 멈추기위해 사용하는 객체
CLLocationManagerDelegate 프로토콜을 준수하여 delegate 프로퍼티에 사용자 지정 객체를 할당합니다.
어떤 위치 서비스를 시작하기 전에 delegate 할당한다.
시스템은 locationManager가 생성되면 즉시 delegate의 locationManager(_ : didChangeAuthorization :) 메소드를 호출합니다. 모든 위치 및 방향 관련 업데이트 및 이벤트가 해당 delegate에게 전달됩니다.
CLAuthorizationStatus
위치 서비스를 사용할 수 있는 앱의 권한을 나타내는 상수이다.
CLAuthorizationStatus (enum)
authorizedAlways, authorizedWhenInUse (항상, 사용 할때만)
restricted, denied (권한없음, 거부)
notDetermined (미선택)
locationManager의 delegate 메소드인 locationManager(_:didChangeAuthorization:)에서 승인 상태변경을 처리하면 된다.
distanceFilter
distanceFilter 프로퍼티: 업데이트 이벤트가 생성되기전 기기가 수평으로 움직여야하는 미터로 측정된 최소 거리
이 거리는 이전에 전달된 위치에 대해 측정된다. 이 속성의 기본값은 kCLDistanceFilterNone이며 (상수 -1.0), 모든 이동에 대해 통지한다.
이 속성은 표준 위치 서비스와 함께만 사용되며 중요한 위치 변경을 모니터링할 때 사용되지 않는다.
allowsBackgroundLocationUpdates
allowsBackgroundLocationUpdates 프로퍼티: 앱이 중지되었을 때 위치 업데이트를 받을지를 표시하는 boolean 값
중지된 경우 위치 업데이트를 수신하려는 앱은 앱의 Info.plist 파일에 UIBackgroundModes 키(위치 값 포함)를 포함해야 하며 이 속성의 값을 참으로 설정해야 한다. Background Update에 위치 값을 가진 UIBackgroundMode 키의 존재가 필요하다.이 속성을 사용하여 Background Update를 프로그램적으로 활성화하고 비활성화한다. 예시로 사용자가 Background Update가 필요한 앱의 기능을 활성화한 후에만 이 속성을 true으로 설정할 수 있다. (기능 활성화 없이 true만 넣었더니 크래쉬남)
이 속성의 값이 false일 때 앱은 현재 권한 부여에 따라 foreground 또는 background에서 실행되는 동안 일반적으로 위치 업데이트를 받는다. 앱이 중지된 때만 업데이트가 중지되므로 앱이 깨어 나서 이벤트를 처리하지 못한다.
이 속성의 기본값은 false입니다.앱의 Info.plist 파일에서 UIBackgroundMode 키와 위치 값을 누락하였으나, 속성 값을 true으로 설정하는 것은 프로그래머 오류이다.(..크래쉬 발생 시켰던 나의 행동을 말하는 듯 하다.)
desiredAccuracy
desiredAccuracy 프로퍼티: 위치 데이터의 정확도
kCLLocationAccuracyBestForNavigation : 추가 센서 데이터를 사용하는 가장 높은 정확도
(네비게이션 앱에 적합하며, 추가 전력소비 때문에 플러그인된 동안만 이 수준의 정확도를 사용)
kCLLocationAccuracyBest : 가능한 최고의 정확도 수준
(매우 높은 정확도를 원하지만, 네비게이션 수준이 아닐때 사용)
kCLLocationAccuracyNearestTenMeters : desired target에서 10미터 이내 정확
kCLLocationAccuracyHundredMeters : 100미터 이내 정확
kCLLocationAccuracyKilometer : 가장 가까운 km까지 정확
kCLLocationAccuracyThreeKilometers : 가장 가까운 3km까지 정확
수신기는 요청된 정확도를 달성하기 위해 최선을 다한다. 그러나 실제 정확도는 보장되지 않는다.
이 속성에 사용 시나리오에 적합한 값을 할당해야 한다. 예를 들어, 현재 위치가 1 킬로미터 이내에만 필요한 경우 kCLLocationAccuracy 킬로미터를 지정해야 하며 kCLLocationAccuracy 탐색을 지정해야 한다. 정확도가 높은 위치를 결정하려면 더 많은 시간과 더 많은 전력이 필요하다.
고정밀 위치 데이터를 요청할 때 위치 서비스에서 전달된 초기 이벤트는 요청한 정확도를 갖지 못할 수 있다. 위치 서비스는 초기 이벤트를 가능한 한 빨리 전달한다. 그런 다음 요청한 정확도로 위치를 계속 결정하고 필요한 경우 추가 이벤트를 전달한다.
iOS 및 macOS의 경우, 이 속성의 기본 값은 kCLLocationAccureacyBest이다. WatchOS의 경우 기본값은 kCLLocationAccureacy HundredMeters이다.
이 속성은 표준 위치 서비스와 함께만 사용되며 중요한 위치 변경을 모니터링할 때 사용되지 않는다.
activityType
activityType 프로퍼티: 사용자의 행동과 위치 업데이트를 고려한 타입
CLActivityType (enum)
other - (기본 값)locationManager가 알려지지 않은 활동에 사용되고 있다.
automotiveNavigation - locationManager가 차량운행 중에 위치 변경 추적을 위해 사용되고 있다.
(차량이 장기간 움직이지 않을 때만 위치 업데이트를 중지 할 수 있다.)
fitness - locationManager가 걷기, 달리기, 자전거 등과 같은 활동을 추적하는데 사용되고 있다.
(사용자가 일정 기간동안 상당한 거리를 이동하지 않을 때만 위치 업데이트를 중지 할 수 있다. 해당 설정시 실내 위치설정이 비활성화 됨 )
otherNavigation - locationManager가 자동차와 상관없는 다른 유형의 차량 운행에 대한 움직임을 추적하는데 사용되고 있다.
(전동 킥보드, 오토바이등 떠올렸었으나, 애플문서에는 보트, 기차, 또는 비행기의 운행을 언급하고 있다.)
airborne - 공중 활동중에 특별히 사용되고 있다.
(이걸....쓰려나? 했는데... 요근래 드론관련 서비스를 떠올려 본다.)
locationManager는 위치 업데이트가 자동으로 중지 될 수 있는 시점을 결정하기 위해 이 속성의 정보를 큐신호(레디~액션!)로 사용한다. 업데이트 중지하면 사용자의 위치가 변경되지 않을 경우 시스템을 통해 전력을 절약할 수 있습니다. 예를 들어, 활동 유형이 CLActivityType.automotiveNavigation일경우 최근 위치 변화가 발생하지 않은 경우, 이동이 다시 감지 될 때까지 라디오가 전원을 꺼 놓을 수 있다.
중지가 발생한 후, 위치 서비스를 다시 시작해야 한다고 판단할 때 다시 시작해야 한다. 중지 후 위치 서비스를 다시 시작하는 방법에 대한 자세한 내용은 pausesLocationUpdatesAutomatically 프로퍼티에 대한 논의를 참조.
---------------------------------------------------------------------------------------------------
Type alias CLLocationDistance, CLLocationAccuracy, CLLocationDegrees = Double
(3가지 형식이 많이 보여 뭐지 싶었는데 뭐 없다)
Beacon이라는 녀석도 언급되길래 그냥 심심해서 찾아 보았다. 역시 하나를 찾으면 꼭 하나에서 끝나는 경우가 없는 것같다.
무선 통신이라는 공통점?을 갖는! connection mode라는 특징이 있는 10미터이내의 Nfc,
advertise or broadcast Mode 특징이 있는 50미터이내의 bluetooth beacon
1:1 역할에따른 기기구분master slave
슬레이브 (connectable advertising signal) 주기적 송신 -> 연결 요청을 수락 -> 타이밍을 맞춰 채널을 같이 호핑
마스터 (connectable advertising signal) 주기적 스캔 -> 적절한 디바이스에 연결요청 -> 타이밍 설정 주기적 데이터 교환
Advertiser
Non-connectable advertising packet(소량)주기적으로 발송
observer
듣기위해 주기적 스캔
이정도로 맛보고 다음기회에 알아보려 한다.