iPhone 앱에서 사용자의 현재 위치를 활용하려면 반드시 먼저 위치 서비스 권한을 요청해야 합니다. Swift에서는 CLLocationManager 클래스를 사용하면 손쉽게 권한 상태를 확인하고 요청할 수 있습니다.
1. CLLocationManager 객체 생성
가장 먼저 뷰 컨트롤러 내에 위치 관리자 객체를 생성합니다. 이 객체를 통해 권한 확인과 요청 등 모든 위치 관련 작업을 처리하게 됩니다.
var locationManager = CLLocationManager()
2. 기기에서 위치 서비스 활성화 여부 확인
권한을 요청하기 전에, 해당 기기에서 위치 서비스 자체가 켜져 있는지 먼저 확인하는 것이 좋습니다. 이때는 CLLocationManager.locationServicesEnabled() 메서드를 사용합니다. 이 메서드는 위치 서비스가 활성화되어 있으면 true, 비활성화되어 있으면 false를 반환하는 Boolean 값입니다.
if CLLocationManager.locationServicesEnabled() {
print("permissions allowed")
} else {
locationManager.requestAlwaysAuthorization()
locationManager.requestWhenInUseAuthorization()
}위 예제에서는 위치 서비스가 활성화되어 있으면 "permissions allowed"를 출력하고, 그렇지 않다면 두 가지 유형의 권한을 요청합니다.
- requestAlwaysAuthorization(): 앱이 백그라운드에 있을 때도 위치 정보에 접근할 수 있는 '항상 허용' 권한 요청
- requestWhenInUseAuthorization(): 앱을 사용 중일 때만 위치 접근을 허용하는 '사용하는 동안 허용' 권한 요청
3. 부여된 권한 상태 확인하기
위치 서비스가 활성화되어 있다면, 실제로 어떤 종류의 권한이 부여되었는지도 확인할 수 있습니다. 이때는 CLLocationManager.authorizationStatus() 메서드를 사용하며, 반환되는 값은 다음과 같은 열거형(enum)입니다.
- .notDetermined: 아직 사용자가 권한을 선택하지 않은 상태
- .restricted: 시스템 정책 등으로 인해 위치 서비스 사용이 제한된 상태
- .denied: 사용자가 권한을 거부한 상태
- .authorizedAlways: 항상 위치 접근이 허용된 상태
- .authorizedWhenInUse: 앱 사용 중에만 위치 접근이 허용된 상태
실제 코드에서는 switch 문으로 각 상태를 분기 처리할 수 있습니다.
if CLLocationManager.locationServicesEnabled() {
switch CLLocationManager.authorizationStatus() {
case .authorizedAlways, .authorizedWhenInUse:
print("authorized.")
case .denied, .restricted, .notDetermined:
print("not authorized.")
}
}추가 팁: Info.plist 설정 잊지 마세요
권한 요청 팝업이 정상적으로 표시되려면 프로젝트의 Info.plist에 반드시 관련 키를 추가해야 합니다. 누락하면 앱이 크래시될 수 있습니다.
- NSLocationWhenInUseUsageDescription: 앱 사용 중 위치 접근 사유 설명
- NSLocationAlwaysAndWhenInUseUsageDescription: 항상 허용 권한 요청 시 사유 설명
이처럼 CLLocationManager를 활용하면 위치 서비스의 활성화 여부 확인부터 권한 요청, 그리고 현재 부여된 권한 상태 파악까지 모두 프로그래밍 방식으로 처리할 수 있습니다.