Jiwift

[iOS/Swift] 카메라 앨범 권한 요청하기 및 권한 확인, camera album permission check 본문

iOS Dev/Swift

[iOS/Swift] 카메라 앨범 권한 요청하기 및 권한 확인, camera album permission check

지위프트 2023. 10. 21. 00:13
반응형

샘플 이미지

 이번 글에서는 카메라와 앨범의 권한 요청 및 권한 확인하는 코드를 알아보겠습니다. iOS 14 이상을 기반으로 작성되었습니다.

 

enum MediaPermissionType {
    case camera // 카메라 권한 유형
    case album  // 앨범 권한 유형
}

 MediaPermissionType 열거형을 선언해서 사용하도록 하겠습니다. 그렇게 중요한건 아니고 개발자마다 분기문을 작성하는 방법이 다르기 때문에 전체 코드를 보시고 취향것 하시면 됩니다.

camera: 카메라 권한을 나타내는 열거형 케이스.
album: 앨범(사진 라이브러리) 권한을 나타내는 열거형 케이스.

 

static func requestPermission(type: MediaPermissionType, completion: @escaping (Bool) -> Void) {
    switch type {
    case .camera:
        // 카메라 권한
        self.requestCameraPermission(completion: completion)
    case .album:
        // 앨범 권한
        self.requestAlbumPermission(completion: completion)
    }
}

requestPermission(type:completion:)

 이 메서드를 호출하여 카메라 또는 앨범 권한을 요청할 수 있습니다. 각각 요청하는 함수들을 호출하게되며, 권한 요청이 완료되면 제공된 클로저(또는 completion 핸들러)가 호출되며 권한 부여 여부를 전달합니다. 사용자가 이미 권한 절차를 수행한 후라면 현재 상태의 권한 결과를 반환 합니다. 

 

private static func requestCameraPermission(completion: @escaping (Bool) -> Void) {
    AVCaptureDevice.requestAccess(for: .video) { granted in
        DispatchQueue.main.async {
            completion(granted)
        }
    }
}


private static func requestAlbumPermission(completion: @escaping (Bool) -> Void) {
    if #available(iOS 14, *) {
        PHPhotoLibrary.requestAuthorization(for: .readWrite) { status in
            DispatchQueue.main.async {
                switch status {
                case .authorized, .limited:
                    print("Album: 권한 허용")
                    completion(true)
                case .denied, .restricted, .notDetermined:
                    print("Album: 권한 거부")
                    completion(false)
                @unknown default:
                    print("Album: 알 수 없는 상태")
                    completion(false)
                }
            }
        }
    } else {
        print("Album: iOS 14 미만의 버전은 지원하지 않습니다.")
        completion(false)
    }
}

requestCameraPermission(completion:):

카메라 권한을 요청하는 비동기 메서드로, 사용자가 권한을 부여하거나 거부할 때 클로저가 호출됩니다.

requestAlbumPermission(completion:):

앨범(사진 라이브러리) 권한을 요청하는 메서드로, iOS 14 이상에서만 사용 가능합니다. 권한 부여 여부에 따라 클로저가 호출됩니다. 

 

-카메라 권한 요청

 AVCaptureDevice.requestAccess(for:)를 사용하여 카메라 권한을 비동기적으로 요청합니다. 요청이 완료되면 클로저가 호출되며, granted 매개변수를 통해 권한 부여 여부가 전달됩니다. 

 

-앨범 권한 요청

 PHPhotoLibrary.requestAuthorization(for:)를 사용하여 iOS 14 이상에서 앨범 권한을 요청합니다. 권한 부여 여부에 따라 클로저가 호출됩니다. 권한이 부여되면 "권한 허용"을 출력하고 true를 반환하고, 권한이 거부되면 "권한 거부"를 출력하고 false를 반환합니다.

 

iOS 14 미만의 버전에서는 권한 요청을 지원하지 않으며 "iOS 14 미만의 버전은 지원하지 않습니다."를 출력하고 false를 반환합니다.

 

 

 

 

사용 예시

MediaPermissionUtil.requestPermission(type: .camera) { result in
    if result {
    	// 카메라 권한 있음
    } else {
    	// 카메라 권한 없음
    }
}


MediaPermissionUtil.requestPermission(type: .album) { result in
    if result {
    	// 앨범 권한 있음
    } else {
    	// 앨범 권한 없음
    }
}

 

 

 


 

전체 코드

import Foundation
import PhotosUI

enum MediaPermissionType {
    case camera // 카메라 권한 유형
    case album  // 앨범 권한 유형
}

struct MediaPermissionUtils {
    
    static func requestPermission(type: MediaPermissionType, completion: @escaping (Bool) -> Void) {
        switch type {
        case .camera:
            // 카메라 권한
            self.requestCameraPermission(completion: completion)
        case .album:
            // 앨범 권한
            self.requestAlbumPermission(completion: completion)
        }
    }
    
    private static func requestCameraPermission(completion: @escaping (Bool) -> Void) {
        AVCaptureDevice.requestAccess(for: .video) { granted in
            DispatchQueue.main.async {
                completion(granted)
            }
        }
    }
    
    
    private static func requestAlbumPermission(completion: @escaping (Bool) -> Void) {
        if #available(iOS 14, *) {
            PHPhotoLibrary.requestAuthorization(for: .readWrite) { status in
                DispatchQueue.main.async {
                    switch status {
                    case .authorized, .limited:
                        print("Album: 권한 허용")
                        completion(true)
                    case .denied, .restricted, .notDetermined:
                        print("Album: 권한 거부")
                        completion(false)
                    @unknown default:
                        print("Album: 알 수 없는 상태")
                        completion(false)
                    }
                }
            }
        } else {
            print("Album: iOS 14 미만의 버전은 지원하지 않습니다.")
            completion(false)
        }
    }
}
반응형