개발콩블로그

[Swift] RxSwift를 활용하여 위치정보 권한 처리 객체 만들기 본문

swift

[Swift] RxSwift를 활용하여 위치정보 권한 처리 객체 만들기

devBean 2025. 3. 14. 20:02

안녕하세요 개발콩😁 입니다!!

오늘은 CLLocationManager와 RxSwift를 활용하여

위치 권한정보를 처리하는 객체를 만드는 방법에 대해서 소개하려고 합니다.

 

 

Info.plist 권한 추가

 

우리는 개발하면서 아래와 같은 것을 생각해야합니다.

  • 사용자에게 Data Privacy에 대해 더 많은 통제권을 부여합니다.
  • 필요 이상의 정보를 요청하지 않음으로써 사용자와의 신뢰를 구축합니다.
  • 원하는 것을 최소화 함으로써 더 나은 사용자 환경을 제공합니다.

 

즉, 사용자의 위치 데이터가 접근하기 전에 반드시 사용자의 허락을 요청하고

사용자가 명확히 이해할 수 있도록 데이터 사용 목적과 이유를 설명해야합니다.

 

 

하지만, 우리는 이러한 시스템 권한에 관련하여 사용자가 허용하고 위치 데이터를 활용하는 것 뿐만 아니라

앱의 사용중에 위치 권한이 변경되었을 경우에 대해서 적절한 처리를 하는 것은 매우 중요합니다.

예) 사용자가 앱을 사용하던 도중에 설정화면으로 이동하여 위치 추적을 거부한 경우

 

 

👉 따라서 저는 위치 권한을 확인하고 추적하는 객체를 만드는 것에 필요성을 느꼈습니다.

 

 

 

 

위치 권한에 관한 객체 인터페이스

protocol LocationPermissionManager {
    /// 위치 권한 상태를 구독할 수 있는 Observable
    var authorizationStatus: Observable<CLAuthorizationStatus> { get }
    
    /// 사용자에게 위치 권한을 요청하는 메서드
    func requestAuthorization()

    /// 현재 위치 권한이 허용 상태인지 확인하는 메서드
    func isAuthorized() -> Bool
}

 

 

 

객체 선언하기

1. CLLocationManager를 정의합니다.

2. 현재 위치 상태 변화를 구독할 수 있도록 Observable을 정의합니다.

private let locationManager = CLLocationManager()
private lazy var statusSubject = BehaviorSubject<CLAuthorizationStatus>(
    value: self.locationManager.authorizationStatus
)

/// 현재 위치 권한 상태를 구독할 수 있는 Observable입니다.
var authorizationStatus: Observable<CLAuthorizationStatus> {
    return statusSubject.asObservable()
}

override init() {
    super.init()
    locationManager.delegate = self
}

 

 

 

위치 상태 설정 변경 반영하기

위치 권한 설정이 변경될 때마다 해당 변경사항을 Observable을 통해 방출합니다.

func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
    statusSubject.onNext(status)
}

 

 

위치 권한을 요청하는 메서드를 정의합니다.

func requestAuthorization() {
    locationManager.requestWhenInUseAuthorization()
}

 

 

위치 권한이 허용되었는지 확인하는 메서드를 정의합니다.

func isAuthorized() -> Bool {
    let status = try? statusSubject.value()
    return status == .authorizedAlways || status == .authorizedWhenInUse
}

 

 

 

위치 권한 객체를 이용하기

locationPermissionManager.authorizationStatus
    .bind(with: self) { owner, authorizationStatus in
        switch authorizationStatus {
        case .notDetermined:
            /// 아직 위치 권한에 대한 초기 설정이 없는 상태.
            /// 위치 권한을 설정할 수 있는 알림 띄우기
            owner.locationPermissionManager.requestAuthorization()
        case .denied:
            /// 설정화면 이동 Alert 구현하기
        case .authorizedWhenInUse, .authorizedAlways:
            /// 위치 권한이 사용 가능한 상태. 우리가 하고 싶은 위치 권한 요청하기
        default:
            /// 그 외 위치 에러 Alert 구현하기
        }
    }
    .disposed(by: disposeBag)

 

 

'swift' 카테고리의 다른 글

[Swift] 동시성 문제 해결방법(Mutex, Semaphore)  (0) 2025.05.04
[Swift] Opaque Type과 Type Erasure  (1) 2025.04.16
[Swift] WMO(Whole Module Optimization)  (0) 2025.03.10
[Swift] Parameter packs  (0) 2025.02.12
[Swift] GCD - 3 DispatchGroup  (2) 2025.02.04