[iOS-Swift] iOS 14+ 위치 권한

woogie·2024년 2월 1일
0

iOS-Swift

목록 보기
1/2
post-thumbnail

안녕하세요. woogie 입니다 🖐🏻

흠냥냥,, iOS 14+ 에서 위치권한 조회하는 방식이 바꼇다고해서 이것 저것 해보면서 정리도 하고, 이상한 부분도 있어서 글을 쓰게되었슴다..

iOS 위치 권한 요청하기

공식 문서

https://developer.apple.com/documentation/bundleresources/information_property_list/protected_resources

공식문서상의 내용을 살펴보자면

Q. 위치 권한을 사용할 것 인가?
A. NSLocationWhenInUseUsageDescription 를 쓰거라
Q. 백그라운드에서도 위치 권한을 사용할 것 인가?
A. NSLocationAlwaysAndWhenInUseUsageDescription 도 쓰거라

요약하자면 대략 이런 내용인 것 인데..

우선 14.0+ 에서 변경된 방식을 살펴봅시다.

이전 버전의 경우

  • CLLocationManager.authorizationStatus() 로 조회
  • 결과에 따라 CLLocationManager().requestWhenInUseAuthorization() 로 권한 요청

소스는 아래와 같습니다.


사진에서도 알 수 있듯이 조회하는 방식이 Deprecated 되었다고 하네용 🤷🏻
상세한 내용은 공식문서 참고 부탁드리며.. 요약하자면

"상태 조회하는 함수 호출 하지말고~ 인스턴스 속성 직접 써라~"


짜란~ ,,..ㅎ

단순 샘플로는 위 코드로도 돌아가지만.. 실제로 사용함에 있어서나 Apple의 의도는 이런 변화가 아닐 것 같다고 생각합미다,, (주관적인 의견임)

우리에겐 CLLocationManagerDelegate라는 엄청난 것이 있슴미다..! 이것을 활용해보도록 하죠

func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus)

상태 변화를 감지하여 변화 상태를 전달해 주는 친구입니다.

CLLocationManagerDelegate 사용을 위해 위 코드를 갈아엎어보도록 하죠!!

옵셔널로 선언해준 뒤 ViewDidLoad에서 초기화 및 Delegate를 채택 해줍니다.

CLLocationManagerDelegatelocationManagerDidChangeAuthorization에서 위치 정보 이벤트를 받아 처리하는 코드를 작성합니다.

참고로 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 로 감지하면서

요런 화면은 한번도 보지 못했다는 전설...

요약: notDetermined 일 땐 requestAlwaysAuthorization()를 사용하자

profile
iOS Developer

0개의 댓글

관련 채용 정보