0Pricing
Swift Academy · 강의

위치 권한 요청하기

권한과 개인정보 보호를 올바르게 처리합니다.

위치 권한 요청하기은(는) CoddyKit의 무료 Swift Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Swift Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

위치 정보에 권한이 필요한 이유

Apple 플랫폼에서 사용자의 위치 정보에 접근하는 작업은 개인정보 보호와 관련이 있습니다. Core Location이 좌표를 전달하려면 앱에서 먼저 명시적으로 권한을 요청해야 합니다. 처음 요청할 때 시스템에 권한 대화상자가 표시됩니다.

  • 권한은 사용자가 앱별로 부여합니다.
  • 프로그램으로 권한 요청을 우회할 수는 없습니다.
import CoreLocation

let manager = CLLocationManager()

Info.plist 사용 목적 설명 키

권한을 요청하기 전에 사용 목적 설명 문자열을 Info.plist에 추가해야 합니다. 이 문자열은 권한 대화상자에 표시됩니다. 주요 키는 다음 두 가지입니다.

  • NSLocationWhenInUseUsageDescription — 앱 사용 중에만 접근할 때 사용합니다.
  • NSLocationAlwaysAndWhenInUseUsageDescription — 백그라운드에서도 접근할 때 사용합니다.

관련 키를 생략하면 요청이 아무런 표시 없이 실패하거나 앱이 중단됩니다.

<!-- Info.plist -->
<key>NSLocationWhenInUseUsageDescription</key>
<string>We use your location to show nearby places.</string>

CLLocationManager 만들기

CLLocationManager는 위치 서비스를 조정하는 중심 객체입니다. 인스턴스 하나를 만들고 강한 참조로 유지한 다음, 콜백을 받도록 대리자를 지정하세요.

final class LocationService: NSObject {
    let manager = CLLocationManager()

    override init() {
        super.init()
        manager.delegate = self
    }
}

앱 사용 중 권한 요청

requestWhenInUseAuthorization()을 호출하여 앱 사용 중 위치 접근 권한을 요청하세요. 시스템은 대화상자를 한 번만 표시하며, 그 후에는 사용자의 선택을 기억합니다. 이미 결정된 상태라면 이 호출은 아무 작업도 수행하지 않습니다.

func requestPermission() {
    manager.requestWhenInUseAuthorization()
}

항상 권한 요청

백그라운드 업데이트(지오펜싱, 지속적인 추적)가 필요하면 requestAlwaysAuthorization()을 호출하세요. Apple에서는 먼저 앱 사용 중 권한을 얻은 다음 항상 권한으로 확대하도록 요구합니다. 이 권한은 꼭 필요한 경우에만 사용하고 사용 목적 설명에서 그 이유를 밝히세요.

func requestAlways() {
    manager.requestAlwaysAuthorization()
}

권한 상태 읽기

현재 권한 상태는 manager.authorizationStatus(iOS 14 이상에서 사용할 수 있는 인스턴스 속성)에 저장됩니다. 가능한 값으로는 .notDetermined, .denied, .restricted, .authorizedWhenInUse, .authorizedAlways가 있습니다.

let status = manager.authorizationStatus
switch status {
case .notDetermined: print("Ask the user")
case .denied, .restricted: print("No access")
case .authorizedWhenInUse, .authorizedAlways: print("Good to go")
@unknown default: break
}

CLLocationManagerDelegate

권한 변경 사항은 대리자를 통해 비동기적으로 전달됩니다. 사용자가 선택했을 때 반응하도록 locationManagerDidChangeAuthorization(_:)을 구현하세요. 권한 요청을 호출한 직후에 권한이 부여된다고 절대 가정하지 마세요.

extension LocationService: CLLocationManagerDelegate {
    func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
        switch manager.authorizationStatus {
        case .authorizedWhenInUse, .authorizedAlways:
            manager.startUpdatingLocation()
        default:
            print("Not authorized")
        }
    }
}

