본문 바로가기
Apple의 SDK/PhotoKit

[PhotoKit] 1. PHPhotoLibrary : Shared Photo Library

by lody.park 2024. 8. 3.

PHPhotoLibrary

PHPhotoLibrary는 사용자의 사진 라이브러리에 대한 접근변경을 관리하는 객체.

 

PHPhotoLibrary 객체는 Photos앱이 관리하는 전체 Asset 및 Collection을 나타냄. (로컬 장치에 저장된 Asset과 iCloud Photos에 저장된 Asset 포함)

 

이 PhotoKit의 PhotoLibrary 즉, PHPhotoLibrary의 객체는 어쩔때 쓰냐면,

  • 사용자가 우리 앱에 부여한 Photos 콘텐츠에 대한 액세스 권한(permission)을 검색 또는 확인할때
  • asset들과 collection들을 변경하고자 할때. 예) 에셋 메타데이터나 콘텐츠 변경, 새로운 에셋 추가, 컬렉션 멤버 재정렬
  • 사진 라이브러리 변경사항에 대한 이벤트 감지하고 싶을 경우

 

1. 사용자의 사진 콘텐츠에 대한 접근 권한 요청 및 확인

앱이 사진 콘텐츠에 접근할 수 있는 권한을 사용자로부터 요청하거나 현재 권한 상태를 확인합니다.

PHPhotoLibrary.requestAuthorization { status in
    switch status {
    case .authorized:
        // 권한이 부여됨
        print("Access granted")
    case .denied, .restricted:
        // 권한이 거부됨
        print("Access denied")
    case .notDetermined:
        // 권한이 아직 결정되지 않음
        print("Access not determined")
    @unknown default:
        fatalError()
    }
}

2. Asset 및 컬렉션 변경

Asset 메타데이터 또는 콘텐츠 편집, 새 Asset 삽입, 컬렉션의 멤버 재배치 등 Asset 및 컬렉션을 변경할 수 있습니다.

PHPhotoLibrary.shared().performChanges({
    let assetChangeRequest = PHAssetChangeRequest(for: asset)
    assetChangeRequest.title = "New Title"
}, completionHandler: { success, error in
    if success {
        print("Asset metadata updated")
    } else {
        print("Error updating metadata: \(String(describing: error))")
    }
})

 

3. 이전 상태 이후로 변경된 레코드 확인

사진 라이브러리의 이전 상태와 비교하여 변경된 레코드를 확인합니다.

if let changeDetails = changeInstance.changeDetails(for: allPhotos) {
    allPhotos = changeDetails.fetchResultAfterChanges
    // 변경 사항 처리
}

 

4. 라이브러리 변경 시 시스템이 보내는 업데이트 메시지 구독 및 구독 해제

라이브러리가 변경될 때 시스템에서 보낸 알림을 수신할 수 있도록 등록합니다.

class MyPhotoLibraryObserver: NSObject, PHPhotoLibraryChangeObserver {
    func photoLibraryDidChange(_ changeInstance: PHChange) {
        // 라이브러리 변경 사항 처리
    }
}

let observer = MyPhotoLibraryObserver()
PHPhotoLibrary.shared().register(observer)

// 더 이상 변경 사항을 수신하지 않으려면 옵저버 등록을 해제합니다.
PHPhotoLibrary.shared().unregisterChangeObserver(observer)

 

앨범 및 내장 컬렉션 목록

앱이 처음 실행되면 사용자의 모든 사진 Asset을 가져옵니다. 모든 Asset 데이터 요청은 PhotoKit의 공유 PHPhotoLibrary 객체를 통해 이루어집니다.

PHPhotoLibrary.shared().register(self)

 

shared() 타입메서드는 PHPhotoLibrary의 싱글톤 객체를 반환합니다. 모든 스레드에서 이 객체를 사용할 수 있습니다 (MT-safe)

 

 

 

사용자의 앨범 및 컬렉션을 나열하려면 PHFetchOptions 객체를 생성하고 여러 가져오기 요청을 디스패치합니다

 

 

 

Shared Photo Library 의 privacy 관련 변경사항 (iOS 14+)

 

사용자가 기기에 저장하는 가장 개인적이고 중요한 데이터 중 하나인 사진과 비디오의 보호는 매우 중요합니다.

iOS 14부터 PhotoKit은 사용자가 특정 Asset만 앱과 공유하도록 선택할 수 있는 새로운 개인정보 보호 제어 기능을 도입했습니다.

이 가이드에서는 이러한 API를 채택하여 향상된 개인정보 보호 경험을 제공하는 방법에 대해 설명합니다.

 

제한된 사진 라이브러리 이해하기 (limited Photos library)

iOS 14에서는 사용자가 전체 사진 라이브러리를 공유하지 않고도 특정 사진과 비디오만 앱과 공유할 수 있는 제한된 사진 라이브러리를 도입했습니다. 이를 통해 사용자 개인정보 보호를 강화할 수 있습니다.

 

