PhotoKit 알아보기

고라니·2023년 8월 9일
0

TIL

목록 보기
21/67

처음에 접한 명칭은 "Photos 프레임워크"인데 애플 공식문서에는 PhotoKit이라고 나와있고 어디서는 이 둘은 같은 의미라고 하면서, import 할때는 PhotosKit이 아닌 Photos로 해줘야 한다.명칭부터 뭔가 헷갈렸는데 내용도 많이 헷갈렸다...

PhotoKit과 Photos프레임워크

PhotoKit은 iOS 및 macOS에서 사진과 비디오 관련 애플리케이션 개발을 하기 위한 프레임워크로, 애플의 사진 라이브러리에 접근하고, 사진과 비디오 에셋과 메타데이터를 관리하는 기능, 사진 라이브러리의 변경을 감지하고 반응하는 기능 등을 제공한다. 'import Photos'를 통해 엑세스할 수 있는 "Photos 프레임워크" 와 "PhotoKit"은 같은 의미로도 사용되기도 한다.

공식문서 이미지를 보면 애플리케이션이 사진앱에 직접 접근하지 않고 PhotoKit을 통해 접근하는것을 볼 수 있다.

Photos의 기본 구성요소

  • 에셋(PHAsset): 사용자의 사진 라이브러리의 개별 미디어 항목에 대한 메타데이터와 참조 정보를 나타내는 객체이다. 이 객체를 통해 미디어의 세부 정보에 접근 가능하다.
  • 에셋컬렉션(PHAssetCollection): PHAsst객체의 모음.
  • 컬렉션리스트(PHCollectionList): PHAssetCollecion의 그룹
  • 포토라이브러리(PHPhotoLibrary): 에셋과 컬렉션의 변경 요청을 수행하는 객체.

위에서 설명한 객체들은 사진이나 실제 비디오 자체가 아닌 사진 라이브러리의 구조와 메타데이터를 나타낸다.

에셋과 PHAsset?

공식문서와 다른 글들을 보고 공부하면서 PHAsset을 에셋이라고 부르고 Asset도 에셋이라고 부르고 설명하니 계속 헷갈렸다. 결론부터 말하는 일단 둘은 다른 의미를 가진다.

에셋(Asset)은 Photos 프레임워크 내에서 실제로 사진 앱에 저장된 이미지나 비디오를 의미.
PHAsset은 Photos 프레임워크의 클래스 중 하나로, 실제 이미지나 비디오가 아닌 해당 에셋의 메타 데이터와 참조 정보만을 포함. 즉 PHAsset은 실제 이미지나 비디오 데이터를 포함하지 않음

에셋 가져오기

에셋에 접근하기 위해서는 PHAsset의 PHFetchResult를 사용하면 된다.

let allPhotos: PHFetchResult<PHAsset> = PHAsset.fetchAssets(with: .image, options: nil)

PHAsset 객체의 리스트를 얻을 수 있으며, 해당 에셋의 실제 이미지 데이터에 접근하려면 PHImageManager를 사용해야 한다.

위에서 리스트를 얻을수 있다고 했다. 컬렉션 뷰 같은 UI에 사용될 때 IndexPath를 통해 배열들의 요소에 접근하듯 사용 가능하다.

사진 라이브러리 구조와 메타데이터 변경

PHAsset, PHAssetCollection, PHCollectionList와 같은 클래스들은 모두 읽기 전용이다. 변경을 위해서는 PHPhotoLibrary의 performChange나 performChangeAndWait 메소드를 사용해야 한다. 이러한 방식은 여러 스레드나 다른 애플리케이션과 동시에 같은 에셋을 사용할 때 안전하고 효율적으로 작업을 처리하기 위해 설계 되었다.

변경 작업은 두 단계가 있다.

  1. 변경 요청
    PHAssetChangeRequest, PHAssetCollectionChangeRequest, PHCollectionListChangeRequest 등의 클래스를 사용하여 에셋이나 컬렉션에 대한 변경 요청을 만든다.
  2. 변경 실행
    PHPhotoLibrary.shared().performChange 또는 PHPhotoLibrary.shared().performChangesAndWait 메서드를 사용하여 변경 요청을 실제로 진행한다.
    변경 작업이 성공하면 completion handler에 success 파라미터로 true가 전달괴고 실패하면 false가 전달된다.
  • PHAssetChangeRequest: 사진 라이브러리 변경 블록(클로저)에서 사용하여, 에셋의 생성, 삭제, 메타데이터 수정에 관한 변경 요청을 만든다.
  • PHAssetCollectionChangeRequest: 에셋 컬렉션의 생성, 삭제, 메타데이터 수정을 위한 변경 요청을 만든다.
  • PHCollectionListChangeRequest: 에셋 컬렉션리스트의 생성, 삭제, 메타데이터 수정에 대한 변경 요청을 만든다.

새로운 이미지를 사진 라이브러리에 추가하는 코드

let image = UIImage(named: "example.jpg")!
let imageData = image.pngData()!

PHPhotoLibrary.shared().performChanges({
    let creationRequest = PHAssetCreationRequest.forAssetFromImage(atFileURL: imageURL)
}, completionHandler: { success, error in
    if success {
        print("Image added successfully!")
    } else if let error = error {
        print("Error adding image: \(error.localizedDescription)")
    }
})

PhotoKit을 사용할 때는 사용자 권한을 반드시 확인해야 한다.
Info.plist에 NSPhotoLibraryUsageDescription 키를 추가하여 접근 권한을 요청해야 함

에셋 편집

Photos 프레임워크는 단순히 사진이나 비디오에 접근만 하는것이 아닌 편집하고 그 결과를 저장 가능하다.

  • PHContentEditingInput & PHContentEditingOutput: 사진 또는 비디오를 편집할 때 사용되며, 집하기 전과 후의 에셋 정보를 제공한다.
  • PHAdjustmentData: 편집한 내용을 기록하며, 이를 통해 나중에 편집을 되돌릴 수 있다.

라리브러리의 변화 감지

iOS 기기의 사진 라이브러리는 여러 애플리케이션에 의해 동시 접근 가능하다. 따라서 한 앱에서 변경 사항이 다른 앱에서도 반영되도록 Photos 프레임워크는 옵저버패턴을 사용하여 변화를 감지하고 알림을 제공한다.

  • PHPhotoLibraryChangeObserver: 라이브러리의 변화를 감지하며, 이 변화에 대한 상세 내용을 제공하는 역할
  • PHChange, PHObjectChangeDetails, PHFetchResultChangeDetails: 변화의 세부 사항을 제공, 이를 통해 변화에 알맞는 UI를 실시간으로 업데이트 할 수 있다.

에셋 리소스

Photos 프레임워크는 에셋의 백업 및 복원과 같은 고급 작업도 지원한다.

  • PHAssetResource: 에셋의 기본 데이터에 직접 접근할 수 있게 해준다.
  • PHAssetCreationRequest: 새로운 에셋을 생성하는 요청을 처리
  • PHAssetResourceManager & PHAssetResourceRequestOptions: 에셋 리소스를 더욱 디테일하게 관리하는데 필요한 도구이다.

마치면서

Photos 프레임워크는 iOS에서 사진과 비디오를 효과적으로 관리하기 위한 필수적인 도구다. 뭔가 복잡하게 느껴져서 작성한 내용이 맞는건지 제대로 이해한건지 잘 모르겠다. 그래서 직접 사용해보면서 좀더 깊게 알아 보겠다.

profile
🍎 무럭무럭

0개의 댓글