[iOS] 카메라(Camera)/앨범(Album) 권한

2025. 1. 13. 22:52iOS

반응형

Swift에서 카메라 및 사진첩 접근 권한을 관리하고 사용하는 방법은 iOS의 Privacy 정책에 따라 이루어집니다. 이를 구현하기 위해서는 아래의 단계를 따릅니다:

 

1. 권한 요청을 위한 설정 (Info.plist)

애플리케이션이 카메라나 사진첩에 접근하려면 Info.plist에 사용자에게 권한 요청 메시지를 명시해야 합니다.

필수 키와 설명:

  • 카메라 접근:
<key>NSCameraUsageDescription</key> 
<string>앱이 카메라를 사용하려면 허가가 필요합니다.</string>
  • 사진첩 접근:
<key>NSPhotoLibraryUsageDescription</key> 
<string>앱이 사진첩에 접근하려면 허가가 필요합니다.</string>
  • 사진첩에 저장 (iOS 14 이상):
<key>NSPhotoLibraryAddUsageDescription</key> 
<string>앱이 사진을 저장하려면 허가가 필요합니다.</string>
 

 

2. 권한 요청 및 상태 확인

iOS 권한 프레임워크

  • 카메라 권한: AVFoundation 프레임워크 사용
  • 사진첩 권한: Photos 프레임워크 사용

카메라 권한 관리

권한 상태 확인

import AVFoundation 

func checkCameraAuthorizationStatus() { 
	let status = AVCaptureDevice.authorizationStatus(for: .video) 
    switch status { 
    case .authorized: 
    	print("카메라 권한 허용됨") 
    case .denied: 
    	print("카메라 권한 거부됨") 
    case .notDetermined: 
    	print("카메라 권한 요청 전 상태") 
    case .restricted: 
    	print("카메라 접근이 제한됨 (예: 부모 통제)") 
    @unknown default: 
    	print("알 수 없는 상태") 
    } 
}

권한 요청

AVCaptureDevice.requestAccess(for: .video) { granted in 
	if granted { 
    	print("카메라 접근 허용됨") 
    } else { 
    	print("카메라 접근 거부됨") 
    } 
}

 

사진첩 권한 관리

권한 상태 확인

import Photos 

func checkPhotoLibraryAuthorizationStatus() { 
	let status = PHPhotoLibrary.authorizationStatus() 
    
    switch status { 
    case .authorized: 
    	print("사진첩 접근 허용됨") 
    case .denied: 
    	print("사진첩 접근 거부됨") 
    case .notDetermined: 
    	print("사진첩 접근 요청 전 상태") 
    case .restricted: 
    	print("사진첩 접근이 제한됨 (예: 부모 통제)") 
    case .limited: 
    	print("사진첩의 일부 콘텐츠만 접근 가능 (iOS 14 이상)") 
    @unknown default: 
    	print("알 수 없는 상태") 
    } 
}
 
권한 요청
PHPhotoLibrary.requestAuthorization { status in 
	switch status { 
    case .authorized: 
    	print("사진첩 접근 허용됨") 
    case .denied: 
    	print("사진첩 접근 거부됨") 
    case .limited: 
    	print("사진첩의 일부 콘텐츠만 접근 가능 (iOS 14 이상)") 
    case .restricted: 
    	print("사진첩 접근이 제한됨") 
    case .notDetermined: 
    	print("사진첩 접근 요청 전 상태") 
    @unknown default: 
    	print("알 수 없는 상태") 
    } 
}

 

3. 카메라 및 사진첩 사용

카메라 실행

카메라를 사용하려면 UIImagePickerController 또는 AVFoundation의 AVCaptureSession을 사용할 수 있습니다.

import UIKit 

func presentCamera(from viewController: UIViewController) { 
	guard UIImagePickerController.isSourceTypeAvailable(.camera) else { 
    	print("카메라를 사용할 수 없습니다.") 
        return 
    } 
    
    let picker = UIImagePickerController() 
    picker.sourceType = .camera 
    picker.delegate = viewController as? UIImagePickerControllerDelegate & UINavigationControllerDelegate 
    viewController.present(picker, animated: true, completion: nil) 
}

 

사진첩 열기:

사진첩에 접근하려면 UIImagePickerController를 사용합니다.

func presentPhotoLibrary(from viewController: UIViewController) { 
	guard UIImagePickerController.isSourceTypeAvailable(.photoLibrary) else { 
    	print("사진첩을 사용할 수 없습니다.") 
        return 
    } 
    
    let picker = UIImagePickerController() 
    picker.sourceType = .photoLibrary 
    picker.delegate = viewController as? UIImagePickerControllerDelegate & UINavigationControllerDelegate 
    viewController.present(picker, animated: true, completion: nil) 
}

 

4. iOS 14 이상 사진첩의 '선택적 접근' 처리

iOS 14부터 사용자가 사진첩의 특정 사진만 공유할 수 있는 기능(선택적 접근)이 추가되었습니다. 이 경우 PHPhotoLibrary.authorizationStatus(for:)로 상태를 확인하고, 권한을 업데이트할 수 있습니다.

import Photos 

if #available(iOS 14, *) { 
	PHPhotoLibrary.requestAuthorization(for: .readWrite) { status in 
    	if status == .limited { 
        	DispatchQueue.main.async { 
            	PHPhotoLibrary.shared().presentLimitedLibraryPicker(from: viewController) 
            } 
        } 
    } 
}

 

5. 설정으로 이동하여 권한 변경

권한이 거부된 경우 사용자가 설정에서 변경할 수 있도록 안내합니다.

if let settingsURL = URL(string: UIApplication.openSettingsURLString) { 
	UIApplication.shared.open(settingsURL, options: [:], completionHandler: nil) 
}

 

6. 주의사항

  1. Info.plist에 해당 키를 추가하지 않으면 앱이 충돌합니다.
  2. 카메라 또는 사진첩 접근 권한은 사용자가 수동으로 설정을 변경하지 않는 한 기본적으로 계속 유지됩니다.
  3. UIImagePickerController는 기본 UI를 제공하지만, 맞춤 UI를 원하면 AVFoundation 또는 Photos를 사용해 직접 구현할 수 있습니다.

이러한 방식으로 카메라 및 사진첩에 접근하고 권한을 관리할 수 있습니다.

반응형

'iOS' 카테고리의 다른 글

[iOS] Retain Cycle (참조 순환)  (1) 2025.01.19
[iOS] ARC (Automatic Reference Counting)  (0) 2025.01.19
[RxSwift] PublishSubject  (0) 2025.01.10
[RxSwift] BehaviorSubject  (0) 2025.01.10
[iOS] Keychain과 UserDefaults 병행  (1) 2025.01.10