처음에 접한 명칭은 "Photos 프레임워크"인데 애플 공식문서에는 PhotoKit이라고 나와있고 어디서는 이 둘은 같은 의미라고 하면서, import 할때는 PhotosKit이 아닌 Photos로 해줘야 한다.명칭부터 뭔가 헷갈렸는데 내용도 많이 헷갈렸다...
PhotoKit은 iOS 및 macOS에서 사진과 비디오 관련 애플리케이션 개발을 하기 위한 프레임워크로, 애플의 사진 라이브러리에 접근하고, 사진과 비디오 에셋과 메타데이터를 관리하는 기능, 사진 라이브러리의 변경을 감지하고 반응하는 기능 등을 제공한다. 'import Photos'를 통해 엑세스할 수 있는 "Photos 프레임워크" 와 "PhotoKit"은 같은 의미로도 사용되기도 한다.
공식문서 이미지를 보면 애플리케이션이 사진앱에 직접 접근하지 않고 PhotoKit을 통해 접근하는것을 볼 수 있다.
위에서 설명한 객체들은 사진이나 실제 비디오 자체가 아닌 사진 라이브러리의 구조와 메타데이터를 나타낸다.
공식문서와 다른 글들을 보고 공부하면서 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 메소드를 사용해야 한다. 이러한 방식은 여러 스레드나 다른 애플리케이션과 동시에 같은 에셋을 사용할 때 안전하고 효율적으로 작업을 처리하기 위해 설계 되었다.
변경 작업은 두 단계가 있다.
새로운 이미지를 사진 라이브러리에 추가하는 코드
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 프레임워크는 단순히 사진이나 비디오에 접근만 하는것이 아닌 편집하고 그 결과를 저장 가능하다.
iOS 기기의 사진 라이브러리는 여러 애플리케이션에 의해 동시 접근 가능하다. 따라서 한 앱에서 변경 사항이 다른 앱에서도 반영되도록 Photos 프레임워크는 옵저버패턴을 사용하여 변화를 감지하고 알림을 제공한다.
Photos 프레임워크는 에셋의 백업 및 복원과 같은 고급 작업도 지원한다.
Photos 프레임워크는 iOS에서 사진과 비디오를 효과적으로 관리하기 위한 필수적인 도구다. 뭔가 복잡하게 느껴져서 작성한 내용이 맞는건지 제대로 이해한건지 잘 모르겠다. 그래서 직접 사용해보면서 좀더 깊게 알아 보겠다.