PHAsset에 대해서 알아보자

요즘 코어 이미지 활용해서 사진 라이브러리 동기화 한 후 편집하는 프로젝트를 진행하면서 가장 많이 공부 했던 PHAsset에 대해서 기록으로 남겨두려고 한다 🙂

PHAsset란 무엇인가

PHAsset는 iOS 장치 내 Photos 앱에서 관리하는 이미지, 비디오, 라이브 포토 등 데이터를 나타낸다고 생각하면 된다.

사진, 비디오 뿐만 아니라 생성날짜, 위치, 미디어 등 여러가지 해당하는 데이터의 세부정보까지 가져올 수 있다.

 

PHAsset 가져오기

먼저 PHAsset를 사용하기 전에 이용자에게 사진 라이브러리에 접근할 수 있는 권한을 요청해야한다. 이 권한이 부여되어야 에셋에서 사진 정보를 가져올 수 있게 된다.

 

infoplist에 사진 권한 추가는 여기서 따로 다루지는 않을 예정 그냥 권한 요청에 대한 내용의 값을 넣어주면 된다.

import Photos

PHPhotoLibrary.requestAuthorization { status in
    switch status {
    case .authorized:
        print("사진 라이브러리 접근 허용됨")
    case .denied, .restricted:
        print("사진 라이브러리 접근 거부 또는 제한됨")
    case .notDetermined:
        print("사용자가 아직 선택하지 않음")
    @unknown default:
        fatalError("알 수 없는 권한 상태")
    }
}

권한을 설정할 때 여러가지 선택할 수 있다 전부 허용하는 것, 제한하는 것, 아니면 접근을 거부하는 것 등등 여러가지 선택을 할 수 있기 떄문에 권한의 상태를 추적하기 위해 이 메서드를 구현한다.

let fetchOptions = PHFetchOptions()
fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: true)]
let allAssets = PHAsset.fetchAssets(with: fetchOptions)

그 다음 에셋 값을 가져올 수 있도록 구현한다. 여기서 key값으로 어떤 기준으로 데이터를 가져올지 선택할 수 있다.

  • creationDate: 자산이 생성된 날짜.
  • location: 자산이 촬영된 위치.
  • pixelWidthpixelHeight: 자산의 해상도.
  • mediaType: 자산의 유형(이미지, 비디오, 오디오).
  • duration: 비디오 또는 오디오 자산의 길이.

이 값을 저기 위에 key 값에 value 형태로 넣어주면 된다.

let imageManager = PHImageManager.default()

if let asset = allAssets.firstObject {
    let targetSize = CGSize(width: 300, height: 300)
    let options = PHImageRequestOptions()
    options.isSynchronous = true  // 비동기 요청을 위해 false로 설정 가능

    imageManager.requestImage(for: asset, targetSize: targetSize, contentMode: .aspectFill, options: options) { image, info in
        if let image = image {
            DispatchQueue.main.async {
                // 이미지를 사용 (예: UIImageView에 표시)
                imageView.image = image
            }
        }
    }
}

그 다음 매니저를 하나 만들어 메서드를 구현하고 에셋을 통해 들어온 사진의 데이터를 현재 프로젝트의 모델 내 넣어주는 과정을 거치면 별도로 사진을 저장해 두지 않아도 사진 라이브러리에 있는 사진이 자동으로 들어와서 동기화 작업이 완료 된다 :0

 

생각보다 간단하게 적용했던 것 같아 되게 신기했고 역시 애플 생태계 내에서 이런 장점이 확실히 들어나는 것 같다.

 

오늘은 PHAsset을 활용해 데이터를 가져오는 것만 알아봤지만 이후 포스팅은 이 가져온 사진데이터로 CoreImage를 활용해 이미지를 편집하는 과정을 다뤄볼 예정이다.

 

이 과정을 통해 카메라앱이든 이미지 편집 앱이든 다양한 분야에서 활용이 가능하니까 알아두면 좋을 것 같다 ㅎㅎ

오늘은 여기까지!