Notice
Recent Posts
Recent Comments
Link
투케이2K
613. (ios/swift5) [간단 소스] PHPhotoLibrary 간단 설명 및 사용 옵션 정리 - 사진 액세스 및 변경 사항 관리 본문
IOS
613. (ios/swift5) [간단 소스] PHPhotoLibrary 간단 설명 및 사용 옵션 정리 - 사진 액세스 및 변경 사항 관리
투케이2K 2024. 12. 13. 08:35[개발 환경 설정]
개발 툴 : XCODE
개발 언어 : SWIFT5
[소스 코드]
// --------------------------------------------------------------------------------------
[개발 및 테스트 환경]
// --------------------------------------------------------------------------------------
- 언어 : Swift
- 개발 툴 : Xcode
- 기술 구분 : PHPhotoLibrary / 사진 액세스 및 변경 사항 관리
// --------------------------------------------------------------------------------------
// --------------------------------------------------------------------------------------
[설명 정리]
// --------------------------------------------------------------------------------------
1. PHPhotoLibrary 은 사용자의 사진 라이브러리에 대한 액세스와 변경 사항을 관리하는 객체입니다.
2. PHPhotoLibrary 은 로컬 기기에 저장된 자산과 iCloud Photos에 저장된 자산을 포함하여 Photos 앱이 관리하는 전체 자산 및 컬렉션 세트를 나타냅니다.
2. PHPhotoLibrary 작업 사용 관련 :
>> 앱이 사진 콘텐츠에 액세스하기 위한 사용자 권한 검색 또는 확인
>> 자산 및 컬렉션 변경하기(예: 자산 메타데이터 또는 콘텐츠 편집, 새 자산 삽입 또는 컬렉션 멤버 재정렬)
>> 이전 사진 라이브러리 상태 이후 변경된 레코드 확인
>> 라이브러리가 변경될 때 시스템이 보내는 업데이트 메시지에 등록
3. PHPhotoLibrary 사용 가능 지원 범위 :
>> iOS 8.0 이상
>> 아이패드OS 8.0 이상
>> 맥 카탈리스트 13.1+
>> 맥OS 10.13+
>> tvOS 10.0 이상
>> 비전OS 1.0+
4. PHPhotoLibrary 권한 확인 관련 :
>> class func authorizationStatus(for: PHAccessLevel) -> PHAuthorizationStatus : 지정된 액세스 수준에 대해 사용자의 사진 라이브러리에 액세스할 수 있는 앱의 권한을 반환합니다.
>> class func requestAuthorization(for: PHAccessLevel, handler: (PHAuthorizationStatus) -> Void) : 사용자에게 앱에 사진 라이브러리에 접근할 수 있는 권한을 부여하라는 메시지를 표시합니다.
>> enum PHAccessLevel : 사용자의 사진 라이브러리에 대한 앱의 접근 수준입니다.
- case addOnly : 앱이 사용자의 사진 라이브러리에만 추가할 수 있음을 나타내는 값입니다.
- case readWrite : 앱이 사용자의 사진 라이브러리에서 읽고 쓸 수 있음을 나타내는 값입니다.
>> enum PHAuthorizationStatus : 사용자의 사진 라이브러리에 접근하기 위한 앱의 권한에 대한 정보입니다.
- case notDetermined : 사용자가 앱의 승인 상태를 설정하지 않았습니다.
- case restricted : 앱은 사진 라이브러리에 접근할 수 있는 권한이 없으며, 사용자는 해당 권한을 부여할 수 없습니다.
- case denied : 사용자는 이 앱이 사진 라이브러리에 액세스하는 것을 명시적으로 거부했습니다.
- case authorized : 사용자가 이 앱에 사진 라이브러리 접근 권한을 명시적으로 부여했습니다.
- case limited : 사용자는 이 앱에 제한된 사진 라이브러리 접근 권한을 부여했습니다.
5. PHPhotoLibrary 공유 라이브러리 액세스 관련 :
>> class func shared() -> PHPhotoLibrary : 공유 사진 라이브러리 객체를 검색합니다.
6. Limited Library Picker 사용 관련 :
>> func presentLimitedLibraryPicker(from: UIViewController) : 사용자에게 제한된 라이브러리 선택을 업데이트하라는 메시지를 표시합니다.
>> func presentLimitedLibraryPicker(from: UIViewController, completionHandler: ([String]) -> Void) : 새로 선택한 식별자를 제공하는 콜백을 통해 제한된 라이브러리 선택을 업데이트하라는 메시지를 사용자에게 표시합니다.
7. PHPhotoLibrary 라이브러리 업데이트 관련 :
>> func performChanges(() -> Void, completionHandler: ((Bool, (any Error)?) -> Void)?) : 사진 라이브러리에 대한 변경 사항을 요청하는 블록을 비동기적으로 실행합니다.
>> func performChangesAndWait(() -> Void) throws : 사진 라이브러리에서 변경 작업을 수행하도록 요청하는 블록을 동기적으로 실행합니다.
>> class PHChangeRequest : 프레임워크의 사진 라이브러리 변경 요청의 추상 기본 클래스입니다.
>> class PHAssetChangeRequest : 사진 라이브러리 변경 블록에서 사용하기 위해 사진 자산의 콘텐츠를 생성, 삭제, 메타데이터를 변경하거나 편집하기 위한 요청입니다.
>> class PHAssetCollectionChangeRequest : 사진 라이브러리 변경 블록에서 사용하기 위해 사진 자산 컬렉션을 생성, 삭제 또는 수정하기 위한 요청입니다.
>> class PHCollectionListChangeRequest : 사진 라이브러리 변경 블록에서 사용하기 위해 사진 컬렉션 목록을 생성, 삭제 또는 수정하기 위한 요청입니다.
>> class PHObjectPlaceholder : 생성할 사진 자산이나 컬렉션을 나타내는 읽기 전용 프록시 개체입니다.
8. PHPhotoLibrary 변경 내역 가져오기 관련 :
>> func fetchPersistentChanges(since: PHPersistentChangeToken) throws -> PHPersistentChangeFetchResult : 지정한 토큰 이후의 사진 라이브러리 변경 사항을 검색합니다.
>> class PHPersistentChangeFetchResult : 페치 결과를 나타내는 객체로, 매우 큰 규모의 변경 레코드 집합을 열거할 수 있습니다.
>> var currentChangeToken: PHPersistentChangeToken : 사진 라이브러리의 현재 상태를 나타내는 불투명 토큰입니다.
>> class PHPersistentChangeToken : 실행 간에 사진 라이브러리 상태를 추적하는 불투명한 개체이며, 나중에 사용하기 위해 복사하여 직렬화할 수 있습니다.
9. PHPhotoLibrary 변화 관찰 관련 :
>> func register(any PHPhotoLibraryChangeObserver) : 사진 라이브러리의 객체가 변경될 때 메시지를 받을 객체를 등록합니다.
>> func unregisterChangeObserver(any PHPhotoLibraryChangeObserver) : 개체의 등록을 해제하여 더 이상 변경 메시지를 받지 않도록 합니다.
>> protocol PHPhotoLibraryChangeObserver : 사진 라이브러리의 변경 사항을 앱에 알리기 위해 시스템에서 채택할 프로토콜입니다.
>> class PHChange : 사진 라이브러리에서 발생한 변경 사항에 대한 설명입니다.
>> class PHObjectChangeDetails : 자산 또는 컬렉션 개체에서 발생한 변경 사항에 대한 설명입니다.
>> class PHFetchResultChangeDetails : 페치 결과에 나열된 자산 또는 컬렉션 객체 세트에서 발생한 변경 사항에 대한 설명입니다.
10. PHPhotoLibrary 이용 가능성 관련 :
>> func register(any PHPhotoLibraryAvailabilityObserver) : 사진 라이브러리의 가용성 변화를 관찰하기 위해 객체를 등록합니다.
>> func unregisterAvailabilityObserver(any PHPhotoLibraryAvailabilityObserver) : 사진 라이브러리의 가용성 변경 사항을 관찰하기 위해 객체의 등록을 해제합니다.
>> protocol PHPhotoLibraryAvailabilityObserver : 사진 라이브러리의 가용성이 변경될 때 시스템에서 앱에 알리도록 하는 프로토콜입니다.
>> var unavailabilityReason: (any Error)? : 사진 라이브러리를 사용할 수 없는 이유를 설명하는 오류입니다.
11. PHPhotoLibrary 로컬 식별자와 iCloud 식별자 간 변환 관련 :
>> func cloudIdentifierMappings(forLocalIdentifiers: [String]) -> [String : Result<PHCloudIdentifier, any Error>] : 로컬 식별자 목록에 대한 클라우드 식별자 매핑을 검색합니다.
>> func localIdentifierMappings(for: [PHCloudIdentifier]) -> [PHCloudIdentifier : Result<String, any Error>] : 클라우드 식별자 목록에 대한 로컬 식별자 매핑을 검색합니다.
>> class PHCloudIdentifier : iCloud 사진을 통해 동기화되는 자산이나 컬렉션을 식별하는 개체입니다.
12. PHPhotoLibrary 사용 예시 소스 코드 :
// ---------------------------------------------
// MARK: - [포토 앨범 퍼미션 권한 확인 실시]
// ---------------------------------------------
var checkPhotoFlag = false
func getPhotoAuthCheck() -> Bool {
S_Log._D_(description: "앨범의 사진에 대한 접근 권한 요청 실시", data: nil)
/*
// -----------------------------------------
// [getPhotoAuthCheck 메소드 설명]
// -----------------------------------------
1. 필요 info plist : Privacy - Photo Library Usage Description
// -----------------------------------------
2. 필요 import : import AVFoundation , import Photos
// -----------------------------------------
3. 호출 방법 : if C_Permission().getPhotoAuthCheck() == true {} else {}
// -----------------------------------------
4. 참고 퍼미션 요청 알림 : 게시물 업로드를 위해 앨범 접근 권한이 필요합니다. 허용하시겠습니까?
// -----------------------------------------
5. 주요 참고 : 뷰 컨트롤러 viewDidAppear 뷰 화면 표시 , 포그라운드 상태에서 요청 수행 실시
// -----------------------------------------
*/
// [세마포어 선언 : 프로그램 로직을 동기화 구현 : value 0 값은 대기 상태 선언]
let semaphore = DispatchSemaphore(value: 0)
// [앨범의 사진에 대한 접근 권한 확인 실시]
PHPhotoLibrary.requestAuthorization( { status in
switch status{
case .authorized:
S_Log._D_(description: "앨범의 사진에 대한 접근 권한 확인 실시", data: [
"상 태 :: 앨범 권한 허용"
])
// [리턴 결과 플래그 값 변경]
self.checkPhotoFlag = true
// [세마포어 신호 알림]
semaphore.signal()
break
case .denied:
S_Log._D_(description: "앨범의 사진에 대한 접근 권한 확인 실시", data: [
"상 태 :: 앨범 권한 거부"
])
// [리턴 결과 플래그 값 변경]
self.checkPhotoFlag = false
// [세마포어 신호 알림]
semaphore.signal()
break
case .notDetermined:
S_Log._D_(description: "앨범의 사진에 대한 접근 권한 확인 실시", data: [
"상 태 :: 앨범 권한 선택하지 않음"
])
// [리턴 결과 플래그 값 변경]
self.checkPhotoFlag = false
// [세마포어 신호 알림]
semaphore.signal()
break
case .restricted:
S_Log._D_(description: "앨범의 사진에 대한 접근 권한 확인 실시", data: [
"상 태 :: 앨범 접근 불가능, 권한 변경이 불가능"
])
// [리턴 결과 플래그 값 변경]
self.checkPhotoFlag = false
// [세마포어 신호 알림]
semaphore.signal()
break
default:
S_Log._D_(description: "앨범의 사진에 대한 접근 권한 확인 실시", data: [
"상 태 :: default"
])
// [리턴 결과 플래그 값 변경]
self.checkPhotoFlag = false
// [세마포어 신호 알림]
semaphore.signal()
break
}
})
// [세마포어 확인 대기]
semaphore.wait()
S_Log._D_(description: "앨범의 사진에 대한 접근 권한 확인 실시", data: [
"return :: \(self.checkPhotoFlag)"
])
// [결과 리턴 실시]
return self.checkPhotoFlag
}
// --------------------------------------------------------------------------------------
// --------------------------------------------------------------------------------------
[참고 사이트]
// --------------------------------------------------------------------------------------
[애플 공식 사이트]
https://developer.apple.com/documentation/photos/phphotolibrary
[PHAuthorizationStatus 사용해 앨범 접근 권한 상태 확인 및 PHPhotoLibrary 권한 요청 수행]
https://blog.naver.com/kkh0977/223593759332?trackingCode=blog_bloghome_searchlist
[PHPhotoLibrary 사용해 사용자 앨범 접근 및 이미지 사진 편집 수행 실시]
https://blog.naver.com/kkh0977/222939478432?trackingCode=blog_bloghome_searchlist
[C_Permission - 모바일 퍼미션 권한 관리 클래스]
https://blog.naver.com/kkh0977/222681793409?trackingCode=blog_bloghome_searchlist
// --------------------------------------------------------------------------------------
반응형
'IOS' 카테고리의 다른 글
Comments