(해당 포스팅은 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)
위치 권한의 응답 중
- 한 번 허용
- 앱을 사용하는 동안 허용
두 개 중 하나를 선택했다면 권한을 얻은 상태입니다!
권한이 허용된다면 어떤 동작을 할 지 코드를 작성하면 돼요.
저는 메인화면 ViewController로 던져주었습니다
🟰 위치 권한을 얻지 못한 경우
- denied
- restricted
case .denied, .restricted:
self.navigationController?.pushViewController(locationViewController, animated: true)
위치 권한의 응답 중
- 설정에서 액세스 제한 되어있는 상태
- 허용 안함 선택
두 개 중 하나에 해당한다면 위치 서비스 사용이 불가능합니다
마찬가지로 권한이 허용되지 않았을 때 어떤 동작을 할지 작성해주면 됩니다
저는 유저가 직접 보고싶은 지역을 선택할 수 있도록 위치 검색 화면으로 던져줄게요ㅎㅎ
✅ 전체 코드
제 프로젝트에서는
런치스크린 화면 -> 위치 서비스 권한 요청 화면 -> 메인화면
이런 식으로 넘어가게 만들었어요.
그래서 뷰컨트롤러가 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
}
}
'iOS > Swift' 카테고리의 다른 글
[Swift] http API 허용하기 - Info.plist (0) | 2024.02.21 |
---|---|
[Swift] API KEY 숨기기 - plist 사용하기 (0) | 2024.02.20 |
[Swift] iOS 스플래시 / 런치 스크린 화면 만들기 (0) | 2024.02.13 |
[Swift] Core Data(1) - 사용 설정하기 (0) | 2024.02.02 |
[Swift] filter() vs first() - 차이점, 시간복잡도, 디버깅 (1) | 2024.01.29 |