Sign In
Swift | 학습 내용 정리

[Swift - UIKit, CoreLocation] iOS에서 사용자 정보 권한과 위치 권한 획득

한결
iOS, iPadOS와 같이 애플 기기에서 돌아가는 운영체제는 사용자의 개인정보 보호에 아주 민감하다는 것을 많은 기사와 사례를 통해서 알 수 있다. 애플은, 어떤 기기에서 돌아가는 앱이든, 사용자의 앱 사용 경험을 헤치지 않으면서 유저가 권한 부여에 동의한 정보에 대해서만 앱이 활용할 수 있는 강력한 통제 시스템을 구축하고 있다.
사용자 > 기술 이라는 기본적인 모토에서 앱이 사용자의 정보 통제권을 쉽게 가질 수 없도록 만든다. iOS의 메이저 버전이 올라가면서 사용자가 앱에 줄 수 있는 개인 정보 통제권 유형을 *더 세분화 하고 있다.
💡
* 위치 정보를 허용한다고 했을 때,
어느 순간부터 아래와 같은 선택지를 사용자에게 제공해주었다. (iOS13+)
- 허용하지 않음
- 한 번만 허용
- 앱을 사용할 때만 허용
- 항상 허용
정리하면, 앱을 만들 때 사용자가 부여한 권한의 정도가 어떻게 되는지를 계속 신경써야 한다는 것이고, 사용자가 갑자기 해당 정보에 대한 권한을 차단하지는 않았는지를 계속 인앱 상황에서 모니터링 하고 있어야 한다는 점이다.
위치 정보에 대한 권한을 획득하고 획득한 위치 기반으로 현재 날씨를 보여주는 간단한 앱을 만들어 보면서 위치 서비스에 대한 권한 획득을 경험해봤다. 순서대로 기록해본다.

간단히 위치 정보 활용 동의받고 이용하기

