[iOS] Customizing Location Manager

RudinP·2024년 3월 28일
0

Study

목록 보기
210/226

distanceFilter


LocationManager는 기본적으로 새로운 위치 업데이트가 있을 때마다 didUpdateLocations 메소드를 반복적으로 호출한다.

  • 이 속성의 기본 값은 kCLDistanceFilterNone이며, 모든 위치 데이터를 전달해준다.
  • 최소 거리를 미터단위로 설정해주면 미터 이상 움직였을 때만 새로운 데이터가 전달된다.
let manager = CLLocationManager()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        manager.delegate = self
        manager.distanceFilter = 100  
    }
  • 이렇게 설정하면 100m 이상 이동하였을 때만 새로운 데이터가 전달된다.

desiredAccuracy

  • 위치 데이터의 정확도를 설정하는 프로퍼티
  • 사용자가 정확한 위치 사용을 거부하였을 경우, 이 프로퍼티에 어떤 값을 저장해도 사용되지 않는다. 대신 kCLLocationAccuracyReduced를 사용한다.
  • iOS에서는 기본값이 kCLLocationAccuracyBest으로, 최대한 정확한 위치를 제공한다.
  • 다른 OS에서는 100m가 기본값이다.

  • 위로 갈수록 정확도가 높아지고, 아래로 갈수록 정확도가 낮아진다.

Background Location Updates

기본적으로 startUpdatingLocation이 시작된 뒤, 앱이 백그라운드 실행으로 바뀌면 다시 포어그라운드로 바뀌기 전까지 이벤트 전달이 중지된다.

  • 만약 백그라운드에서도 이벤트를 받고 싶다면, Info.plist 에서 UIBackgroundModes 키를 포함해야 한다.
  • 네비앱이나, 운동앱이라면 백그라운드에서도 위치를 받아야 한다.

Signing & Capabilities

  • 좌상단의 +Capability를 클릭해 Background Modes를 추가한다.
  • 마찬가지로 크래시가 발생하면 Info.plist에서 추가하자..^^

allowsBackgroundLocationUpdates

override func viewDidLoad() {
        super.viewDidLoad()
        
        manager.delegate = self
        manager.allowsBackgroundLocationUpdates = true
    }
  • 필요한 vc에서 allowsBackgroundLocationUpdates를 true로 해준다.
  • 다만 백그라운드에서도 이벤트 업데이트를 받게 되면 배터리 소모가 심해지기 때문에 적재적소에만 사용하도록 하자.

One-time Location

startUpdatingLocation으로 이벤트를 받기 시작할 경우, stopUpdatingLocation을 하거나 앱이 백그라운드로 이동하기 전까지는 이벤트를 계속 전달하게 된다.
만약 사용자의 위치가 한 번만 필요할 경우, requestLocation을 사용하도록 하자.

requestLocation

  • didUpdateLocations가 한 번만 실행된다.
  • 배터리를 아낄 수 있다.

Activity Type

  • 위치 데이터를 어떤 용도로 사용하는지 저장해두면 배터리 절약에 도움이 된다.
  • .automotiveNavigation으로 설정할 경우 움직임이 없을 때 iOS가 움직임을 감지하기 전까지 하드웨어를 꺼둘 수 있다.
    • 하드웨어를 끈 다음에 자동으로 재시작하지 않기 때문에, 다시 움직였다면 업데이트하도록 개발자가 별도로 코드를 짜야 함.
    • 위의 방법이 귀찮다면, pausesLocationUpdatesAutomatically에 false를 저장하자.
  • CLActivityType의 기본값은 .other이다.

profile
곰을 좋아합니다. <a href = "https://github.com/RudinP">github</a>

0개의 댓글