Photo Editing Extension — это механизм iOS, который позволяет сторонним приложениям добавлять инструменты редактирования прямо в системное приложение Фото. В отличие от полноценных редакторов, расширение не загружает снимок в отдельное приложение — пользователь применяет фильтры, корректирует цвета или накладывает эффекты, не выходя из стандартного интерфейса. По данным Apple Developer Documentation (2025), PhotoKit предоставляет более 40 API для работы с ресурсами фотографий, включая PHAdjustmentData и PHContentEditingController.
Главное
Photo Editing Extension — это тип app extension в iOS, который внедряет инструменты обработки изображений в стандартный интерфейс приложения Фото. Пользователь открывает снимок, нажимает кнопку «Править» и выбирает нужное расширение из списка установленных. После редактирования результат сохраняется обратно в библиотеку, а исходный файл остаётся доступным для отката.
Такая архитектура решает ключевую проблему пользовательского опыта: не нужно переключаться между приложениями, экспортировать и импортировать изображения, следить за версиями. По данным WWDC 2025, все расширения работают в изолированном процессе с собственной песочницей и ограниченным временем выполнения — до 30 секунд на операцию редактирования.
Расширение не имеет доступа к произвольным файлам в памяти устройства — только к тому снимку, который пользователь явно передал через интерфейс выбора. Это обеспечивает безопасность пользовательских данных при использовании сторонних инструментов.
PhotoKit — это фреймворк Apple для работы с медиатекой устройства, появившийся в iOS 8. Он предоставляет программный доступ к ресурсам Фото, включая снимки, видео, альбомы и метаданные. Для расширений редактирования PhotoKit служит промежуточным слоем между хранилищем и интерфейсом модификации.
PHAsset представляет отдельный медиаобъект в библиотеке — фотографию или видео. Через PHAsset можно получить метаданные: дату съёмки, тип файла, расположение на карте и ориентацию камеры. PHAssetResource даёт доступ к базовым ресурсам — например, к оригинальному файлу снимка в формате RAW или HEIC.
Для расширения редактирования критически важен PHContentEditingInput — объект, который содержит полный файл изображения (или видео), доступный для чтения и обработки. Расширение получает этот объект в момент активации и использует его как исходный материал.
PHImageManager управляет загрузкой и кэшированием изображений. Для расширения редактирования он не используется напрямую — расширение получает полный файл через PHContentEditingInput. Однако PHImageRequestOptions позволяет настроить параметры запроса: размер, тип доставки (синхронный или асинхронный) и формат результата.
По данным Apple, PHImageManager автоматически кэширует миниатюры изображений в оперативной памяти, что ускоряет повторное отображение превью. Для расширения редактирования рекомендуется использовать PHImageRequestOptionsDeliveryModeHighQualityFormat, чтобы получить наилучшее качество снимка.
let options = PHImageRequestOptions()
options.deliveryMode = .highQualityFormat
options.isSynchronous = true
PHImageManager.default().requestImage(
for: asset,
targetSize: .init(width: 1024, height: 1024),
contentMode: .aspectFill,
options: options
) { image, _ in
// use image for display
}
Каждое Photo Editing Extension реализует протокол PHContentEditingController — центральный элемент управления расширением. Протокол определяет методы для отображения интерфейса, получения входных данных и сохранения результата.
beginContentEditing(with:) вызывается при старте сессии редактирования. Расширение получает PHContentEditingInput и должно отобразить интерфейс с исходным изображением. finishContentEditing(completionHandler:) завершает редактирование — расширение возвращает PHContentEditingOutput с модифицированным файлом и AdjustmentData. cancelContentEditing() отменяет изменения без сохранения.
Важный нюанс: на момент вызова beginContentEditing расширение получает доступ только к одной версии снимка — той, которая была запрошена пользователем. Нельзя обратиться к другому снимку или альбому. Это ограничение песочницы, введённое Apple для безопасности.
class PhotoEditingViewController: UIViewController {
override func beginContentEditing(
with input: PHContentEditingInput
) {
guard let url = input.fullSizeImageURL else { return }
let image = CIImage(contentsOf: url)
displayImage.image = UIImage(ciImage: image)
}
}
PHContentEditingController отделяет интерфейс редактирования от логики сохранения. Основной процесс iOS вызывает beginContentEditing, расширение показывает свой UI, пользователь вносит изменения, затем finishContentEditing генерирует новый файл. Apple рекомендует всю ресурсоёмкую обработку — фильтры CIFilter, манипуляции с Core Image — выполнять в фоновом потоке, а не в главном, чтобы не блокировать интерфейс.
PHAdjustmentData — ключевой механизм, обеспечивающий неразрушающее редактирование в Photo Editing Extension. Это объект, который содержит информацию о применённых изменениях в произвольном формате. Расширение сериализует параметры фильтров, маски и настройки в AdjustmentData и сохраняет вместе с модифицированным изображением.
При повторном открытии снимка расширение читает AdjustmentData, восстанавливает предыдущее состояние интерфейса и позволяет пользователю продолжить редактирование с того же места. Если расширение не установлено — снимок отображается в последней сохранённой версии, а оригинал хранится отдельно.
По данным Apple Documentation, PHAdjustmentData хранит formatIdentifier и formatVersion — строки для идентификации формата данных. При обновлении расширения следует проверять версию и корректно обрабатывать старые форматы.
let adjustmentData = PHAdjustmentData(
formatIdentifier: "com.example.photoediting",
formatVersion: "1.0",
data: NSKeyedArchiver.archivedData(
withRootObject: params,
requiringSecureCoding: true
)
)
output.adjustmentData = adjustmentData
В момент finishContentEditing расширение записывает AdjustmentData в объект PHContentEditingOutput вместе с модифицированным файлом изображения. Система затем сохраняет оба компонента: версию для отображения и метаданные для восстановления сессии редактирования.
Photo Editing Extension автоматически появляется в меню приложения Фото после установки содержащего его приложения. Пользователь открывает снимок, выбирает «Править», и в нижнем ряду инструментов отображаются все установленные расширения редактирования — как системные, так и сторонние.
Расширение регистрируется через Info.plist основного приложения с ключом NSExtensionActivationRule, который указывает, какие типы контента активируют расширение. Для фоторедактора ActivationRule обычно требует image — расширение не будет отображаться для видео или живых фотографий.
Apple рекомендует указывать конкретные типы активации, чтобы не перегружать меню редактирования. Если расширение поддерживает только JPEG и HEIC, стоит ограничить активацию этими форматами.
<!-- Info.plist -->
<key>NSExtension</key>
<dict>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.photo-editing</string>
<key>NSExtensionActivationRule</key>
<string>SUBQUERY (extensionItems,
@count <= 1)</string>
</dict>
После выбора расширения iOS создаёт отдельный процесс с кастомным UIViewController, который отображается поверх интерфейса Фото. Пользователь видит свой снимок, инструменты расширения и кнопки «Отменить» / «Готово». Расширение не может изменить навигацию за пределами своего контроллера или получить доступ к другим частям системы.
По данным Human Interface Guidelines от Apple, интерфейс расширения должен быть минимальным и функциональным — без рекламы, посторонних ссылок и лишних элементов навигации. Рекомендуется использовать UIScrollView для отображения палитры инструментов, чтобы не загромождать экран.
Часто задаваемые вопросы
Расширение получает PHContentEditingInput с URL полного файла изображения через метод beginContentEditing(with:). Доступ предоставляется только к одному выбранному снимку — без прав на другие ресурсы библиотеки.
Нет, оригинал никогда не изменяется. Расширение создаёт новую версию через PHContentEditingOutput, а AdjustmentData хранит параметры изменений для возможности отката к исходному состоянию.
Расширение работает со всеми форматами, которые поддерживает PhotoKit: JPEG, HEIC, RAW, PNG, TIFF и Live Photos. Ограничения задаются через NSExtensionActivationRule в Info.plist расширения.
iOS выделяет до 30 секунд на выполнение операции finishContentEditing. При превышении лимита расширение принудительно завершается, а изменения не сохраняются. Фоновая обработка с CIFilter не продлевает это время.
Да, Core Image (CIFilter) и Metal (для кастомных шейдеров) полностью поддерживаются. Apple рекомендует выносить тяжёлые вычисления в фоновые потоки через Grand Central Dispatch.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также