[iOS] 카메라(Camera)/앨범(Album) 권한
2025. 1. 13. 22:52ㆍiOS
반응형
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. 주의사항
- Info.plist에 해당 키를 추가하지 않으면 앱이 충돌합니다.
- 카메라 또는 사진첩 접근 권한은 사용자가 수동으로 설정을 변경하지 않는 한 기본적으로 계속 유지됩니다.
- 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 |