WWDC22) Discover PhotoKit change history
Discover PhotoKit change history - WWDC22 - Videos - Apple Developer
본 글은 WWDC 를 보고, 번역 및 요약 그리고 실행해보는 스터디 프로젝트의 일환입니다.

- 앱에서 Phots 변경 기록에 접근하는 방법에 대해 알아보겠습니다.

PhotoKit 은 사진 라이브러리에 저장된 사진, 영상 및 앨범에 접근하고 업데이트하기 위해 풍부한 API 를 제공합니다. PhotoKit 은 깊은 수준으로 Photos 접근과 통합이 필요한 앱을 위해 설계되었습니다.

사진 관리 또는 편집, 사용자 지정 카메라 앱이나 사진 라이브러리를 독특하게 탐색할 수 있는 방법을 제공하는 앱들이 있을 것입니다.
이런 유형의 앱들은 사진 라이브러리가 시간이 지남에 따라 어떻게 변경되는지 모니터링해서 Photos 의 경험을 자세히 반영할 수 있습니다.
예를 들어, 소셜 하이킹 앱을 만들었다고 해보겠습니다. 친구와 하이킹 다녀온 사진을 공유하고, 편집하는 앱입니다.

이 앱은 산에서의 경험을 콜라주(위와 같이 화면을 구성하는 기법)를 만들기 위해 최근 하이킹 운동의 시작과 끝 타임스탬프에서 사진을 모읍니다. 이는 사진 라이브러리에서 선택한 사진과 동기화된 상태로 유지됩니다. 예를 들어, 친구에게서 하이킹 사진을 받는다면 앱은 이 업데이트를 사용하여 새로운 콜라주를 생성할 것입니다.

지금까지 앱이 새로 삽입된 에셋과 이전 하이킹 콜라주의 변경사항을 발견하려면 열련의 fetch 를 수행해야 했습니다.
앱은 마지막 앱 실행 날짜보다 늦게 생성된 에셋을 가져올 수 있습니다. 에셋 업데이트와 삭제를 결정하는 건 더 어려웠습니다.

- 업데이트 : 앱은 모든 콜라주에 있는 에셋을 refatch 하고, 에셋 업데이트를 위해 수정 날짜를 확인해야 하는데 Photos 내부의 처리 활동 때문에 에셋 수정 날짜가 바뀔 수 있기 때문에 잘못 탐지할 수 있습니다.

- 삭제 : 추적된 모든 에셋을 가져와야하고, 반환되지 않은 에셋과 비교해 무엇이 삭제되었는지 알아야하기 때문에 더 어렵습니다.
전체적으로 앱을 실행할 때마다 세 가지 검사를 별도로 해야하는데 만약 앱이 많은 양의 에셋을 표시하는 경우 특히나 비용이 많이 듭니다.

불확실한 결과를 일일이 가져오고 확인을 하는 대신 API 호출로 무엇이 변했는지 정확하게 아는 방법이 있다면 어떨까요?
새로운 변경 내역 API 를 통해 쉽게 사진 라이브러리의 오프라인 업데이트를 추적할 수 있습니다.

1️⃣ New change history API
변경 내역은 사진 라이브러리에 대한 삽입, 업데이트, 삭제 처럼 변경 타임라인으로 구성됩니다.

위의 타임라인 예시를 보면 3일간의 변경 내역에 에셋, 앨범, 폴더가 변경되었습니다. 어떻게 변경 사항이 발생한 것을 알 수 있을까요?
👾 : persistent change token 을 사용하면 됩니다!

- 특정 시점의 사진 라이브러리의 상태를 나타내느 토큰입니다.
- 토큰은 앱을 실행해도 유지됩니다.
- third-party app 변경사항을 포함하여 해당 토큰 이후 발생한 변경사항을 가져오는데 사용할 수 있습니다.
- 앱이 제한된 라이브러리 모드일 땐 user-selected PhotoKit 객체들에 대한 변경 사항만 반환됩니다.
- 토큰은 장치에 로컬이며 언제나 사진 라이브러리 인스턴스에서 접근할 수있습니다.

새로운 API 는 PhotoKit 을 지원하는 모든 플랫폼에서 사용 가능합니다.

앱이 실행되고 사진 라이브러리와 함께 작동하면 여러분은 persistent change token 을 앱 내에 저장할 수 있습니다.
👉 Photos 객체에 대한 변경 세부 정보를 세 가지 유형으로 가져올 수 있습니다.

