위치 권한 허용

김정현·2023년 10월 28일
0

Project1: Lost Item

목록 보기
8/9

실제 휴대폰으로 구동해보면서 여러가지 오류들에 대해서 수정을 했다. 그 중에서 위치권한 허용에 대해서 다뤄보고자 한다.

위치 권한 허용

우선 Info.plist에서 위치 권한 허용을 받을 때 허용 멘트들과 어느 수준으로 허용을 받을 것인지를 정해야한다.

  • Privacy - Location Always Usage Description: 항상 앱이 항상 사용자의 위치정보를 사용한다.
  • Privacy - Location When In Use Usage Description: 앱을 사용 중 일때만 사용자의 위치정보를 사용한다.

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 상태")
            }
        }

만약 허용되어있다면 카메라를 현재 위치로 이동시키고, 허용되어 있지 않다면 허용을 요청한다.

위치권한에서 핵심은 메인스레드가 아닌 백그라운드에서 권한허용을 묻는 것이었다.

0개의 댓글