Overview
애플의 플랫폼내에서는 사용자의 개인 정보를 굉장히! 중요하게 다룬다는 느낌을 받을 수 있습니다. 여담이지만 FBI가 애플에게 아이폰 암호해제를 요청했는데 사용자들의 프라이버시를 위해 해주지 않았다는 일화도 있죠...
Human Interface Guidelines에선 필요한 개인정보와 관련된 데이터와 리소스, 사용방법을 투명하게 공개해서 사용자와의 신뢰를 구축하는 것이 중요하다고 말하고 있습니다.
따라서 다음과 같은 데이터나 리소스를 사용할 때 액세스 권한을 요청해야 합니다.
- 위치, 건강, 재정, 연락처 및 기타 개인 식별 정보를 포함한 Personal data
- 이메일, 메시지, 캘린더, 연락처, 게임 플레이 정보, Apple Music 활동, HomeKit 데이터, 오디오, 비디오, 사진 컨텐츠와 같은 사용자 생성 콘텐츠
- 블루투스 주변 장치, home automation features, Wi-Fi 연결 및 로컬 네트와 같은 보호된 리소스
- 카메라, 마이크와 같은 장치
그리고 신경써야 할 부분은
1. 필요한 경우에만, 필요한 권한만 요청하기!
2. 액세스가 필요한 시점에 권한을 요청하기!
3. 앱이 요청하는 데이터 또는 리소스를 사용하는 방법을 명확하게 설명하는 문구를 작성하기!
입니다. 위의 세 가지를 잘 지켜서 🚨리젝🚨당하지 않도록 하기!

이렇게 권한 요청 문구에 수동태나, 어디에 사용하는지 불분명하게 작성하지 않도록 주의합시다..!! 이 권한 문구 하나로도 🚨리젝 사유🚨가 되기도 한다네용!!
그리고 내가 권한 설정을 하지 않았더라도 라이브러리를 사용하면서 필요하지 않은 권한도 등록됐을 수 있기 때문에 그 부분도 체크해봅시다!
권한 설정을 할 땐 두 가지를 기억하시면 됩니다.
%%%
1. Info.plist
에 권한 설정하기
2. 코드로 권한 부여 상태에 대한 처리하기
%%%
두 가지를 기억하고 이제 딩코를 해보도록 해봐요!! 권한 부여 상태가 가장 다양한(?) Location Privacy를 기준으로 설명하면서, 현재 위치의 주소를 가져오는 연습을 해보도록 할게요.
1. Info.plist에 권한 설정하기
Info.plist 에서 +버튼을 누르시고 Privacy - L
까지만 치셔도 위치에 관한 여러 권한을 확인할 수 있습니다.

위치에는 6가지의 권한을 설정할 수 있네요.
Privacy - Location Always and When In use Usage Description
- iOS 11 이상
- iOS 앱이 백그라운드에서 실행되는 동안 위치 정보에 액세스 하는 경우 이 키를 사용
Privacy - Location When In use Usage Description
- iOS 11 이상
- iOS 앱이 포그라운드에서 실행 중일 때만 위치 정보에 액세스하는 경우
Privacy - Location Default Accuracy Reduced
- iOS 14 이상
- 위치 정확도에 대한 앱의 기본 동작을 설정하려면 정보 속성 목록에 이 키를 포함할 수 있음
- true : 기본적으로 정확도가 떨어지는지 묻는 메시지가 표시되도록 키 값을 설정
- false : 전체 위치 정확도를 묻는 메시지가 표시 되도록 설정(default)
Privacy - Location Temporary Usage Description Dictionary
- 앱이 사용자 위치에 대한 임시 액세스를 요청하는 이유를 설명
- ex) 앱의 한 부분에서 근처 커피숍을 제안하고 다른 부분에서 근처 친구를 찾는 경우 두 항목을 포함
Privacy - Location Always Usage Description
- iOS 앱이 백그라운드에서 위치 정보에 액세스하고 iOS 11 이전의 대상에 배포하는 경우 이 키를 사용
Privacy - Location Usage Description
- macOS 앱이 사용자의 위치 정보에 액세스하는 API를 사용하는 경우에만 필요
2. 코드로 권한 부여 상태에 대한 처리하기

