swift로 앱을 만들다보면 사용자의 위치를 획득해야하는 경우가 생긴다.
CoreLocation 라이브러리로 열심히 코드를 작성하고 실행을 돌리는 순간..!!
...
(아무일도 일어나지 않았다)
당연하다. 우린 사용자에게 권한을 요청한 적이 없기 때문이다.
그럼 위치 권한은 어떻게 요청하냐??
info.plist
현재 위치 사용에 대한 동의에 관련한 내용을 작성한다.
Privacy - Location Always Usage Description (위치를 항상 허용)
Privacy - Location When In Use Usage Description (위치를 사용할 때만 허용)
Privacy - Location Always and When In Use Usage Description (위치를 사용할 때와 항상 허용)
CoreLocation
위치 관리자를 초기화 및 생성해주어야한다.
import CoreLocation
class LocationManager: NSObject, CLLocationManagerDelegate {
private var locationManager = CLLocationManager()
private override init() {
super.init()
locationManager.delegate = self
// locationManager.desiredAccuracy = kCLLocationAccuracyBest
// 위에 주석된 코드는 위치정확도를 정확하게 바꾸는 코드이다. 난 위치가 그렇게 정확하지 않아도 되어서 주석처리 했다.
}
}
권한 요청하기
위치 관리자를 생성했으면 권한 요청은 누워서 떡먹기다.
locationManager.requestWhenInUseAuthorization()
해당 코드를 사용하면 된다.
난 사용자가 위치권한을 거부했을 때를 생각하여 아래처럼 작성하였다.
func checkUserDeviceLocationServiceAuthorization() async {
let authorizationStatus = locationManager.authorizationStatus
if authorizationStatus == .authorizedAlways {
}
else if authorizationStatus == .authorizedWhenInUse {
}
else if authorizationStatus == .denied {
DispatchQueue.main.async {
UIApplication.shared.open(URL(string: UIApplication.openSettingsURLString)!)
}
}
else if authorizationStatus == .restricted || authorizationStatus == .notDetermined {
locationManager.requestWhenInUseAuthorization()
}
}
위치 정보 업데이트
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
print(locations[0].coordinate.latitude)
print(locations[0].coordinate.longitude)
stopUpdateLocation()
}
위치 정보가 업데이트 되면 해당하는 위도와 경도를 출력하고 업데이트를 멈춘다.
지도나 네비게이션에서는 항상 업데이트로 두면 될 것이다.