-
iOS 13에서 리뉴얼된 위치 정보 변경 필독 사항 1 - 위치정보 지연된 항상 허용iOS 2020. 3. 7. 15:08반응형
iOS 13에서는 위치정보 요청이 복잡하게 변경되었습니다.
이번 포스트에는 "항상 허용"의 변화에 대해서 살펴보겠습니다.
시작
앱의 위치 정보 권한을 상태를 나타내는 enum CLAuthorizationStatus 에는 다섯 가지가 있습니다.
- notDetermined : 위치 권한을 요청받지 않음
- restrict : 기기 설정에서 유저가 모든 앱이 위치 설정을 사용할 수 없게 꺼 버림
- denied : 유저가 위치 정보를 이 앱이 접근하는 것을 거부함
- authorizedAlways : 유저가 이 앱이 백그라운드에서도 위치 정보에 접근할 수 있도록 허용함
- authorizedWhenInUse : 유저가 이 앱이 포그라운드에서 위치 정보에 접근할 수 있도록 허용함
이 중 authorizedAlways 권한을 얻기 위해서 iOS 12 에서는 아래 코드를 실행하고 유저의 동의를 받기만 하면 가능했습니다.
var locationManager = CLLocationManager() locationManager.requestAlwaysAuthorization()
1. iOS 13에서 requestAlwaysAuthorization 을 호출한다면
하지만 이제 이렇게 요청해도, 위치 정보를 항상 요청받는 선지가 사라졌습니다.
대신 앱을 사용하는 동안 허용 (Allow While Using App) 하는 선지만 표기됩니다.
즉 개발자는 항상 허용을 받으려고 하는데, 유저한테 보이는 선지는 앱을 사용하는 동안으로 찍힙니다.
아무튼 앱을 사용하는 동안 허용 을 누르고,
func locationManager( _ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus )
에서 status 값의 변화를 체크해 보았습니다.
authorizedAlways 입니다.
이 상황에서 설정 창을 돌아가 앱의 상태를 확인해 봅시다.
'항상' 에 표시가 되어 있지 않고, '앱을 사용하는 동안' 에 찍힙니다.
정리해 봅시다.
- 개발자가 항상 허용, locationManager.requestAlwaysAuthorization() 을 요청합니다.
- 유저가 앱을 사용하는 동안 을 선택했습니다.
- 유저가 설정에서 앱을 사용하는 동안 을 확인할 수 있습니다.
- CLLocationManagerDelegate 가 authorizedAlways 을 수신했습니다.
즉 iOS 13 에서는 앱에서 시스템 알럿을 띄워 직접적으로 "항상 요청"을 받을 방법이 없어진 것입니다.
애플에서는 이 복잡한 상태를 "Provisional(암시적)" 내지 "Deferred(지연된)" 항상 허용이라고 명명했습니다.
암시적 항상 허용 상태
이 애매한 상태는 다음 조건이 맞아떨어지면 국면이 바뀌게 됩니다.
- 앱이 백그라운드로 진입합니다.
- 앱이 위치정보를 키고 있고, 백그라운드 모드를 허용하고 있는 상태입니다.
- 사용자가 앱의 위치를 이동하여 앱의 위치가 갱신되었습니다.
코드로 재현한다면,
다음과 같은 상황으로 재현할 수 있습니다.
1. 아래와 같은 코드를 func sceneDidEnterBackground(_ scene: UIScene) 에 삽입합니다.
let locationManager = CLLocationManager() locationManager.allowsBackgroundLocationUpdates = true locationManager.requestAlwaysAuthorization() locationManager.startUpdatingLocation()
2. Background Modes 에서 Location Updates 에 체크합니다.
3. 앱의 위치권한 요청에서 "사용하는 동안" 을 클릭한 뒤, 백그라운드로 앱을 보냅니다.
4. 기기를 움직이거나, 시뮬레이터에서 Location을 조작해서 위치를 눈에 띄게 바꿉니다.
그러면 앱이 자동적으로 이전에는 본 바 없는 시스템 알럿을 노출합니다.
앱을 사용하지 않을 때도 앱이 사용자의 위치에 접근하도록 허용할 것인지 묻습니다.
사용하지 않을 때 위치를 항상 허용하시겠습니까?
여기서 사용자가 어느 선지를 선택하느냐에 따라서 패턴이 달라집니다.
1. 이 알럿에서 사용자가 '항상 허용으로 변경' 을 선택하면
설정에서도 '항상 허용'으로 표기됩니다. '명시적' '지연된' 애매한 상태가 아닙니다. 이 알럿으로 동의를 받은 이후에는, 동일한 알럿이 다시 뜨는 일은 없습니다.
2. 이 알럿에서 사용자가 '사용하는 동안만 유지'를 선택한다면
CLLocationManagerDelegate 가 authorizedWhenInUse 를 수신합니다. 앱을 사용하는 동안만 위치정보를 쓸 수 있게 고정됩니다.
설정에서 사용자가 위치정보를 변경했을 때는?
설정에서 사용자가 위치정보를 직접 항상 을 선택한다면, "암시적 항상 허용 상태"에 진입하지 않습니다. 그냥 항구적으로 authorizedAlways 가 됩니다.
이후 포스트로 이어집니다.
https://sesang06.tistory.com/175
레퍼런스
https://developer.apple.com/videos/play/wwdc2019/705/
반응형'iOS' 카테고리의 다른 글
SWIFT 질문들 (0) 2020.03.14 iOS 13에서 리뉴얼된 위치 정보 변경 필독 사항 2 - 위치정보 한 번 허용 (0) 2020.03.07 UIWebView 를 WKWebView 로 이전할 때 반드시 알아야 하는 7가지 주의 사항 (0) 2020.02.28 UICollectionViewDiffableDataSource, UITableViewDiffableDataSource 로 깔끔한 콜렉션 뷰 데이터 관리하기 (0) 2020.02.26 iOS, Android WebView 와 네이티브간의 유용한 통신 방법 - Javascript Interface, Webkit Messaging (0) 2020.02.20