TL, DR:
Я хочу создать новый объект в библиотеке фотографий и применить к нему данные корректировки (редактирования) без запроса пользователя дважды.
Фон
Я разрабатываю расширение для редактирования фотографий для iOS и предоставляю аналогичную функциональность в приложении-контейнере.
Для лучшего повторного использования кода и модульности я использую поток на основе PHContentEditingController
как для расширения (обязательно), так и для приложения-контейнера, объединяя все общие компоненты во встроенную структуру, на которую ссылаются и приложение, и расширение (как рекомендовано Apple).
В отличие от расширения приложения, которое «передает» изображение для редактирования приложением «Фотографии» и выполняется под его контролем, приложение-контейнер должно запрашивать изменения в библиотеке активов, каждое из которых приводит к запросу пользователя на авторизацию.
При запуске приложение предлагает пользователю два варианта получения изображения для редактирования:
- Открытие существующей фотографии из библиотеки или
- Делаем новую фотографию с помощью камеры.
(оба варианта основаны на UIImagePickerController
, конечно)
Прямо сейчас изображения, считанные из библиотеки, подвергаются тому же процессу редактирования, что и в расширении приложения, с той лишь разницей, что мой собственный код пользовательского интерфейса вручную вызывает finishContentEditing(completionHandler:)
для (общего) объекта, который принимает протокол PHContentEditingController
, и, по завершении , он далее вызывает метод PHAssetLibrary
performChanges(_:completionHandler)
(который запускает запрос авторизации).
Это означает, что изменения, сделанные в приложении-контейнере, могут быть отменены при повторном редактировании того же изображения с расширением в приложении "Фотографии" (и, возможно, наоборот, как только я получу поддержку данные корректировки).
Однако для новых изображений, сделанных камерой, я использую другой подход. После применения фильтров я просто сохраняю результат в библиотеку фотографий с помощью устаревшей функции:
UIImageWriteToSavedPhotosAlbum(_:_:_:_:)
(из тех времен, когда метки аргументов еще не существовали :-)
Эта проблема
Проблема с этим подходом заключается в том, что правки всегда «запекаются» для изображений, снятых камерой и отредактированных в приложении (обратить нельзя). Это кажется произвольным и, возможно, даже сбивает пользователя с толку, поэтому я ищу более унифицированный подход.
Я мог бы сохранить фотографию в библиотеке сразу после того, как ее сделал пользователь, и оттуда использовать тот же поток, что и с существующими активами, но это означает, что мне нужно модифицировать библиотеку дважды:
- Создать новый актив
- Сохранить изменения в новом ресурсе
... что приведет к тому, что у пользователя будет дважды запрашиваться разрешение: один раз перед редактированием изображения и еще раз при фиксации правок.
Итак, мой вопрос:
Есть ли способ создать объект библиотеки «за один раз», исходное изображение и данные настройки?