코드를 보기 전에 우선! 사용자가 권한을 허용했을 경우, 권한을 거부했을 경우, 권한 요청이 불가능한 경우에 대한 처리를 잘 해주어야 사용자가 앱을 사용하면서 불편함을 느끼지 않겠죠?!
권한을 거부했을 때, 권한 요청이 불가능 할 때 설정 화면으로 이동시켜 권한 허용 설정을 유도시키기,
그리고 권한 상태가 결정된 후에도 사용자가 앱을 사용하는 중에 권한 상태를 변경할 수 있기 때문에 그러한 상황에서 처리들을 꼼꼼히 해주도록 해요!
CoreLocation
프레임워크를 사용해서 위치 서비스를 이용하고 현재 위치를 얻어봅시다!
CoreLocation
에서 세 가지 요소를 살펴볼게요
CLAuthorizationStatus
: 앱의 위치 서비스 사용 권한을 나타내는 상수CLAccuracyAuthorization
: 앱에 사용 권한이 있는 위치 정확도 수준을 나타내는 상수CLLocationManager
: 앱에 대한 위치 관련 이벤트 전달을 시작 및 중지하는 데 사용하는 개체
CLAuthorizationStatus

case notDeetermined: 앱이 위치 서비스를 사용할 수 있는지에 대한 여부를 사용자가 선택하지 않은 경우
case restricted: 앱이 위치 서비스를 사용할 권한이 없는 경우 ex) 자녀 보호 기능과 같은 활성 제한
case denied: 사용자가 앱이나, 설정에서 기기 전체의 위치 서비스 사용을 거부한 경우
case authorizedAlways: 언제든지(백그라운드) 위치 서비스를 사용할 수 있도록 승인한 경우
case authorizedWhenInUse: 앱이 사용중인 동안 위치 서비스를 사용하도록 승인
static var authorized는 Deprecated됨
CLAccuracyAuthorization

case fullAccuracy: 앱이 완전한 정확도로 위치 데이터에 액세스할 수 있도록 승인했습니다.
case reducedAccuracy: 앱이 정확도가 낮은 위치 데이터에 액세스할 수 있도록 승인했습니다.
iOS14 이후부터 위치 권한 부여 상태와 정확도 값을 모두 확인해주어야 합니다!!
CLLocationManager
CLLocationManager
의 인스턴스를 사용하여 핵심 위치 서비스를 구성, 시작 및 중지합니다.
위치 관리자 개체는 다음과 같은 기능을 지원합니다.
1. 구성 가능한 정확도로 사용자의 현재 위치에서 크거나 작은 변화를 추적합니다.
2. 온보드 나침반에서 방향 변경을 보고합니다.
3. 사용자가 해당 지역에 들어오거나 나갈 때 개별 관심 영역을 모니터링하고 위치 기반 이벤트를 생성합니다.
4. 주변 비콘에 범위를 보고합니다.
CLLocationManagerDelegate
프로토콜을 채택하면 연결된 위치 관리자 개체에서 이벤트를 수신할 수 있습니다.

func locationManagerDidChangeAuthorization(CLLocationManager)
- iOS 14 이상, 앱이 위치 관리자를 생성하고, 권한이 변경이 될 때 대리자에게 승인 상태를 알려줌.
func locationManager(CLLocationManager,didChangeAuthorization:CLAuthorizationStatus)
- iOS 14 미만, 앱이 위치 관리자를 생성하고, 권한이 변경이 될 때 대리자에게 승인 상태를 알려줌
func locationManager(CLLocationManager,didUpdateLocations: [CLLocation])
- 대리인에게 새 위치 데이터를 사용할 수 있음을 알립니다.
func locationManager(CLLocationManager,didFailWithError: Error)
- 위치 관리자가 위치 값을 검색할 수 없음을 대리인에게 알립니다.
Code
위에서 정리한 내용을 활용해 봐요!
1. import 후 LocationManager 인스턴스 생성

2. viewDidLoad에 delegate 설정

3. CLLocationManagerDelegate
프로토콜 채택

4. 사용자의 권한 상태 확인

5. iOS 위치 서비스 여부 확인

6. 현재 위치를 주소로 바꾸기

7. 권한 거부 시 설정으로 이동

출처
- Human Interface Guidelines - accessing user data
- apple developer - Requesting Authorization for Location Services
- apple developer - CLAuthorizationStatus
- apple developer - CLAccuracyAuthorization
- apple developer - CLLocationManager
- apple developer - Adding Location Services to Your App
- apple developer - converting a users location to a descriptive place mark
- 새싹 iOS 앱 개발자 데뷔 과정
'IOS' 카테고리의 다른 글
SPM으로 설치한 Crashlytics에서 누락된 dsyms 업로드하기 (2) | 2021.12.18 |
---|---|
iOS | 샌드박스와 File System (0) | 2021.11.04 |
iOS ) Autolayout3 - Adaptive Layout, Size Class (0) | 2021.10.05 |
iOS ) AutoLayout2 - Content Hugging, Compression Resistance (0) | 2021.10.04 |
iOS ) AutoLayout1 - Frame-based Layout Autoresizing Mask (0) | 2021.10.02 |