PHAsset Create с данными настройки за один раз

TL, DR:

Я хочу создать новый объект в библиотеке фотографий и применить к нему данные корректировки (редактирования) без запроса пользователя дважды.

Фон

Я разрабатываю расширение для редактирования фотографий для iOS и предоставляю аналогичную функциональность в приложении-контейнере.

Для лучшего повторного использования кода и модульности я использую поток на основе PHContentEditingController как для расширения (обязательно), так и для приложения-контейнера, объединяя все общие компоненты во встроенную структуру, на которую ссылаются и приложение, и расширение (как рекомендовано Apple).


В отличие от расширения приложения, которое «передает» изображение для редактирования приложением «Фотографии» и выполняется под его контролем, приложение-контейнер должно запрашивать изменения в библиотеке активов, каждое из которых приводит к запросу пользователя на авторизацию.

При запуске приложение предлагает пользователю два варианта получения изображения для редактирования:

  • Открытие существующей фотографии из библиотеки или
  • Делаем новую фотографию с помощью камеры.

(оба варианта основаны на UIImagePickerController, конечно)

Прямо сейчас изображения, считанные из библиотеки, подвергаются тому же процессу редактирования, что и в расширении приложения, с той лишь разницей, что мой собственный код пользовательского интерфейса вручную вызывает finishContentEditing(completionHandler:) для (общего) объекта, который принимает протокол PHContentEditingController, и, по завершении , он далее вызывает метод PHAssetLibrary performChanges(_:completionHandler) (который запускает запрос авторизации).

Это означает, что изменения, сделанные в приложении-контейнере, могут быть отменены при повторном редактировании того же изображения с расширением в приложении "Фотографии" (и, возможно, наоборот, как только я получу поддержку данные корректировки).

Однако для новых изображений, сделанных камерой, я использую другой подход. После применения фильтров я просто сохраняю результат в библиотеку фотографий с помощью устаревшей функции:

UIImageWriteToSavedPhotosAlbum(_:_:_:_:)

(из тех времен, когда метки аргументов еще не существовали :-)


Эта проблема

Проблема с этим подходом заключается в том, что правки всегда «запекаются» для изображений, снятых камерой и отредактированных в приложении (обратить нельзя). Это кажется произвольным и, возможно, даже сбивает пользователя с толку, поэтому я ищу более унифицированный подход.

Я мог бы сохранить фотографию в библиотеке сразу после того, как ее сделал пользователь, и оттуда использовать тот же поток, что и с существующими активами, но это означает, что мне нужно модифицировать библиотеку дважды:

  1. Создать новый актив
  2. Сохранить изменения в новом ресурсе

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

Итак, мой вопрос:

Есть ли способ создать объект библиотеки «за один раз», исходное изображение и данные настройки?


person Nicolas Miari    schedule 04.10.2018    source источник


Ответы (1)


Хотя я еще не пробовал это в своем коде (сейчас у меня есть более срочные проблемы), я, кажется, нашел то, что кажется точным ответом на мой вопрос в документации Apple для одного из инициализаторов класс PHContentEditingOutput:

init(placeholderForCreatedAsset: PHObjectPlaceholder)

Из документов:

Обсуждение

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

Также:

Примечание

Если ваше приложение редактирует содержимое ресурсов, уже находящихся в библиотеке «Фотографии», включая ресурсы, недавно добавленные вашим приложением, «Фото» запрашивает у пользователя разрешение на изменение содержимого ресурса. Если вместо этого ваше приложение использует метод init(placeholderForCreatedAsset:) для создания актива с отредактированным контентом, Фото распознает право собственности вашего приложения на контент и, следовательно, не нужно запрашивать у пользователя разрешение на его редактирование.


Думаю, нам всем время от времени нужна здоровая доза RTFM! :-)

person Nicolas Miari    schedule 23.10.2018
comment
Однако, если честно, этот API — худшее, что я видел в Apple. - person ChrisH; 05.01.2021