본문 바로가기
YAGOM CAREER STARTER

[TIL] 20230509: Core Location, Getting the current location of a device

by Rhode 2023. 5. 9.

본문은 야곰 아카데미 커리어 스타터 캠프를 통해 학습한 내용을 회고한 글입니다.


Core Location

디바이스의 지리적 위치와 방향을 얻는다.

iOS 2.0+ iPadOS 2.0+ macOS 10.6+ Mac Catalyst 13.0+ tvOS 9.0+ watchOS 2.0+

Overview

Core Location은 디바이스의 지리적 위치, 고도, 방향 또는 근처의 iBeacon 디바이스와 관련된 위치를 결정하는 서비스를 제공한다. 이 프레임워크는 Wi-Fi, GPS, Bluetooth, 자력계, 기압계, 그리고 셀룰러 하드웨어를 포함한 디바이스의 모든 가능한 요소들을 사용하여 데이터를 수집한다.

CLLocationManager 클래스의 인스턴스를 사용하여 Core Location 서비스를 구성, 시작, 그리고 중지할 수 있다. location manager object는 다음의 위치와 관련된 활동들을 지원한다:

  • 일반적인 혹은 중요한 위치 업데이트: 구성할 수 있는 정확도로 사용자의 현재 위치에서 크고 작은 변화를 추적한다.
  • 지역 모니터링: 개별 관심 지역을 모니터링하고 사용자가 해당 지역에 들어가거나 나갈 때 위치 이벤트를 생성한다.
  • Beacon 배열: 주변의 beacon을 감지하고 찾는다.
  • 방향 탐색: 온보드 나침반에서 방향 변경을 보고한다.

위치 서비스를 사용하기 위해, 앱은 승인을 요청하고 시스템은 요청을 승인하거나 거부하라는 메시지를 표시한다. 초기의 요청은 다음의 그림에 나와있다.

 

 

iOS기기에서, 사용자는 언제든지 설정 앱에서 위치 서비스 설정을 변경하여 개별 앱 혹은 기기 전체에 영향을 미칠 수 있다. 앱은 CLLocationManagerDelegate 프로토콜을 준수하는 location manager의 delegation object에서 승인 변경을 비롯한 이벤트를 수신한다.


 

Getting the current location of a device

위치 서비스를 시작하고 시스템이 해당 서비스의 전력 사용을 최적화하는 데에 필요한 정보를 제공한다.

Overview

Core Location은 위치 관련 데이터를 얻기 위한 다양한 서비스를 제공하지만, 가장 일반적인 서비스들은 디바이스의 현재 위치를 반환하는 업무를 한다. 이 정보를 사용하여 다음을 수행할 수 있다:

  • 도보로든, 차로든, 혹은 다른 이동 수단을 이용해서든 네비게이션을 용이하게 한다.
  • 주변 관심 지점을 식별한다.
  • 사람과의 근접성을 기준으로 검색 결과를 필터링한다.
  • 지도에 사람의 위치를 표시한다.
  • 사람의 위치를 친구와 공유한다.
  • 사진의 위치를 태그한다.
  • (상태를 확인하거나, 정보를 얻기 위해) 소셜미디어와 접촉한다.
  • 운동이나 하이킹중에 이동하는 경로를 추적한다.

Core Location은 Wi-Fi, 셀룰러 그리고 GPS 무선기기 등을 포함한 다양한 유형의 하드웨어를 사용하여 현재 위치를 확인할 수 있다. Core Location은 위치를 결정하기 위해 이 모든 무선기기들이 필요로 하지는 않는다. 대신에, 필요한 위치 데이터를 가장 전력 효율적인 방법으로 얻기 위해 무선기기들을 선택적으로 활성화한다. CLLocationManger object의 구성은 어떤 무선기기를 시스템이 사용할지 여부와 앱의 전력 소모에 영향을 준다.

Start the service that delivers the location data you need

