실제 휴대폰으로 구동해보면서 여러가지 오류들에 대해서 수정을 했다. 그 중에서 위치권한 허용에 대해서 다뤄보고자 한다.
우선 Info.plist에서 위치 권한 허용을 받을 때 허용 멘트들과 어느 수준으로 허용을 받을 것인지를 정해야한다.
LostItem에서는 현재 기능에서는 앱이 사용 중 일때만 추적하면 된다. 그렇기에 후자를 선택했다. 그거에 맞게 사용자 요청 메세지도 잘 선택해야 앱스토어에서 리젝을 안 당한다고 한다.
<key>NSLocationWhenInUseUsageDescription</key>
<string>앱이 사용 중일 때 위치 서비스에 액세스할 권한을 요청합니다.</string>
이런식으로 info.plist에 추가해줬다.
그리고 이제 이 창을 띄울때는
var locationManager = CLLocationManager()
locationManager.delegate = self
self.locationManager.requestWhenInUseAuthorization()
이런식 코드들로 요청을 받으면 되는데, 중요한 점은 요청을 받으면 메인 스레드에서 받기 때문에 어플 동작에 영향을 줄 수 있다. 그렇기에 에러가 표시된다. 이걸 해결하기위해 백그라운드에서 요청을 받는 형식으로 작성했다.
ViewDidLoad에서
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
DispatchQueue.global(qos: .background).async {
if CLLocationManager.locationServicesEnabled() {
switch self.locationManager.authorizationStatus {
case .authorizedWhenInUse, .authorizedAlways:
print("위치 권한이 허용됨")
self.locationManager.startUpdatingLocation()
case .denied, .restricted:
self.locationManager.requestWhenInUseAuthorization()
print("위치 권한이 거부됨 또는 제한됨")
case .notDetermined:
self.locationManager.requestWhenInUseAuthorization()
@unknown default:
break
}
} else {
print("위치 서비스 Off 상태")
}
}
만약 허용되어있다면 카메라를 현재 위치로 이동시키고, 허용되어 있지 않다면 허용을 요청한다.
위치권한에서 핵심은 메인스레드가 아닌 백그라운드에서 권한허용을 묻는 것이었다.