iOS/Swift

[Swift] 위치 정보 접근 권한 (GPS) 요청하고 처리하기

YEN_ 2024. 2. 14. 13:41

(해당 포스팅은 iOS 14 기준 개발 프로젝트 내용입니다)

 

❓ 위치 데이터에 관한 이야기

 

위치 데이터는 민감한 정보이고, 사용자의 개인정보 보호와도 큰 관련이 있죠

모든 사용자는 자신의 개인정보를 통제할 수 있어야 하기 때문에

앱이 해당 정보에 대한 사용 권한 승인을 (사용자에게) 받기 이전까지는 데이터를 사용할 수 없게 차단해야 합니다!

 

위치 데이터가 필요한 시점에 사용자에게 승인을 요청하고

반응한 승인 상태를 저장하여 알맞게 활용합니다

 

만약 권한 거부를 선택한다면, 승인을 요청하는 메세지는 더 이상 띄우지 못한답니다

 

 

저같은 경우, 날씨 앱을 만들어보고 있었기 때문에 앱 진입 시 스플래시 화면을 띄우고, 그 화면이 끝나면 위치 데이터를 요청합니다

이외에는 버튼을 누르면 위치 데이터 요청을 안내하는 방법도 있겠죠?

 

 

 

✔️ 승인 요청 및 상태 변경에 따른 응답

 

위치 데이터를 사용한 서비스를 시작하려면

앱의 현재 (위치 데이터 권한) 인증 상태를 확인하고, 필요하다면 인증 요청을 해야 합니다

 

CLLocationManager 를 사용해서 인증을 얻을 수 있어요

 

func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) { 
    switch manager.authorizationStatus {
    case .authorizedWhenInUse:  // Location services are available.
        enableLocationFeatures()
        break
        
    case .restricted, .denied:  // Location services currently unavailable.
        disableLocationFeatures()
        break
        
    case .notDetermined:        // Authorization not determined yet.
       manager.requestWhenInUseAuthorization()
        break
        
    default:
        break
    }
}

 

 

크게 3가지 상태로 나눌 수 있습니다

 

 

🟰 위치 권한을 요청하지 않은 경우 

  • notDetermined
case .notDetermined:
            manager.requestWhenInUseAuthorization()

 

CLLocationManager 의 requestWhenInUseAuthorization() 메서드를 사용해서 위치 서비스 권한을 요청해요

 

 

🟰 위치 권한을 얻은 경우

  • authorizedWhenInUse
  • authorizedAlways
case .authorizedWhenInUse, .authorizedAlways:
            self.navigationController?.pushViewController(viewController, animated: true)

 

위치 권한의 응답 중

  1. 한 번 허용
  2. 앱을 사용하는 동안 허용

두 개 중 하나를 선택했다면 권한을 얻은 상태입니다!

 

권한이 허용된다면 어떤 동작을 할 지 코드를 작성하면 돼요.

저는 메인화면 ViewController로 던져주었습니다

 

 

🟰 위치 권한을 얻지 못한 경우

  • denied
  • restricted
case .denied, .restricted:
            self.navigationController?.pushViewController(locationViewController, animated: true)

 

위치 권한의 응답 중

  1. 설정에서 액세스 제한 되어있는 상태
  2. 허용 안함 선택

두 개 중 하나에 해당한다면 위치 서비스 사용이 불가능합니다

 

마찬가지로 권한이 허용되지 않았을 때 어떤 동작을 할지 작성해주면 됩니다

저는 유저가 직접 보고싶은 지역을 선택할 수 있도록 위치 검색 화면으로 던져줄게요ㅎㅎ

 

 

 

 

 

✅ 전체 코드

 

제 프로젝트에서는

런치스크린 화면 -> 위치 서비스 권한 요청 화면 -> 메인화면

이런 식으로 넘어가게 만들었어요.

그래서 뷰컨트롤러가 3개입니다ㅎㅎ

 

하단의 코드는 위치 서비스 권한 요청 ViewController입니다

import UIKit
import CoreLocation

final class MainGPSViewController: UIViewController {
    
    // MARK: - Properties
    
    private var locationManager: CLLocationManager?
    
    // MARK: - UI Properties
    
    private var viewController = ViewController()
    private var settingsViewController = SettingsViewController()
    
    // MARK: - Life Cycle
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        locationManager = CLLocationManager()
        locationManager?.delegate = self
        
        setUI()
    }
}

// MARK: - CLLocationManagerDelegate

extension MainGPSViewController: CLLocationManagerDelegate {
    // 위치 권한 상태 변경시 호출
    func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
        switch manager.authorizationStatus {
        case .notDetermined:
            // MARK: 위치 권한을 요청하지 않은 경우 - 권한 요청
            manager.requestWhenInUseAuthorization()
        case .authorizedWhenInUse, .authorizedAlways:
            // MARK: 위치 권한을 얻은 경우 - 메인화면 이동
            self.navigationController?.pushViewController(viewController, animated: true)
        case .denied, .restricted:
            // MARK: 위치 권한을 얻지 못한 경우 - 위치 검색 페이지로 이동
            self.navigationController?.pushViewController(settingsViewController, animated: true)
        @unknown default:
            fatalError("Unknown location authorization status")
        }
    }
}

// MARK: - Extensions

extension MainGPSViewController {
    private func setUI() {
        view.backgroundColor = .mainTheme
        
        self.navigationController?.isNavigationBarHidden = true
    }
}

 

 

 

 

 

 

https://developer.apple.com/documentation/corelocation/requesting_authorization_to_use_location_services

 

Requesting authorization to use location services | Apple Developer Documentation

Obtain authorization to use location services and manage changes to your app’s authorization status.

developer.apple.com

https://developer.apple.com/documentation/corelocation/cllocationmanager/1620562-requestwheninuseauthorization

 

requestWhenInUseAuthorization() | Apple Developer Documentation

Requests the user’s permission to use location services while the app is in use.

developer.apple.com