티스토리 뷰
[CoreLocation] When InUse / Always 비교 + info.plist Location관련한 key들 정리
Zedd0202 2023. 11. 15. 19:34
위치 관련해서 잠깐 봐야할 게 있어서 봤는데..
왜이렇게 많은거지..한번 정리해두면 좋을 것 같아서!
# NSLocationUsageDescription
- iOS 8에서 Deprecate
응 안봐
# NSLocationAlwaysUsageDescription
- iOS 11에서 Deprecate
- 앱의 Deploy Target이 iOS 11+ 이라면 NSLocationAlwaysAndWhenInUseUsageDescription 을 사용해야합니다.
~ 11 이전 버전을 지원한다면 ~
- 11 이전 OS에서는 무조건 NSLocationAlwaysUsageDescription을 사용
- 11 이후 OS에서는 무조건 NSLocationAlwaysAndWhenInUseUsageDescription을 사용
그러니까 11 이전 버전을 지원한다면!
개발자는
NSLocationAlwaysAndWhenInUseUsageDescription
NSLocationAlwaysUsageDescription
이 두가지를 동일한 메세지로 추가해놔야합니다.
~ 11 이후 버전만 지원한다면 ~
저는 11 이후만 지원하니까 저한테는 이렇게 되네요 야호
Location Always Usage Description -> iOS 11에서 deprecate
Location Usage Description -> iOS 8에서 deprecate
이제 가장 많이 사용하게 될
- NSLocationAlwaysAndWhenInUseUsageDescription
- NSLocationWhenInUseUsageDescription
를 봅시다. 이 친구들은 iOS 11부터 사용 가능합니다.
# NSLocationWhenInUseUsageDescription
- 앱이 사용중일 때 위치 서비스를 사용하고 이벤트를 수신할 수 있음.
1. Foregorund에 있을 때
2. (아래 그림처럼) 위치 사용 표시기가 활성화 된 상태에서 백그라운드에서 실행중일때
사용중이라고 판단
# NSLocationAlwaysAndWhenInUseUsageDescription
- 사용자가 앱이 실행중이라는 사실을 알지 못하는 경우에도 앱은 모든 위치 서비스를 사용하고 이벤트를 수신할 수 있음
(앱이 실행되고 있지 않으면 시스템이 앱을 실행하고 이벤트를 전달함)
# Always? WhenInUse?
Apple: 가능하면 When In Use만 요청하셈ㅋ
이게 결론인데... 차근차근 봅시다!
일단 위치 권한 요청 메소드는AlwaysWhenInUse / WhenInUse 이렇게 2가지가 있습니다.
let manager = CLLocationManager()
...
self.manager.requestAlwaysAuthorization()
self.manager.requestWhenInUseAuthorization()
[주의할 점 - Always권한을 요청한경우]
반드시 Info.plist에
- NSLocationAlwaysAndWhenInUseUsageDescription
- NSLocationWhenInUseUsageDescription
2개 다 들어가있어야합니다.
하나만 들어가있으면
This app has attempted to access privacy-sensitive data without a usage description. The app's Info.plist must contain both “NSLocationAlwaysAndWhenInUseUsageDescription” and “NSLocationWhenInUseUsageDescription” keys with string values explaining to the user how the app uses this data
이런 에러가 뜨니 주의!!!
[주의할 점 - When In Use권한만 요청한경우]
그냥 무조건 NSLocationWhenInUseUsageDescription가 반드시 있어야 합니다.
This app has attempted to access privacy-sensitive data without a usage description. The app's Info.plist must contain an “NSLocationWhenInUseUsageDescription” key with a string value explaining to the user how the app uses this data
Always때처럼 NSLocationAlwaysAndWhenInUseUsageDescription가 필요하진 않습니다.
# requestWhenInUseAuthorization
When In Use 부터 해보겠습니다.
When In Use니까 요거 하나만 넣어주면 되고..
self.manager.requestWhenInUseAuthorization()
를 호출해봅시다.
별 문제없이 다 잘 나오는것을 볼 수 있습니다.
각 케이스 별로 정리해보자!!!!
[한 번 허용]
우선 한번은 허용하겠다~라서 권한은
authorizedWhenInUse로 설정됩니다.
하지만 앱이 더이상 사용되지 않는 즉시 notDetermined 상태로 돌아갑니다.
실제로 앱을 종료하고 다시 켜면
위 프롬프트를 또! 만나게 됩니다.
한번 허용을 눌렀을 때는 설정에서도
다음번에 묻기 에 체크되어있는 것을 볼 수 있습니다. (내가 공유할때는 뭐지...?)
[앱을 사용하는 동안 허용]
앱을 사용하는 동안 허용을 눌렀을때의 권한은
역시나 authorizedWhenInUse입니다.
설정에서도 앱을 사용하는 동안이라고 체크되어있는 것을 볼 수 있죠
[허용 안함]
당연히
denied로 설정됩니다.
설정에서도 안함으로 체크되어있습니다.
이번엔 Always 권한을 요청해보겠습니다.
# requestAlwaysAuthorization
Always니까 Info.plist에 둘 다 넣어주고
self.manager.requestAlwaysAuthorization()
를 호출해봅시다.
아래와 같이 뜨는 것을 볼 수 있습니다.
뭔가 이상하죠.
Always를 호출했음에도 불구하고
1. 항상 허용이 나오질 않음
2. Description은 When In Use의 Description이 나옴
이 이상한 부분은 뒤에서 다루기로 하고.. 하나씩 봅시다.
[한 번 허용]
이건 위 When In Use때랑 똑같습니다.
권한도 authorizedWhenInUse가 나오고, 앱이 사용되지 않으면 notDetermined로 돌아가게 되죠.
설정에서도 다음번에 묻기로 체크되어있습니다.
When In Use때랑 달라진것은.. 항상 옵션이 추가되었고, 앱 설명 부분도 Always것을 쓰네요.
⭐️ [앱을 사용하는 동안 허용] ⭐️
이 부분을 잘 보셔야 합니다!!!
앱을 사용하는 동안 허용 눌렀으니까..권한은 authorizedWhenInUse 겠지;; 라고 생각할 수 있지만..
authorizedAlways가 나오게 됩니다.
그럼 설정에는 어떻게 되어있을까요
앱을 사용하는 동안으로 체크가 되어있네요.
그럼 이상한 점이 총 4가지 입니다.
Always를 호출했음에도 불구하고
1. OS 권한 요청 팝업에 항상 허용이 나오질 않음
2. Description은 When In Use의 Description이 나옴
3. 설정에는 앱을 사용하는 동안으로 체크되어있음
4. 근데 권한은 authorizedAlways임
🐥 : ⁉️
iOS 13이후부터는 애플의 개인정보보호 강화 어쩌구의 일환으로.. 항상허용이 바로 나오지 않습니다.
Always를 요청하고, 사용자가 앱을 사용하는 동안 허용을 누르게 되면 ➡️ iOS는 provisional always(임시 항상 허용)권한을 부여합니다.
위 타임라인 초록색 가장 끝부분을 보시면, Start using Always powers라고 나와있죠?
앱을 사용하는 동안 허용을 누른 시점부터 실제로 Always 권한이 부여된 것처럼 작동할 수 있습니다.
🐥 : 아니 헷갈려..zz 나는 앱을 사용하는 동안 허용 눌렀는데 왜 Always 권한이 부여된 것처럼 작동할 수 있는거지..?
그냥 Apple은 지금 저에게 provisional always(임시 항상 허용)권한을 준겁니다.
"임시"!!!!!!!!!!!!!!!
🐥 : 임시..? 그 임시는 언제 끝나;; 항상 허용 내놓으라고
iOS가 적절한 로직 + 시간에 프롬프트를 띄워서 물어봅니다. (이건 WWDC 19 참고..)
위 오른쪽 사진의 프롬프트에서
Always and When In Use Description이 쓰이게 됩니다.
[사용하는 동안만 유지]
임시로 받은 authorizedAlways권한은 날아가고 authorizedWhenInUse가 됩니다.
[항상 허용으로 변경]
authorizedAlways로 바뀌고, 설정도 항상으로 바뀝니다.
🐥 : 그럼 항상 허용 프롬프트를 내가 띄울 수 없다는거네...?
원래 그랬는데.. 애플도 뭔가를 느꼈는지 iOS 13.4 부터 이 항상 허용 프롬프트를 개발자가 띄울 수 있도록 변경했습니다.
근데 조건이 있음ㅋ
1. When In Use 권한을 먼저 요청해야함
self.manager.requestWhenInUseAuthorization()
2. 거기서 앱을 사용하는 동안을 눌러 authorizedWhenInUse 권한을 얻음
3. 그 상태에서 Always 권한을 요청하면
self.manager.requestAlwaysAuthorization()
아래 프롬프트를 띄울 수 있게 됩니다.
딱 한번만 띄울 수 있음 주의
그럼...
Location Default Accuracy Reduced (NSLocationDefaultAccuracyReduced)
Location Temporary Usage Description Dictionary (NSLocationTemporaryUsageDescriptionDictionary)
이렇게 2개 남았는데,
# NSLocationDefaultAccuracyReduced
Location Default Accuracy Reduced 를 직역하면 위치 기본 정확도 감소..인데요.
Boolean값을 넘겨주면 되는데, 기본적으로 false입니다. (감소하지 않겠다)
이것을 true로 설정해주면 권한 프롬프트가 살짝 달라집니다.
첫번째 그림처럼
1. 대략적인 위치를 사용하도록 허용하겠습니까~ 타이틀이 변경
2. 정확한 위치 켜는게 안나옴
이게 true로 설정되면 모든 Core Location 서비스가 정확도가 낮은 수준으로 정보를 받게 된다고 하네요.
설정에서도
정확한 위치가 꺼져있는 것을 볼 수 있습니다.
# NSLocationTemporaryUsageDescriptionDictionary
앱이 사용자 위치에 대한 임시 접근을 요청하는 이유를 설명하는 메시지 모음...
위에서 정확한 위치를 껐을 수도 있는데, 정확한 위치가 진짜 필요할 수도 있잖아요??
근데 그때마다 이유가 다를 수 있어
대충 이런식으로 넣어두고
// Request location access to find coffee shops.
manager.requestTemporaryFullAccuracyAuthorization(withPurposeKey: "zedd")
해당 key로 접근하면 그 description이 나오면서 정확한 위치 요청 권한 프롬프트가 뜬다.
이런식~~~
당연히 정확한 위치가 켜져있으면 아무 소용이 없겠죠?
이 친구들 다 봤네요 야호
이 글은 2022년 5월 2일에 쓰기 시작되어.....
그때 쓰다가 아 나만 헷갈리나;;? 하면서 글감이 아니라고 생각하고 한창 쓰다가 처박아둔 글인데
딱 오늘 또!!! 헷갈려서 찾아서 우다다다 써보았습니다
그때 첨부한 이미지들 새걸로 바꾸느라 넘 귀찮았지만 그래도 다 써서 개운허다,,
너므 길어서 누가 읽을까 싶지만.. 나중에 또 헷갈릴 나에게 도움이 되길!
틀린 부분이 있다면 댓글 남겨주세효
참고
https://developer.apple.com/videos/play/wwdc2019/705
https://developer.apple.com/videos/play/wwdc2020/10660/
https://medium.com/swlh/location-permission-in-ios-13-f9e10917c05e
'iOS' 카테고리의 다른 글
isAccessibilityElement / accessibilityElements (1) | 2024.02.11 |
---|---|
[iOS] PHPicker 권한 정리 (6) | 2023.12.12 |
[iOS] 총 / 남은 기기 용량 알아내는 법 (0) | 2023.11.13 |
Push Notification Console 써보기 (2) | 2023.10.26 |
[삽질 기록] GradationView 만들기 (0) | 2023.08.27 |
- swift 공부
- 피아노
- SwiftUI
- WKWebView
- swift array
- 회고
- 스위프트 문법
- UIBezierPath
- swift3
- ios 13
- swift tutorial
- 스위프트
- np-complete
- Accessibility
- Combine
- 제이슨 파싱
- np-hard
- IOS
- iOS delegate
- actor
- swift sort
- fastlane
- WWDC
- WidgetKit
- swift delegate
- Swift
- github
- Git
- Xcode
- FLUTTER
- Total
- Today
- Yesterday