투케이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

// --------------------------------------------------------------------------------------

 

반응형
Comments