[swift] Swift 퍼미션(Permission) 요청 시 사용자가 권한을 거부했을 때 처리 방법.

퍼미션(Permission)은 iOS 앱에서 사용자의 데이터나 기능에 접근하기 위해 필요한 권한을 요청하는 기능입니다. 사용자가 앱에 대한 퍼미션 요청을 거부할 수도 있으며, 이 경우 앱은 적절한 처리를 해야 합니다.

iOS에서 사용자의 권한이 거부된 경우에는 다음과 같은 처리 방법을 고려할 수 있습니다:

1. 앱 설정으로 사용자 안내하기

앱에서 사용자에게 알림을 표시하고, 앱 설정으로 이동하여 권한을 다시 허용할 수 있도록 안내하는 방법입니다.

예를 들어, 위치 권한이 거부된 경우 사용자에게 알림 창을 표시하고, 앱 설정으로 이동하는 버튼을 제공할 수 있습니다. 다음은 이를 처리하는 예제 코드입니다:

import UIKit
import CoreLocation

class ViewController: UIViewController {

    let locationManager = CLLocationManager()

    override func viewDidLoad() {
        super.viewDidLoad()
        
        locationManager.delegate = self
        
        // 위치 권한 요청
        locationManager.requestWhenInUseAuthorization()
    }
}

extension ViewController: CLLocationManagerDelegate {
    
    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
        switch status {
        case .authorizedWhenInUse:
            // 위치 권한이 허용된 경우
            // 위치 기능을 사용하는 로직 추가
        case .denied:
            // 위치 권한이 거부된 경우
            showPermissionDeniedAlert()
        default:
            break
        }
    }
    
    func showPermissionDeniedAlert() {
        let alertController = UIAlertController(title: "위치 권한 거부됨", message: "위치 권한이 거부되었습니다. 앱 설정에서 권한을 허용해주세요.", preferredStyle: .alert)
        let settingsAction = UIAlertAction(title: "설정으로 이동", style: .default) { _ in
            guard let settingsUrl = URL(string: UIApplication.openSettingsURLString) else {
                return
            }
            if UIApplication.shared.canOpenURL(settingsUrl) {
                UIApplication.shared.open(settingsUrl)
            }
        }
        alertController.addAction(settingsAction)
        
        present(alertController, animated: true, completion: nil)
    }
}

위 코드는 CoreLocation 프레임워크의 CLLocationManager를 사용하여 위치 권한을 요청하고, 사용자가 권한을 변경할 때 호출되는 delegate 메서드를 구현하였습니다. 권한이 거부된 경우에는 showPermissionDeniedAlert() 메서드를 호출하여 알림 창을 표시하고, 설정으로 이동할 수 있는 버튼을 추가했습니다.

2. 앱 종료하기

일부 퍼미션은 앱의 기능이 정상적으로 작동하기 위해 필수적입니다. 따라서 사용자가 권한을 거부한 경우 앱 종료를 선택할 수도 있습니다.

앱이 종료되는 경우 사용자에게 알림을 표시하고, 적절한 안내 메시지를 제공해야 합니다. 예를 들어, 카메라 권한이 거부된 경우 앱 종료를 선택할 수 있다는 안내를 표시하고, 카메라 기능을 이용할 수 있는 다른 앱을 추천하는 방식으로 처리할 수 있습니다.

import UIKit
import AVFoundation

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        checkCameraPermission()
    }
    
    func checkCameraPermission() {
        switch AVCaptureDevice.authorizationStatus(for: .video) {
        case .authorized:
            // 카메라 권한이 허용된 경우
            // 카메라 기능을 사용하는 로직 추가
        case .denied:
            // 카메라 권한이 거부된 경우
            showPermissionDeniedAlert()
        default:
            break
        }
    }
    
    func showPermissionDeniedAlert() {
        let alertController = UIAlertController(title: "카메라 권한 거부됨", message: "카메라 권한이 거부되었습니다. 앱을 종료합니다.", preferredStyle: .alert)
        let okAction = UIAlertAction(title: "확인", style: .default) { _ in
            exit(0)
        }
        alertController.addAction(okAction)
        
        present(alertController, animated: true, completion: nil)
    }
}

위 코드는 AVFoundation 프레임워크의 AVCaptureDevice 클래스를 사용하여 카메라 권한을 확인하고, 사용자가 권한을 거부한 경우에는 showPermissionDeniedAlert() 메서드를 호출하여 알림 창을 표시하고, 앱을 종료하는 예제입니다.

결론

앱에서 사용자의 퍼미션 요청에 대한 거부 처리는 중요한 부분입니다. 사용자가 권한을 거부한 경우에는 사용자를 안내하고, 필요한 동작을 취할 수 있는 메커니즘을 제공하는 것이 좋습니다. 위에서 소개한 방법들을 활용하여 앱의 사용성을 향상시키고, 사용자들의 편의를 고려해보세요.

참고: https://developer.apple.com/documentation/corelocation/cllocationmanager