본문 바로가기
Apple의 SDK/MapKit & CoreLocation

[CoreLocation] 위치 서비스 기능 살펴보기 CLLocationManager

by lody.park 2023. 12. 17.

CLAuthorizationStatus (사용자 위치 정보 접근 권한 상태를 나타내는 Enum 타입 )

앱이 사용자의 위치 정보에 접근할 수 있는지 여부를 나타내는 권한 상태가 세분화 되어있습니다.

각 상태별로 의미를 살펴보겠습니다.

상태 요약 설명
.notDetermined 결정되지 않음 사용자가 아직 위치 서비스에 대해 권한을 부여하거나 거부하지 않은 상태입니다. 이 상태일 때, 앱은 requestWhenInUseAuthorization() 또는 requestAlwaysAuthorization() 메서드를 호출하여 사용자에게 권한을 요청할 수 있습니다.
.restricted 제한됨 앱이 위치 서비스에 접근할 수 없는 상태입니다. 이는 일반적으로 부모의 제어 또는 기업 정책 등 외부적인 요인에 의해 제한되었을 때 발생합 니다. 이 상태에서는 사용자가 권한을 변경할 수 없으며, 앱은 위치 정보에 접근할 수 없습니다.
.denied 거부됨 사용자가 앱의 위치 서비스 사용을 명시적으로 거부했거나, 설정에서 위치 서비스를 완전히 비활성화한 상태입니다. 비행기 모드와 같이 위치 서비스를 이용할 수 없는 상황이 해당됩니다.
.authorizedAlways 항상 허가됨 앱이 사용자의 위치 정보에 항상 접근할 수 있는 권한을 받았음을 의미합니다. 이 권한 상태는 앱이 백그라운드에서도 위치 정보를 사용할 수 있음을 나타냅니다.
.authorizedWhenInUse 사용중에만 허가됨 앱이 사용자의 위치 정보에 접근할 수 있는 권한을 받았으며, 이는 앱이 활성 상태(사용중)일 때에만 위치 정보를 사용할 수 있음을 의미합니다. 앱이 백그라운드로 전환되면 위치 정보 접근이 중단될 수 있습니다.

 

desiredAccuracy (위치 데이터의 정확도 설정)

아래는 대표적인 정확도 기준이다. 이외에도 다양한 기준이 있는데, 위치 데이터를 정확하게 가져올수록 배터리가 빨리 소모될 수 있다는 점을 주의해야한다.

  • KCLLocationAccuracyBest : 가능한 최고 수준의 정확도
  • KCLLocationAccuracyKilometer : 킬로미터 기준의 정확도
  • KCLLocationAccuracyThreeKilometers : 3킬로미터 기준의 정확도
let locationManager = CLLocationManager()

// 내비게이션과 같은 고정밀도 요구 시
locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation

// 일반적인 사용의 경우
locationManager.desiredAccuracy = kCLLocationAccuracyBest

// 배터리 절약이 중요하고, 덜 정확한 위치 정보가 허용되는 경우
locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers

distanceFilter (위치 업데이트 기준 거리 설정 )

위치 서비스가 새로운 위치 업데이트를 전달하기 위해 사용자의 위치가 이동해야하는 최소 거리를 지정할 수 있습니다. 이 속성은 미터 단위로 설정됩니다. 불필요한 위치 업데이트를 줄임으로써 배터리 소모를 줄일 수 있습니다. 위치 업데이트의 빈도가 높을수록 더 많은 배터리가 소모됩니다. 앱의 요구사항에 따라 이는 달라질 수 있습니다. 상대적으로 거리 변경 폭이 큰 차량 내비게이션 앱은 큰 단위로, 걷기 또는 달리기 앱은 작은 단위로 값을 설정할 수 있습니다.

let locationManager = CLLocationManager()
locationManager.distanceFilter = 50 // 위치가 50미터 이상 변경될 때만 업데이트 받음

 

iOS 14+에서는 위치 서비스 권한에 대한 사용자의 선택 옵션이 더 세분화되었습니다. 이러한 변화는 다음과 같습니다.

  • 정밀도 권한 (Precise Location)
    • iOS 14 이상에서는 앱이 사용자의 정확한 위치를 요청할 수 있는 '정밀도 권한'이 도입되었습니다.
    • 사용자는 앱이 요청하는 위치 정보의 정밀도를 선택할 수 있습니다. 즉, 사용자는 앱에 정확한 위치 정보 또는 대략적인 위치 정보 중 하나를 제공할 수 있습니다.
    • 이는 CLLocationManager의 desiredAccuracy 속성과 requestTemporaryFullAccuracyAuthorization(withPurposeKey:) 메서드를 통해 관리됩니다.
  • 권한 변경 알림
    • 사용자가 앱의 위치 서비스 권한을 변경할 때, 앱은 CLLocationManagerDelegate의 didChangeAuthorization 메서드를 통해 이러한 변경 사항에 대한 알림을 받을 수 있습니다.
    • 이는 사용자가 설정에서 권한을 변경할 때 실시간으로 반응하는 앱의 로직을 구현하는 데 유용합니다.
  • 백그라운드 위치 추적
    • authorizedAlways 상태인 경우에만 앱은 백그라운드에서 위치 추적을 계속할 수 있습니다.
    • 이를 위해서는 Info.plist 파일에 NSLocationAlwaysUsageDescriptionNSLocationWhenInUseUsageDescription 키를 모두 추가하고, 사용자로부터 '항상 허용' 권한을 받아야 합니다.
<key>NSLocationAlwaysUsageDescription</key>
<string>이 앱은 백그라운드에서도 위치 기반 기능을 제공하기 위해 항상 위치 정보에 접근할 필요가 있습니다. 예를 들어, (여기에 구체적인 사용 사례를 기술하세요).</string>

<key>NSLocationWhenInUseUsageDescription</key>
<string>이 앱은 사용 중에 위치 기반 서비스를 제공하기 위해 위치 정보에 접근할 필요가 있습니다. 예를 들어, (여기에 구체적인 사용 사례를 기술하세요).</string>