거부 또는 제한 상태 처리

사용자가 접근을 거부하면 권한을 다시 요청할 수 없습니다. 대신 .denied를 감지하고 사용자를 설정으로 안내하세요. .restricted는 자녀 보호 기능이나 MDM 프로필에 의해 접근이 차단된 상태이며, 앱 안에서는 복구할 수 없습니다.

func handle(_ status: CLAuthorizationStatus) {
    if status == .denied {
        // Deep-link the user to Settings > Privacy > Location
        print("Open Settings to enable location")
    }
}

정확도 권한(정확한 위치와 제한된 위치)

iOS 14부터 사용자는 제한된(대략적인) 정확도만 허용할 수 있습니다. manager.accuracyAuthorization을 확인하세요. 정말 정확한 데이터가 필요하다면(예: 턴바이턴 안내) Info.plist에 정의된 키를 사용하여 requestTemporaryFullAccuracyAuthorization(withPurposeKey:)을 호출하세요.

if manager.accuracyAuthorization == .reducedAccuracy {
    manager.requestTemporaryFullAccuracyAuthorization(
        withPurposeKey: "PreciseForNavigation"
    )
}

위치 서비스 활성화 여부 확인

앱별 권한과 별개로 기기 전체의 위치 서비스 스위치가 꺼져 있을 수 있습니다. 백그라운드 큐에서 CLLocationManager.locationServicesEnabled()을 확인하세요. 이 호출을 메인 스레드에서 실행하면 작업이 차단될 수 있습니다. 비활성화되어 있으면 어떤 앱도 위치를 받을 수 없습니다.

DispatchQueue.global().async {
    if CLLocationManager.locationServicesEnabled() {
        print("System location is on")
    } else {
        print("System location is off")
    }
}

전체 권한 요청 흐름

전체 흐름을 정리하면 다음과 같습니다. 관리자를 만들고 대리자를 설정한 뒤 앱 사용 중 권한을 요청하고, 권한 콜백 안에서 업데이트를 시작하세요. 이는 위치 정보를 사용하는 모든 기능에 적용되는 대표적인 패턴입니다.

final class LocationService: NSObject, CLLocationManagerDelegate {
    let manager = CLLocationManager()
    override init() {
        super.init()
        manager.delegate = self
        manager.requestWhenInUseAuthorization()
    }
    func locationManagerDidChangeAuthorization(_ m: CLLocationManager) {
        if m.authorizationStatus == .authorizedWhenInUse {
            m.startUpdatingLocation()
        }
    }
}

빠른 확인: 권한 요청

권한 요청 흐름을 얼마나 이해했는지 확인해 보세요.

복습: 권한 요청

이제 위치 권한을 안전하게 요청하는 방법을 배웠습니다.

  • NSLocationWhenInUseUsageDescription을 필요한 경우 Always 버전과 함께 Info.plist에 추가합니다.
  • CLLocationManager를 만들고 강한 참조로 유지한 다음 대리자를 설정합니다.
  • requestWhenInUseAuthorization()을 호출하고, 필요한 경우에만 항상 권한으로 확대합니다.
  • locationManagerDidChangeAuthorization(_:)에서 변경에 반응하고 거부, 제한, 제한된 정확도 상태를 처리합니다.

자주 묻는 질문

“위치 권한 요청하기” 강의는 무료인가요?

네 — “위치 권한 요청하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Swift Academy 강의 전체를 잠금 해제할 수 있습니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“위치 권한 요청하기”에서 뭘 배우나요?

권한과 개인정보 보호를 올바르게 처리합니다. 브라우저에서 직접 실행하는 실습 코드로 Swift Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Swift Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Swift Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“위치 권한 요청하기” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Swift Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Swift Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 위치 권한 요청하기
  2. 사용자 위치 가져오기
  3. SwiftUI에서 지도 표시하기
  4. 지오코딩과 지역
← Swift Academy(으)로 돌아가기