iOS 앱에서 위치 권한을 요청하려면 Apple에서 제공하는 CLLocationManager 클래스를 사용합니다. 이 클래스의 인스턴스를 통해 Core Location 서비스를 구성하고, 시작하고, 중지할 수 있습니다.
CLLocationManager에 대한 자세한 내용은 Apple 공식 문서를 참고하세요.
https://developer.apple.com/documentation/corelocation/cllocationmanager
위치 접근 수준의 두 가지 유형
iOS 앱은 다음 두 가지 수준의 위치 접근 권한 중 하나를 지원할 수 있습니다.
- 앱 사용 중(While Using the App) — 앱이 실행되고 있는 동안에만 기기의 위치에 접근할 수 있습니다. '사용 중 권한(when-in-use authorization)'이라고도 불립니다.
- 항상 허용(Always) — 앱이 포그라운드에서 사용 중일 때뿐만 아니라 백그라운드에서도 기기의 위치에 접근할 수 있습니다.
이 글에서는 '사용 중 권한' 방식을 사용합니다. 즉, 앱이 실행되는 동안에만 위치 서비스를 사용하도록 권한을 요청하는 방식입니다.
https://developer.apple.com/documentation/corelocation/choosing_the_authorization_level_for_location_services/requesting_when-in-use_authorization
구현 단계
1단계 — Xcode 프로젝트 생성
Xcode를 열고 Single View Application 템플릿으로 새 프로젝트를 생성한 후, 프로젝트 이름을 LocationServices로 지정합니다.
2단계 — 버튼 추가
Main.storyboard를 열고 버튼 하나를 추가한 뒤, 버튼 이름을 getLocation으로 설정합니다.
3단계 — 버튼 액션 연결
ViewController.swift 파일에 버튼의 @IBAction을 추가합니다.
@IBAction func btnGetLocation(_ sender: Any) {
}4단계 — Core Location 임포트
위치 관련 클래스를 사용하기 위해 CoreLocation 프레임워크를 임포트합니다.
import CoreLocation
5단계 — Info.plist 설정
Info.plist 파일을 엽니다. 앱 실행 중 위치 업데이트 권한을 활성화하려면 특수 키가 필요합니다. 파일을 우클릭하여 Add Row를 선택하고 아래와 같은 값을 입력합니다.
- Key: Privacy - Location When In Use Usage Description (
N SLocationWhenInUseUsageDescription) - Value: 위치 권한이 필요한 이유를 설명하는 문구 (예: "현재 위치를 확인하기 위해 위치 정보가 필요합니다.")
이 설명 문구는 권한 요청 팝업에 그대로 표시되므로, 사용자가 이해하기 쉽게 작성하는 것이 좋습니다.
6단계 — CLLocationManager 객체 생성
ViewController.swift를 열어 CLLocationManager 객체를 생성합니다.
let locationManager = CLLocationManager()
7단계 — 버튼 액션에 권한 요청 코드 작성
ViewController.swift의 버튼 액션에 다음 코드를 추가합니다.
@IBAction func btnGetLocation(_ sender: Any) {
let locStatus = CLLocationManager.authorizationStatus()
switch locStatus {
case .notDetermined:
locationManager.requestWhenInUseAuthorization()
return
case .denied, .restricted:
let alert = UIAlertController(title: "위치 서비스가 비활성화되어 있습니다", message: "설정에서 위치 서비스를 활성화해 주세요", preferredStyle: .alert)
let okAction = UIAlertAction(title: "확인", style: .default, handler: nil)
alert.addAction(okAction)
present(alert, animated: true, completion: nil)
return
case .authorizedAlways, .authorizedWhenInUse:
break
}
}코드 설명
authorizationStatus()는 현재 위치 권한 상태를 반환하여 locStatus 변수에 저장합니다. 각 상태별로 다음과 같이 동작합니다.
- .notDetermined — 아직 권한을 요청한 적이 없는 상태로,
requestWhenInUseAuthorization()을 호출해 사용자에게 권한 팝업을 표시합니다. - .denied / .restricted — 권한이 거부되었거나 제한된 상태로, 사용자에게 위치 서비스 비활성화를 알리는 알럿을 표시합니다.
- .authorizedAlways / .authorizedWhenInUse — 이미 권한이 승인된 상태로, 별도 처리 없이 진행합니다.
'사용 중 권한'이 승인되면 앱이 포그라운드에 있는 동안 위치 업데이트를 받을 수 있습니다. 반면 위치 서비스가 비활성화된 경우에는 "위치 서비스가 비활성화되어 있습니다"라는 메시지가 담긴 알럿이 사용자에게 표시됩니다.
실행 결과 확인
이제 애플리케이션을 빌드하고 실행하면, 버튼을 누르는 시점에 아래 화면과 같이 위치 권한 요청 팝업이 나타나는 것을 확인할 수 있습니다.