PHAsset (или ALAsset) идентификатор между устройствами

Я на самом деле создаю приложение для iOS и хочу сохранить некоторые подробности о фотографиях в библиотеке фотографий в базе данных SQLite. Я также хотел бы иметь возможность обмениваться этими данными между различными устройствами, которые есть у пользователя (представьте, что кто-то хочет реорганизовать изображения на своем iPhone и хочет получить тот же порядок на своем iPad).

Я искал по документации Apple, но не нашел PHAsset идентификатор, который является общим для всех устройств. Я также пытался проверить, если PHImageFileURLKey, hashValue, или же localIdentifier из PHAsset где поделился, но ни один из них не.

Кто-то уже сделал что-то подобное?

3 ответа

Решение

Там нет ни одного в данный момент. У PHAsset был общий идентификатор в первых бета-версиях iOS 8, но позже он был удален.

Начиная с iOS 15 существует идентификатор, доступный на всех устройствах: https://developer.apple.com/documentation/photokit/phcloudidentifier .

API довольно простой. Идея состоит в том, что вы сохраняете и синхронизируете облачные идентификаторы, а затем используете их для извлечения локальных идентификаторов, которые затем можно использовать с существующими API, как вы привыкли. Вы можете запрашивать облачные идентификаторы пакетами, например так:

      let localIdentifiers = <your-list-of-local-identifiers>
let mappings: [String: Result<PHCloudIdentifier, Error>] = 
  PHPhotoLibrary.shared().cloudIdentifierMappings(forLocalIdentifiers: localIdentifiers)

Вы можете хранить такие идентификаторы с помощью stringValueимущество.

И наоборот (скажем, у вас есть список cloudIdentifiersсо строковыми значениями идентификаторов):

      let localIdentifiers: [PHCloudIdentifier: Result<String, Error>]
   = PHPhotoLibrary
        .shared()
        .localIdentifierMappings(
          for: cloudIdentifiers.map(PHCloudIdentifier.init(stringValue:)))

Какие ошибки могут произойти?

  • Идентификатор не найден: либо вы передали неверный идентификатор, либо ресурс был удален.
  • Обнаружено несколько локальных идентификаторов для идентификатора облака (согласно WWDC, это происходит, если «состояние облака не синхронизировано или библиотека полагается на содержимое изображения, чтобы найти совпадение»). Подробнее об обработке ошибок здесь

Дополнительные идеи, которые я получил в результате экспериментов:

  • Кажется, вы можете получить облачные идентификаторы без Интернета, с отключенным iCloud для вашего приложения, даже без входа в учетную запись iCloud.
  • Несмотря на то, что в документе указано, что это дорогостоящая операция, накладные расходы на загрузку нескольких сотен идентификаторов сразу для меня не заметны.

Похоже, что для всех PHAssets, которые были синхронизированы с iTunes, localIdentifier идентичен, даже для всех устройств. Означает: если вы импортируете изображения с одного устройства и синхронизируете их с другим устройством, localIdentifier PHAsset идентичен.

Другие вопросы по тегам