/iOS 📱

[iOS] Core Loaction 위치 권한 설정하기

아렉스_Arex 2022. 4. 26. 23:57
반응형

안녕하세요 !

오늘은 위치 정보가 필요할 때 위치 권한을 얻는 방법을 공부해보겠습니다

iOS 13 기준으로 설명드릴게요 

 

++ 추가 2024.01.19 (금)

iOS 13에서 deprecated 된 방식 이외에 iOS 14에서 사용하는 프로퍼티와 메소드 추가

권한상태를 쉽게 출력할 수 있는 extension 추가

공식 문서로 자세하게 찾아보겠습니다.


출처: Apple Developer

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가 나와서 상태권한을 확인하는데 불편함이 있습니다.

이렇게요 !

 

protocolCustomStringConvertible 을 이용하면 권한에 따른 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"
        }
    }
}