1.
info.plist에서 Privacy 항목 활성화하고 사용자 위치 정보를 수집하는 이유가 담긴 문구 수정하기
해당 항목에 작성하는 문구가 추후에 권한을 획득하는 Alert의 메시지에 반영된다.
위치 정보를 왜 수집하고, 어떻게 사용되는지 등에 대해 최대한 자세히 작성해야 앱 출시에 제한이 없다.
2.
사용자가 애플 기기 시스템에서 위치 서비스에 대한 권한을 켜뒀는지 확인하기
// ViewController import CoreLocation extension ViewController: CLLocationManagerDelegate { private func configureLocation() { manager.delegate = self validateIsTurnedOnSystemAuthorization() } private func validateIsTurnedOnSystemAuthorization() { if CLLocationManager.locationServicesEnabled() { // 위치 서비스가 활성화 되어 있다면 이 분기로 빠진다. getUserLocationAuth() } else { print("유저가 시스템상 위치 서비스를 활성화 해야 합니다.") } } }
CoreLocation 패키지를 가져오고 CLLocationManager 클래스의 인스턴스를 생성하여 CLLocationManagerDelegate 로 위치 권한을 획득하는 역할을 VC에 위임해준다.
.locationServicesEnabled 라는 타입 메서드로 유저가 시스템 상에서 위치 서비스를 활성화했는지 확인한다.
else 구문으로 빠지면, 보통 alert 등을 통해서 시스템 설정에서 위치 서비스를 켜달라는 식으로 사용자의 선제 액션을 유도할 수 있다. (혹은 이동시킬 수도 있겠다.)
3.
사용자가 승인해준 우리 앱에 대한 위치 정보 활용 권한에 따라 위치 데이터를 사용한다.
private func getUserLocationAuth() { switch manager.authorizationStatus { case .notDetermined: // 여기서 위치 정보 획득 권한을 얻는 alert를 띄워준다. // 반드시 info.plist에서 설정한 권한 형식으로 간다. manager.requestWhenInUseAuthorization() case .denied: print("권한을 확보해야 함") case .authorizedWhenInUse: manager.desiredAccuracy = kCLLocationAccuracyBest manager.startUpdatingLocation() default: print("") } }
CLLocationManager가 가지고 있는 authorizationStatus 열거형을 통해 유저가 승인한 권한에 따른 분기를 처리해준다.
.notDetermined : 뜻 그대로 '정해진 것이 없는' 상태다. 권한 획득 모달에서 유저가 권한을 선택하기 전의 상태다. 즉, 앱에서 아직 유저의 위치 정보를 전혀 사용할 수 있는 상태가 아니다.
.denied : 권한 부여에 '거절'당한 상태다. 유저가 설정 앱에서 우리 앱에 대한 위치 서비스를 다시 부여하거나 모달에서 다시 권한을 부여하기 전까지 유저 위치 정보에 대한 서비스는 제공할 수 없다.
.authorizedWhenInUse : 앱을 사용하는 동안 위치 정보를 사용할 수 있는 권한이 부여됐다. 임시적으로 한 번 할 수도 있고, 앱을 사용하는 동안 부여받을 수도 있다.
.authorizedAlways : 앱이 백그라운드 상태여도 위치 정보를 사용할 수 있는 권한을 부여한다.
*내가 위치 기반 서비스를 이용해본 경험상, 앱이 사용되는 동안 허용으로 설정한 다음 일정 기간이 지난 다음 백그라운드 상황에서 '항상 허용' 권한을 요청하는 모달이 뜨곤했다.
.notDetermined 상태에서 매니저의 .requestWhenInUseAuthorization 메서드를 호출해서 모달을 띄워준다.
4.
authorizationStatus에 따라 권한 변화를 감지하고, 권한 획득 후 정보 사용이 시작된 순간 앱 서비스를 위한 로직이 돌아간다.
func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) { validateIsTurnedOnSystemAuthorization() } func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { guard let locate = locations.last?.coordinate else { return } AF.request(url).responseDecodable(of: WeatherModel.self) { res in switch res.result { case .success(let v): // API 통신 성공에 따른 비즈니스 로직이 온다. // 현재 위치를 한 번만 사용하는 앱이라면 위치 정보 업데이트를 멈출 수도 있다. self.manager.stopUpdatingLocation() case .failure(let e): print(e) } } }
locationManagerDidChangeAuthorization 메서드가 권한이 변경되는 순간을 감지한다.
이 메서드 내부에서는 처음부터 권한에 대한 검증이 필요하다. 개발자는 유저가 어떤 권한을 부여했는지 알 수 없기 때문이다.
didUpdateLocations 값은 .startUpdatingLocation 메서드가 동작하는 순간에 위치 정보를 업데이트 하기 시작한다.
.desiredAccuracy 속성에 부여한 정확성 값에 따라 위치가 어떻게 변경되었는지를 알아서 감지해서 위치 정보를 업데이트하여 배열로 돌려준다.
위치 정보를 한 번만 사용하고 추후에 업데이트 하지 않는 앱이라면, .stopUpdatingLocation 메서드로 위치 정보 업데이트를 종료할 수도 있겠다.
위치 권한 부여 로직 단계도를 간단하게 그려보면 이렇게 될 수 있겠다. (나만 이해하는 그림인가..)
위치 데이터 권한을 획득하여, 위치에 맞는 날씨를 보여준다.

정리해보면,

유저 Privacy 정보를 획득하기 위해서는
1.
시스템 상으로 우리가 사용하고자 하는 개인 정보 서비스를 유저가 활성화 해뒀는지 확인해야 한다.
비활성화 상태라면, 우리는 권한 자체를 요청할 수도 없다.
2.
1에 대한 서비스를 활성화한 상태라면, 어느정도 권한을 줄 수 있는지 물어봐야 한다.
이 단계에서 유저가 거부(.denied)한다면 우리는 정보를 활용할 수 없다. 설정에서 유저가 권한을 활성화 해주길 기다려야 한다.
3.
2에서 유저가 특정 상태로 권한을 부여해줬다면 그 권한 범위내에서 정보를 활용할 수 있다.
Ha
Subscribe to 'hankyeol'
Subscribe to my site to be the first to receive notifications and emails about the latest updates, including new posts.
Join Slashpage and subscribe to 'hankyeol'!
Subscribe
👍