Swift
[Swift] CLLocationManager.locationServicesEnabled() Issue 문제
웰코발
2022. 11. 2. 20:33
Xcode 14.0 업그레이드 후 iOS 16 기기에서
CLLocationManager.locationServicesEnabled()
사용 후 문제점
This method can cause UI unresponsiveness if invoked on the main thread. Instead, consider waiting for the -locationManagerDidChangeAuthorization: callback and checking authorizationStatus first.
해결방안
CLLocationManager.locationServicesEnabled() -> CLLocationManager.authorizationStatus 활용
lazy var locationManager: CLLocationManager = {
let manager = CLLocationManager()
manager.desiredAccuracy = kCLLocationAccuracyBest
return manager
}()
class ..... {
override func viewDidLoad() {
// ...
// if CLLocationManager.locationServicesEnabled() { // 해당 코드 대신 하단 코드 사용
if locationManager.authorizationStatus == .authorizedAlways || locationManager.authorizationStatus == .authorizedWhenInUse {
print("viewdidload 위치 서비스 On 상태")
} else {
print("viewdidload 위치 서비스 Off 상태")
}
// ...
checkLocationPermission()
}
override func didBecomeActive() {
checkLocationPermission()
}
/*
사용자의 위치 정보를 확인할 수 있도록 위치 권한을 확인한다.
*/
func checkLocationPermission() {
switch locationManager.authorizationStatus {
case .authorizedAlways, .authorizedWhenInUse:
// 위치 사용 권한이 허용되어 있음
// ...
locationManager.delegate = self
// ...
case .notDetermined:
// 위치 사용 권한 허용 여부 미결정 상태. 권한을 허용할 것인지 여부를 묻는 팝업이 나타난다.
// ...
locationManager.delegate = self
locationManager.requestWhenInUseAuthorization()
// ...
case .restricted, .denied:
// 위치 사용 권한이 허용되지 않은 상태.
// ...
@unknown default:
// [개인정보보호] -> [위치 서비스] 활성화 X
// ...
}
view.setNeedsLayout()
}
}
/* extension for CLLocationManager */
extension IntegratedMapViewController : CLLocationManagerDelegate {
func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
print("[locationManagerDidChangeAuthorization]")
switch manager.authorizationStatus {
case .authorizedAlways, .authorizedWhenInUse:
// 사용자가 위치 권한 사용을 허용한 상태.
print("CLLocationManagerDelegate - 사용자가 위치 권한 사용을 허용한 상태임")
// ...
case .denied, .restricted, .notDetermined:
// 위치 사용 권한이 허용되지 않은 상태.
print("CLLocationManagerDelegate - 사용자가 위치 권한 사용을 허용하지 않은 상태임")
// ...
@unknown default:
// 알수없는 상태.
// ... error 처리
}
view.setNeedsLayout()
}
}