👉 코드로 살펴보겠습니다.
- 마지막으로 저장된 token 를 사용해 persistent changes 를 fetch 합니다.

- persistent changes 를 열거하고 변경 세부사항에 대해서 가져옵니다.

- 이런 변경 정보는 updated, deleted, inserted local identifiers 를 제공합니다.

- 변경사항을 처리하고, 마지막 변경 토큰을 저장해서 나중에 사용할 수 있습니다.
👉 새로운 persistent history API 와 기존의 change observer API 를 비교해 보겠습니다.

- PHChanges 는 메모리 내 fetch 결과를 처리해서 앱이 실행되는 동안 사진 라이브러리에 실시간 변경 사항을 기록하는데 사용됩니다.
- 반면에, persistent history 는 장기적으로 실행 중인 변경사항을 사진 라이브러리에 기록하고, 앱이 활성화가 끝난 이후의 변경사항을 보고하는데 사용할 수 있습니다.
여러분들은 요구사항에 따라 위의 API 를 사용할 수 있습니다. 하이킹 앱으로 돌아가 봅시다.

이제 하이킹 콜라주를 만들고 업데이트 하기 위해 persistent change API 를 사용해서 에셋을 추적하려고 합니다.
- 먼저, 마지막으로 저장된 토큰을 사용해 persistent change 를 fetch 합니다. (1-2)
- 다음으로 persistent changes 를 반복해 관련 에셋 변경 정보를 파악한 후 updated, deleted, inserted local identifiers를 처리합니다. (3)
이제 변경 정보에서 앱에 영향을 미치는 라이브러리 변경 사항을 식별해야 합니다. 이미 우리는 updated, deleted, inserted local identifiers 를 식별했습니다.
👉 어떻게 이걸 반영해 업데이트 할까요?
- insert

insertedIdentifiers 를 사용해서 삽입된 에셋을 가져오고 어떤 에셋이 삽입되었는지 알 수 있습니다.

하이킹 시작과 종료와 생성 날짜를 비교하며 하이킹 타임스탬프 사이의 변화를 확인할 수 있습니다.
- update

업데이트 된 에셋들에 수정이 있을 수 있으니 hasAdjustments
API 를 사용해 UI 에 에셋을 다시 그려야하는지 확인할 수 있습니다.
- delete

deleteIdentifier 를 사용해 재생성이 필요한 콜라주를 결정할 수 있습니다.
👾 : 이제 변경 사항은 모두 처리했고, 앱은 최신 상태입니다.
새로운 API 를 사용할 때 주의해야 할 사항이 몇 가지 있습니다.
✅ Considerations

- 무엇이 중요한 변경사항인지 결정하고 그러한 변경사항만 체크하는 것입니다.
업데이트, 삽입된 에셋에 대해 성능 향상을 보이기 위해서는 여러 개의 작은 요청 대신 하나의 큰 fetch 가 좋습니다.
- Photo 라이브러리는 보이지 않는 곳에서 처리 및 동기화로 많이 변경될 수 있기 때문에 앱을 자주 실행하지 않는 경우는 많은 변경 사항을 열거하게 될 수 있습니다.
- 이때문에 우리는 UI 가 차단되지 않도록 background 스레드에서 변경 내역 요청을 권장합니다.
✅ Handling errors
persistent changes 를 fetch 할 때 오류 두 가지가 있습니다.

- change token 이 가능한 변경 내역보다 오래된 경우는 만료된 change token erorr 가 반환됩니다.
- 어떤 경우에는 persistent change 가 발생한 변경 사항을 완전히 재구성했는지 확신할 수 없고, 변경 세부 정보를 쓸 수 없다는 에러를 반환할 수 있습니다.

위의 경우 앱이 최신 상태인지 확인하기 위해 사진 라이브러리에서 추적된 객체를 refetch 하는 것을 권합니다.
2️⃣ Additional PhotoKit APIs
새로운 PhotoKit API 가 몇 가지 더 있습니다.


PhotoKit 은 미디어 하위 유형 및 스마트 앨범에서 cinematic 비디오에 접근을 지원합니다.
👉 여기에 새로운 오류 코드도 두 개 있습니다.

- 사진 라이브러리 번들이 macOS 의 File Provider sync root directory 에 있는 경우 라이브러리가 손상될 수 있고, 변경 작업을 수행할 때 오류가 반환됩니다.
- 네트워크 문제로 에셋 리소스를 찾을 수 없는 경우에는 요청에 네트워크 오류가 반환됩니다.
👾 : Photos picker 관한 올해 세션도 있습니다!

