SWIFT개발

CoreLocation과 Battery의 관계

2료일 2024. 4. 21. 21:48

바로 직전의 글에서 CoreLocation을 이용해 위치를 가져오는 기능을 구현하였다.... 근데...핸드폰이 뜨겁다.. 나라도 이 앱안쓸듯?

그래서 어떻게 하면 효율적으로 사용할수 있을지 체크하며 개선하는 작업이 필요하다.

애플에서는 background location을 측정할수 있는 3가지 방법이 존재한다고 한다. 

 

 

1.  Xcode Gauges

를 이용하면 xcode내에서 CPU, Network, 위치 사용량 등 시스템 사용량에 대한 정보를 제공한다. 또한 시간대로 위치사용이 앱에 미치는 영향을 보여준다. 그래서 내가 궁금했던 corelocationManager를 어떻게 관리해야 enegery를 가장 아끼고 우리가 원하는대로 사용할 수 있을지 지금부터 체크해보겠습니다.

배터리? distanceFilter? no상관이다!!!!쾅쾅

흠.. 원래는 distanceFilter를 늘려가며 배터리의 성능을 체크하여 연관성을 그래프로 비교하며 구하려 했어요..그런데??

https://stackoverflow.com/questions/5490707/does-cllocationmanager-distancefilter-do-anything-to-conserve-power
여기서 내가 distanceFilter에 뭘하든 배터리성능향상에 그렇게 도움이 되지않을거라는 문서를 발견했다. distanceFilter는 단지 내가 이벤트를 너무 자주 하지 않도록 빈도를 결정해주는 것 즉 didupdate가 얼마나 불려질꺼인지를 결정해주는 것으로 배터리를 아끼는것과는 상관이 없다. 생각해보면 예를 들어 30m으로 distanceFilter를 정했다면 내 device는 계속해서 추적하다가 어? 30m됐네? 자 이벤트 드가자~ 이런 느낌이라서 배터리의 효율과는 별개이다!!!!어차피 기기는 계속 트래킹하니까

자! 그러면 CLLocationManager를 어떻게 하면 더 배터리를 아끼고 사용할 수 있을까?

정답은 distanceAccuracy에 있다.

distanceAccuarcy를 kilo로 하면 locationManager가 GPS를 끄고 와이파이와 cell radios에만 의존하여 배터리를 아낄 수 있다고 한다. 실제로 내가 측정을 하며 더 정확하게 설명해드리겠습니다.

1. DesiredAccuarcy = kCLLocationAccuracyBest

 

 

첫번째와 두번째는 이미지는 desiredAccuracy를 iOS에서 default 즉 kCLLocationAccuracyBest으로 세팅했을때이다. distanceFilter를 0으로 하건 1000으로 하건 메모리에서는 차이가 나지만 실제로는 둘다 너무 에너지 impact가 너무너무크다고 나온다..

2. DesiredAccuarcy = kCLLocationAccuracyThreeKilometers

3킬로미터 이내의 정확도로 desiredAccuarcy를 수정하면 현저히 낮아지는 것을 볼수 있다. distanceFilter를 0으로 넣건 1000으로 넣건 메모리측 차이밖에 나타나지 않는다는 것을 볼 수 있다.

이로써 우리는 distanceFilter는 배터리와 상관이 없고 DesiredAccuarcy와 관련이 있다는 것을 알 수 있다. 하지만 이 값의 desriedAccuarcy를 사용한다면 어떤일이 벌어지는지 해봤다..

단지 언덕을 내려왔을뿐인데 desiredAccuarcy를 저값으로 하고 distanceFilter를 20으로 하면 그냥 말도 안되는 경로가 찍힌다.... 우리가 원하는 것은 배터리의 효율도 중요하지만 정확도도 있어야 한다. 그래서 Pass

 

 

 

 

3. DesiredAccuarcy = kCLLocationAccuracyNearestTenMeters

10m이내의 정확도로 진행을 했다. 오..?에너지도 비슷하게 적게 들 뿐 아니라 정확도도 굉장히 높았다. 학교 한바퀴 돌았는데 경로가 정확히 잘 찍힌다. 그래서 우리의 앱에서는 10m이내의 정확도로도 충분하고 이것이 에너지의 효율에서도 좋다는 것을 발견을 하였다.

추가해서 백그라운드로 즉 앱의 잠금화면에서는 에너지 효율이 더 줄어 low까지 떨어지는 것을 확인하였다.!! 

2. MetricKit

cumlativeBackgroundLocationTime을 통해 백그라운드에서 얼마나 위치서비스를 이용하였는지 알수 있다.

근데...이건 앱스토어에 등록을 해야 사용할수 이씀...ㅠ

3. control center는 ios16부터 가능. 핸드폰맨위에서 아래로 스와이핑하면 어떤 위치서비스가 사용중인지 알수 있다.

 

 

또한 배터리를 개선하는 작업에는 defer work! 작업을 미뤄라도 있다.

1. BGProcessingTask: 오래 걸리는 작업들을 기기가 충전하는 시간에 하게 한다.

ex) DB cleanup, 백업, 머신 러닝 훈련할때

2. Discretionary URLSession: 적절한 시간대에 네트워크가 가능하게 미룬다. ex) 기기충전할때나 와이파이될때, 영상다운

3. 푸쉬에 우선순위를 주어서 할수 있다. 우선순위가 낮은 푸쉬는 서버가 적절한 시점까지 푸쉬전달을 미룬다. 높은 거 예로는 기상경보, 긴급메시지