앱의 접근 권한 필요성 결정하기

앱이 PhotoKit을 사용하는 방법과 이유를 판단하여 개인정보 보호를 강화할 수 있습니다.

많은 앱은 인터넷에 이미지를 공유하거나 문서나 이메일에 삽입하기 위해 읽기 전용 접근만 필요합니다. 이러한 경우, 새롭게 도입된 PHPickerViewController를 사용하여 사진 라이브러리에 접근하는 것이 가장 간단한 방법입니다.

PHPickerViewController는 UIImagePickerController를 대체하는 새로운 선택기입니다.

이 선택기는 Photos 앱과 동일한 사용자 인터페이스를 제공하며, 검색 및 사진과 비디오의 다중 선택을 지원합니다.

시스템이 별도의 프로세스로 관리하기 때문에 기본적으로 개인 정보 보호가 설정되어 있습니다.

 

앱의 사진 라이브러리 사용 설명하기

PhotoKit의 고급 기능(예: Asset 및 컬렉션 검색 또는 라이브러리 업데이트)이 필요한 경우, 사용자는 명시적으로 앱에 대한 접근 권한을 부여해야 합니다.

 

아래는 접근 권한에 대한 설명을 명시하지 않을때, 즉 Privacy와 관련된 설정을 Info.plist에 추가하지 않았을 경우 아레와 같은 에러를 보게 됩니다.

 

이를 위해 앱이 사진 라이브러리와 상호 작용하는 방식을 설명하는 메시지를 제공해야 합니다. 이 메시지는 사용자가 앱에 접근 권한을 부여할 때 시스템에서 사용자에게 표시됩니다.

 

 

앱의 Info.plist 파일에 적절한 키를 추가하세요.

  • 앱이 라이브러리에 추가만 한다면, NSPhotoLibraryAddUsageDescription 키를 사용하고,
  • 다른 모든 경우에는, NSPhotoLibraryUsageDescription 키를 사용합니다.

 

접근 권한 결정 및 요청하기

사용자가 이미 앱에 라이브러리 접근을 허용했는지 여부를 확인하려면, PHPhotoLibrary를 쿼리하여 현재 앱의 권한 상태를 확인합니다.

 

앱이 처음으로 권한이 필요한 작업을 수행할 때 시스템은 자동으로 사용자에게 권한을 요청합니다.

앱이 처음 실행될 때 PhotoKit 호출을 피하고, 대신 사용자 행동에 따라 권한 요청을 하는 것이 좋습니다.

이렇게 하면 사용자가 앱이 접근을 요청하는 이유에 대해 더 잘 이해할 수 있습니다.

(이 부분은 굳이 처음부터 PhotoKit 호출해서 접근권한 허용할 필요 없고, 그 기능이 필요한 경우에 요청함으로써 UX를 향상시키라는 말임)

 

제한된 라이브러리 사용하기

이전 iOS 버전에서는 사용자가 전체 라이브러리에 대한 접근을 허용하거나 거부할 수 있었습니다.

iOS 14부터 사용자는 앱과 특정 사진과 비디오만 공유할 수 있습니다.

권한을 요청할 때 시스템은 사용자에게 새로운 선택된 사진 옵션을 제공하여 제한된 라이브러리를 관리할 수 있도록 합니다.

 

제한된 라이브러리 선택 인터페이스 표시하기

기본적으로 시스템은 앱의 생애 주기 동안 한 번 자동으로 사용자에게 제한된 라이브러리 선택을 업데이트하도록 요청합니다.

 

하지만 대부분의 앱에서는 이를 프로그래밍적으로 제어하는 것이 더 나은 사용자 경험을 제공합니다.

이를 위해 Info.plist 파일에 다음 키와 값을 추가하여 자동 프롬프트를 억제합니다.

 

제한된 라이브러리 선택 인터페이스를 프로그래밍적으로 표시하려면 사용자 인터페이스에 선택 기능을 추가합니다.

사용자가 이 인터페이스를 탭하면 다음 코드와 같이 제한된 라이브러리 선택기를 표시합니다.

 

iOS 15.0 이상에서는 콜백과 함께 제한된 라이브러리 선택기를 표시할 수 있습니다. 이 방법은 사용자가 제한된 라이브러리 모드를 활성화한 경우에만 작동합니다. 

 

사진 라이브러리의 변경 사항을 모니터링하려면 표준 변경 감시 API를 사용하십시오.

앱을 변경 알림을 받을 수 있도록 등록하고 상태 변경 시 사용자 인터페이스를 업데이트합니다.

 

'Apple의 SDK > PhotoKit' 카테고리의 다른 글

[PhotoKit] 3. Asset Retrieval  (0) 2024.08.03
[PhotoKit] 0. PhotoKit 소개  (1) 2024.08.03