[iOS] Core Loaction 위치 권한 설정하기
안녕하세요 !
오늘은 위치 정보가 필요할 때 위치 권한을 얻는 방법을 공부해보겠습니다
iOS 13 기준으로 설명드릴게요
++ 추가 2024.01.19 (금)
iOS 13에서 deprecated 된 방식 이외에 iOS 14에서 사용하는 프로퍼티와 메소드 추가
권한상태를 쉽게 출력할 수 있는 extension 추가
공식 문서로 자세하게 찾아보겠습니다.
1. 위치 정보를 받기 전에 requestAlwaysAuthorization() 혹은 requestWhenInUseAuthorization() 메소드를 꼭 호출해야한다고합니다.
2. Info.plist 파일에 key를 추가해줘야한다네요.
3. 권한 요청에 대한 사용자의 인터렉션은 CLLocationManager 의 delegate를 위임 받아, locationManager(_:didUpdateLocations:) 메소드를 통해서 받아볼 수 있다.
3. locationManager(_:didChangeAuthorization status:) 메소드에서 authorizatioin 상태 값을 받을 수 있다.
4. 메소드를 호출 한 이후에는, 추가적으로 호출은 아무런 영향을 끼치지않는다.
authorizationStatus 알아보기
authorizationStatus는 CLAuthorizationStatus 를 인스턴스 프로퍼티로 사용하고 있다,
notDetermined : 위치 권한을 요청받지 않음
restrict : 설정에서 사용자가 모든 앱이 위치 설정을 사용할 수 없게 설정
denied : 사용자가 위치 정보를 해당 앱이 접근하는 것을 거부
authorizedAlways : 사용자가 해당 앱이 백그라운드에서도 위치 정보에 접근할 수 있도록 허용
authorizedWhenInUse : 사용자가 해당 앱이 포그라운드에서 위치 정보에 접근할 수 있도록 허용
ㅁㅁ
이제 코드를 통해 어떻게 사용하는지 알아보겠습니다.
1. iOS 13 이전
과거에 작성했던 타입메소드를 통해 권한상태를 확인하는 방법은 iOS13에서 deprecated 되었습니다.
//CLLocationManager 객체 생성
let locationManager = CLLocationManager()
locationManager.delegate = self
// CLLocationManager.authorizationStatus() was deprecated in iOS14.0
// Use the instance property authorizationStatus instead.
switch CLLocationManager.authorizationStatus() {
case .denied:
// 위치 정보 권한 요청하기
self.locationManager.requestAlwaysAuthorization()
break
case .notDetermined, .restricted:
break
default:
break
}
2. iOS 14 이후
iOS 14.0 부터는 인스턴스 프로퍼티인 authorizationStatus 를 사용합니다.
권한이 바뀐 것 또한 func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) 를 사용해서 확인이 가능합니다.
extension MainViewController2: CLLocationManagerDelegate {
func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
print("Location AuthorizationStatus: \(manager.authorizationStatus)")
switch manager.authorizationStatus {
case .notDetermined:
break
case .restricted:
break
case .denied:
break
case .authorizedAlways:
break
case .authorizedWhenInUse:
break
@unknown default:
break
}
}
}
manager.authorizationStatus 권한에 대해서 print()를 이용하면 열거형의 rawValue가 나와서 상태권한을 확인하는데 불편함이 있습니다.
protocol 인 CustomStringConvertible 을 이용하면 권한에 따른 String 값을 편하게 확인할 수 있습니다.
* CustomStringConvertible를 채택하면 은 print() 메소드가 인스턴스의 custom description 프로퍼티를 사용합니다
extension CLAuthorizationStatus: CustomStringConvertible {
public var description: String {
switch self {
case .notDetermined: return "notDetermined"
case .restricted: return "restricted"
case .denied: return "denied"
case .authorizedAlways: return "authorizedAlways"
case .authorizedWhenInUse: return "authorizedWhenInUse"
case .authorized: return "authorized"
@unknown default:
return "restricted"
}
}
}