만약 우리가 만든 App에 사진첩의 사진을 가져오려고 한다면, PhotoKit을 사용해야 할 것입니다.
이번 주제에서는 위 PhotoKit을 이용하여 사진첩에 있는 사진을 가져와 나만의 Custom 사진첩을 만들어 보겠습니다.
하지만, 만들어 보기 전에 PhotoKit과 사진첩을 만들기 위한 객체 및 메서드에 대해서 먼저 알아보겠습니다.
PhotoKit
PhotoKit 공식문서에서는 PhotoKit을 Framework가 아닌 Technology라고 기재해 두었네요.
PhotoKit은 사진 앱에서 관리하는 사진 및 비디오 자산에 대한 직접 액세스도 제공합니다.
PhotoKit을 사용하여 우리의 앱에 이미지 또는 동영상을 표시 및 재생을 위해 Asset을 가져오거나, 캐시까지도 가능합니다.
또한, 위 사진과 같이 이미지 및 동영상을 편집하여 다시 Local과 Cloud 사진첩에 저장할 수도 있습니다.
개인 정보에 무척이나 민감한 우리의 애플 역시 PhotoKit을 통해 우리의 Local 라이브러리에 접근하여고 하면, 사용자의 권한을 부여받아야 합니다. 이때 필요한 객체가 PHPhotoLibrary 입니다.
PHPhotoLibrary
PHPhotoLibrary는 사용자의 사진 라이브러리에 대한 접근 및 변경을 관리하는 객체입니다.
class PHPhotoLibrary : NSObject
위 객체는 사용자 기기와 iCloud에 저장된 전체 Asset 및 컬렉션 세트를 나타냅니다.
다음과 같은 작업에 이 객체를 사용할 수 있습니다.
- 사진 콘텐츠에 액세스할 수 있는 앱의 사용자 권한 검색 또는 확인
- Asset 메타데이터 또는 콘텐츠 편집, 새로운 Asset 삽입 또는 컬렉션 재정렬
- 라이브러리가 변경될 때 변경괸 레코드 확인 및 시스템이 보내는 업데이트 메시지 등록
PHPhotoLibrary 객체의 특징은 싱글톤 패턴을 사용한
class func shared() -> PHPhotoLibrary
위 메서드를 활용하여 인스턴스 객체를 가져오게 됩니다.
PHPhotoLibrary를 이용하여 권한 확인 및 권한을 얻어오는 방법은
class func authorizationStatus(for accessLevel: PHAccessLevel) -> PHAuthorizationStatus
위 메서드를 활용하여 사용자 권한을 얻어올 수 있다. 권한의 타입은 PHAuthorizationStatus이며 권한 종류로는
- notDetermined = 사용자가 권한을 설정하지 않은 상태
- restricted = 사용자가 권한을 부여할 수 없는 상태
- denied = 권한을 거부한 상태
- authorized = 사용가자 권한을 승인한 상태
- limited = 사용자가 일부 제한된 권한을 승인한 상태
이 있다. 만약 권한이 아직 부여되지 않은 notDetermined
라면 권한을 부여해줘야 하는데 이때
class func requestAuthorization(
for accessLevel: PHAccessLevel,
handler: @escaping (PHAuthorizationStatus) -> Void
)
위 메서드를 이용하여 권한 부여를 위한 메시지를 띄우고 사용자의 권한을 부여받을 수 있다.
⚠️
requestAuthorization 메서드의 handler는 글로벌 쓰레드에서 비동기로 실행되는 클로저입니다.
때문에 클로저 내부에 UI 작업이 있다면, Main 쓰레드에서 작업해주셔야 합니다.
여기까지, 기기 라이브러리에서 사진을 가져오기 위해 권한을 부여받는 방법이었습니다. 다음 글에서는 부여받은 권한을 이용하여 라이브러리에 접근해 사진을 App에 가져오는 방법에 대해 얘기해 보겠습니다.
'iOS' 카테고리의 다른 글
[iOS] Clean Architecture 파헤치기 (0) | 2023.01.16 |
---|---|
[iOS] Coordinator Pattern (0) | 2023.01.09 |
[iOS]PhotoKit 알아보기(최종) (1) | 2022.11.22 |
[iOS]PhotoKit 알아보기(2) (0) | 2022.11.20 |
[iOS] TextView Placeholder 구현하기 (0) | 2022.11.01 |