항상 앱의 요구사항을 충족하는 가장 전력 효율적인 위치 서비스를 선택하라. Core Location은 위치 데이터를 얻기 위해 다음과 같은 서비스들을 제공한다:

  • Visits 위치 서비스는 위치 데이터를 얻는 가장 전력 효율적인 방법을 제공한다. 시스템은 누군가 방문하는 장소와 그곳에서 보내는 시간을 모니터링하고 나중에 해당 데이터를 제공한다. 이 서비스를 시작하기 위해서는 startMonitoringVisits() 메서드를 호출하면 된다.
  • Significant-change 위치 서비스는 위치 업데이트를 받을 수 있는 저전력 방법을 제공한다. 이 서비스는 셀룰러 혹은 Wi-Fi 무선기기(GPS 아님)를 사용하여 상당히 먼 거리를 초과하는 위치 변경만을 보고한다. 이 서비스를 시작하기 위해서는 startMonitoringSignificantLocationChanges() 메서드를 호출하면 된다.
  • Standard위치 서비스는 가장 정확하고 규칙적인 위치 데이터를 제공하지만 다른 서비스보다 더 많은 전력을 사용한다. 앱에서 turn-by-turn 네비게이션을 제공하거나 이벤트의 정확성이나 빈도가 높아야할 경우 주로 사용한다. 이 서비스를 시작하기 위해서는 startUpdatingLocation()메서드를 호출할 수 있고, 단일한 위치 이벤트를 얻기 위해서는 requestLocation() 메서드를 호출할 수 있다.

위치 서비스를 즉시 시작해야하는 앱은 거의 없으며, 그러한 서비스들을 오랜시간동안 계속 실행해야하는 앱은 더 없는 편이다. 누군가 해당 정보가 필요한 방식으로 앱과 상호작용하기 전까지 위치 서비스를 지연하라. 그런 다음 필요한 위치 데이터를 확보하는 즉시 서비스를 중지하여 배터리 수명을 유지하라. 예를 들어, 검색한 결과를 한 번 필터링 하기 위해 현재 위치만 필요한 경우 서비스를 중단하라.

위치 서비스에 대한 지원을 추가할 때 delegate object에서 관련된 모든 메서드를 구현해야한다. Standard와 Significant-change 위치 서비스는 같은 delegate 메서드를 사용하지만, Visits 서비스는 방문별 데이터를 수신하기 위해 다른 메서드를 사용한다.

각각의 서비스의 동작과 어떻게 그 서비스들을 동작하고 중지하는지에 대해 알아보기 위해서는 CLLocationManager를 참고하라.

Enable power-saving features

Core Location은 전력 사용을 최대한 최적화하지만 여전히 도움이 될 수 있다. 최상의 최적화는 앱에 새 위치 데이터가 필요하지 않을 때 위치 서비스를 끄는 것이다. 다른 최적화를 위해서는 location manager object의 구성을 조정해야한다:

  • 필요한 정보를 제공하는 가장 큰 값으로 distanceFilter 프로퍼티를 설정하라. 값이 높을 수록 시스템이 무선 하드웨어를 더 자주 끌 수 있다.
  • 원하는 정보를 제공하는 가장 낮은 값으로 desiredAccuracy 프로퍼티를 설정하라. 정확도 값이 낮으면 시스템에서 전력 효율이 더 높은 하드웨어를 사용할 수 있다. 값이 낮을 수록 시스템이 하드웨어를 더 빨리 끌 수 있다.
  • activityType 프로퍼티를 적절한 값으로 구성하라, 그리고 pausesLocationUpdatesAutomatically 프로퍼티를 true로 설정하라. Core Location은 activity type을 사용하여 조건이 허용될 때 자동으로 하드웨어를 끈다. 예를 들어, 만약 acitivity type이 CLActivityType.automotiveNavigation이고 누군가의 위치가 변경되지 않는다면, 시스템은 새로운 움직임을 감지할 때까지 무선 하드웨어를 끌 수 있다.
  • 백그라운드 위치 업데이트가 실제로 필요하지 않은 경우, allowsBackgroundLocationUpdates 프로퍼티를 false로 설정하라.

전력 사용량을 개선하는 또 다른 방법은 앱의 Info.plist 파일에 값이 true인 NSLocationDefaultAccuracyReduced key를 추가하는 것이다. 필요에 따라 정확도가 낮은 위치 데이터로도 충분한 경우 이 key를 포함하라. 예를 들어, 운전거리 내에 있는 레스토랑 목록을 반환하는 앱에는 누군가의 정확한 위치가 필요하지 않다. 필요에 따라 언제든지 위치 관리자를 사용하여 나중에 더 정확한 데이터를 요청할 수 있다. 이 때, 시스템은 각 요청을 승인하라는 메시지를 디바이스 소유자에게 표시한다.

'YAGOM CAREER STARTER' 카테고리의 다른 글

[TIL] 20230515: CoreData/SQLite/Realm  (0) 2023.05.17
[TIL] 20230508: Mirror  (0) 2023.05.09
[토요스터디A반] 20230408: KeyChain  (0) 2023.04.14
[TIL] 20230411: URL Loading System  (0) 2023.04.14
[TIL] 20230404: URLSession  (0) 2023.04.05