안녕하세요. woogie 입니다 🖐🏻
흠냥냥,, iOS 14+ 에서 위치권한 조회하는 방식이 바꼇다고해서 이것 저것 해보면서 정리도 하고, 이상한 부분도 있어서 글을 쓰게되었슴다..
공식문서상의 내용을 살펴보자면
요약하자면 대략 이런 내용인 것 인데..
우선 14.0+ 에서 변경된 방식을 살펴봅시다.
이전 버전의 경우
소스는 아래와 같습니다.
사진에서도 알 수 있듯이 조회하는 방식이 Deprecated 되었다고 하네용 🤷🏻
상세한 내용은 공식문서 참고 부탁드리며.. 요약하자면
"상태 조회하는 함수 호출 하지말고~ 인스턴스 속성 직접 써라~"
단순 샘플로는 위 코드로도 돌아가지만.. 실제로 사용함에 있어서나 Apple의 의도는 이런 변화가 아닐 것 같다고 생각합미다,, (주관적인 의견임)
우리에겐 CLLocationManagerDelegate
라는 엄청난 것이 있슴미다..! 이것을 활용해보도록 하죠
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus)
상태 변화를 감지하여 변화 상태를 전달해 주는 친구입니다.
CLLocationManagerDelegate
사용을 위해 위 코드를 갈아엎어보도록 하죠!!
옵셔널로 선언해준 뒤 ViewDidLoad
에서 초기화 및 Delegate를 채택 해줍니다.
CLLocationManagerDelegate
의 locationManagerDidChangeAuthorization
에서 위치 정보 이벤트를 받아 처리하는 코드를 작성합니다.
참고로 14.0에서 Deprecated 되었지만, didChangeAuthorization
를 통해 status를 바로 받아 볼 수도 있었습니다.
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
// Code
}
그 다음 Info.plist 파일도 아래처럼 추가해 줬습니다.
결과
위치 권한은 확인 했으니, 백그라운드에서도 동작 할 수 있도록
requestAlwaysAuthorization()
을 사용해보도록 하겠습니다.
야무지게 background modes도 넣고,
location 체크도 하고,
코드도 작성하고,
Info.plist 파일도 아래처럼 추가해 줬습니다.
결과
import CoreLocation
import UIKit
class LocationViewController: UIViewController {
var locationManager: CLLocationManager?
override func viewDidLoad() {
super.viewDidLoad()
self.locationManager = CLLocationManager()
self.locationManager?.delegate = self
}
}
extension LocationViewController: CLLocationManagerDelegate {
func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
let status = manager.authorizationStatus
switch status {
case .notDetermined:
// 물어보지 않은 상태
self.view.backgroundColor = .orange
self.locationManager?.requestWhenInUseAuthorization()
case .restricted, .denied:
// 앱에 대한 수동 거부 or 시스템 위치 사용 안함
self.view.backgroundColor = .red
case .authorizedAlways:
// 항상허용
self.view.backgroundColor = .blue
case .authorizedWhenInUse:
// 사용하는 동안 허용
self.view.backgroundColor = .green
self.locationManager?.requestAlwaysAuthorization()
@unknown default:
break
}
}
}
의문이 생긴게 "항상 허용해야만 하는 앱이라면, notDetemined 상태일때 Always로 요청해야하는거 아닐까??" 싶어서 한번 해봤는데용
요렇게 했더니??
항상 허용이 안보이더라구요??
"앱을 사용하는 동안 허용"을 눌렀슴다
그랬더니 소스코드 상으로 .authorizedAlways
로 감지하더라구요.
오? 되긴 되나보다 하고 있었는데
왜때문에 설정에서는 앱을 사용하는 동안
인 것인가요,,,
이후로는 소스상으로 계속 .authorizedAlways
로 감지하면서
요런 화면은 한번도 보지 못했다는 전설...
requestAlwaysAuthorization()
를 사용하자