개발

iOS 13 이후 위치 권한을 항상 받도록 설정하는 방법은?

소소ing 2021. 4. 1. 17:28
반응형

앱을 개발하다 보면 단말기 위치 권한을 '항상 허용'이 필요한 경우가 발생된다. 

iOS 13 이후 어떻게 권한 승인이 가능한지 알아보자!

 

1. 기존 권한 요청 팝업을 '항상 허용'으로 출력하려면 아래 코드를 요청해야 한다. 

import CoreLocation

var locationM = CLLocationManager()

locationM.requestAlwaysAuthorization()

 

- 물론 아래와 같이 Info.plist에 권한 문구도 작성을 해 주어야 한다. 

<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>

<string>위치정보 권한이 필요합니다. (항상 or 앱을 사용하는 동안 위치정보를 수신합니다.)</string>

<key>NSLocationAlwaysUsageDescription</key>

<string>위치정보 권한이 필요합니다. (항상 위치정보를 수신합니다.)</string>

<key>NSLocationWhenInUseUsageDescription</key>

<string>위치정보 권한이 필요합니다. (앱을 사용하는 동안에만 위치정보를 수신합니다.)</string>

 

- 위 코드 실행 시 아래와 같이 권한 팝업이 나타난다. 하지만 기존과 다르게 '항상 허용' 항목이 보이지 않는것을 확인 할 수 있다. 

- iOS 13에서는 앱에서 권한 팝업을 요청하여 명시적인 '항상 허용'을 하지 못하도록 수정되었다. 

- 위 권한 팝업에서 앱을 사용하는 동안 허용을 선택할 경우 func locationManager( _ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus ) 함수를 통해 확인을 해보면 status 값이 항상 허용으로 들어오는 것을 확인 할 수 있지만 단말기-설정-권한을 요청한 앱으로 들어가 보면 위치 권한이 앱을 사용하는 동안으로 되어 있는 재미있는 현상을 확인할 수 있다.

 

 

2. 그렇다면 어떻게 '항상 허용' 권한을 획득 할 수 있을까?

- 아래의 조건에 부합이 될 경우 iPhone의 OS에서 다음과 같은 팝업을 추가로 요청하게 된다. 

- 부합 조건

   1) 앱이 백그라운드 상태일때, 

   2) 앱에서 위치 정보를 백그라운드 상태에서 사용하겠다고 정의해 놓은 경우

        [코드 설정]

        let locationM = CLLocationManager()

        locationM.allowsBackgroundLocationUpdates = true

        [Xcode Capabilities 설정]

   3) 이 후 백그라운드에서 단말기의 위치 정보가 변경될때 

반응형