Computer >> 컴퓨터 >  >> 프로그래밍 >> iOS

Swift로 iOS 위치 서비스 권한을 프로그래밍 방식으로 요청하는 방법

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를 활용하면 위치 서비스의 활성화 여부 확인부터 권한 요청, 그리고 현재 부여된 권한 상태 파악까지 모두 프로그래밍 방식으로 처리할 수 있습니다.