개발콩블로그
[Swift] RxSwift를 활용하여 위치정보 권한 처리 객체 만들기 본문
안녕하세요 개발콩😁 입니다!!
오늘은 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 |