Photo Editing Extension: что это, возможности расширения для iOS

Автор: IT Sectr Опубликовано: 2026-06-15 Время чтения: 9 мин

Photo Editing Extension — это механизм iOS, который позволяет сторонним приложениям добавлять инструменты редактирования прямо в системное приложение Фото. В отличие от полноценных редакторов, расширение не загружает снимок в отдельное приложение — пользователь применяет фильтры, корректирует цвета или накладывает эффекты, не выходя из стандартного интерфейса. По данным Apple Developer Documentation (2025), PhotoKit предоставляет более 40 API для работы с ресурсами фотографий, включая PHAdjustmentData и PHContentEditingController.

Главное

  • Photo Editing Extension встраивает инструменты редактирования в стандартное приложение Фото на iOS без переключения между программами
  • Архитектура строится на протоколе PHContentEditingController, который управляет отображением интерфейса и получением исходного изображения
  • Расширение использует неразрушающее редактирование — все изменения сохраняются как AdjustmentData, а оригинал остаётся нетронутым
  • Для работы с изображением расширение получает PHContentEditingInput с полным файлом снимка и метаданными
  • PhotoKit предоставляет доступ к ресурсам фотографий через PHAsset, PHAssetResource и PHImageManager

Что такое Photo Editing Extension в iOS

Photo Editing Extension — это тип app extension в iOS, который внедряет инструменты обработки изображений в стандартный интерфейс приложения Фото. Пользователь открывает снимок, нажимает кнопку «Править» и выбирает нужное расширение из списка установленных. После редактирования результат сохраняется обратно в библиотеку, а исходный файл остаётся доступным для отката.

Такая архитектура решает ключевую проблему пользовательского опыта: не нужно переключаться между приложениями, экспортировать и импортировать изображения, следить за версиями. По данным WWDC 2025, все расширения работают в изолированном процессе с собственной песочницей и ограниченным временем выполнения — до 30 секунд на операцию редактирования.

Расширение не имеет доступа к произвольным файлам в памяти устройства — только к тому снимку, который пользователь явно передал через интерфейс выбора. Это обеспечивает безопасность пользовательских данных при использовании сторонних инструментов.

PhotoKit: архитектура и ключевые компоненты

PhotoKit — это фреймворк Apple для работы с медиатекой устройства, появившийся в iOS 8. Он предоставляет программный доступ к ресурсам Фото, включая снимки, видео, альбомы и метаданные. Для расширений редактирования PhotoKit служит промежуточным слоем между хранилищем и интерфейсом модификации.

PHAsset и PHAssetResource

PHAsset представляет отдельный медиаобъект в библиотеке — фотографию или видео. Через PHAsset можно получить метаданные: дату съёмки, тип файла, расположение на карте и ориентацию камеры. PHAssetResource даёт доступ к базовым ресурсам — например, к оригинальному файлу снимка в формате RAW или HEIC.

Для расширения редактирования критически важен PHContentEditingInput — объект, который содержит полный файл изображения (или видео), доступный для чтения и обработки. Расширение получает этот объект в момент активации и использует его как исходный материал.

PHImageManager и кэширование

PHImageManager управляет загрузкой и кэшированием изображений. Для расширения редактирования он не используется напрямую — расширение получает полный файл через PHContentEditingInput. Однако PHImageRequestOptions позволяет настроить параметры запроса: размер, тип доставки (синхронный или асинхронный) и формат результата.

По данным Apple, PHImageManager автоматически кэширует миниатюры изображений в оперативной памяти, что ускоряет повторное отображение превью. Для расширения редактирования рекомендуется использовать PHImageRequestOptionsDeliveryModeHighQualityFormat, чтобы получить наилучшее качество снимка.

swift
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
}

Создание расширения: PHContentEditingController

Каждое Photo Editing Extension реализует протокол PHContentEditingController — центральный элемент управления расширением. Протокол определяет методы для отображения интерфейса, получения входных данных и сохранения результата.

Основные методы протокола

beginContentEditing(with:) вызывается при старте сессии редактирования. Расширение получает PHContentEditingInput и должно отобразить интерфейс с исходным изображением. finishContentEditing(completionHandler:) завершает редактирование — расширение возвращает PHContentEditingOutput с модифицированным файлом и AdjustmentData. cancelContentEditing() отменяет изменения без сохранения.

Важный нюанс: на момент вызова beginContentEditing расширение получает доступ только к одной версии снимка — той, которая была запрошена пользователем. Нельзя обратиться к другому снимку или альбому. Это ограничение песочницы, введённое Apple для безопасности.

swift
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 — выполнять в фоновом потоке, а не в главном, чтобы не блокировать интерфейс.

Неразрушающее редактирование через AdjustmentData

PHAdjustmentData — ключевой механизм, обеспечивающий неразрушающее редактирование в Photo Editing Extension. Это объект, который содержит информацию о применённых изменениях в произвольном формате. Расширение сериализует параметры фильтров, маски и настройки в AdjustmentData и сохраняет вместе с модифицированным изображением.

При повторном открытии снимка расширение читает AdjustmentData, восстанавливает предыдущее состояние интерфейса и позволяет пользователю продолжить редактирование с того же места. Если расширение не установлено — снимок отображается в последней сохранённой версии, а оригинал хранится отдельно.

По данным Apple Documentation, PHAdjustmentData хранит formatIdentifier и formatVersion — строки для идентификации формата данных. При обновлении расширения следует проверять версию и корректно обрабатывать старые форматы.

swift
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, стоит ограничить активацию этими форматами.

xml
<!-- 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 для отображения палитры инструментов, чтобы не загромождать экран.

Часто задаваемые вопросы

Как Photo Editing Extension получает доступ к снимку?

Расширение получает PHContentEditingInput с URL полного файла изображения через метод beginContentEditing(with:). Доступ предоставляется только к одному выбранному снимку — без прав на другие ресурсы библиотеки.

Может ли расширение изменять оригинал снимка?

Нет, оригинал никогда не изменяется. Расширение создаёт новую версию через PHContentEditingOutput, а AdjustmentData хранит параметры изменений для возможности отката к исходному состоянию.

Какие типы файлов поддерживает Photo Editing Extension?

Расширение работает со всеми форматами, которые поддерживает PhotoKit: JPEG, HEIC, RAW, PNG, TIFF и Live Photos. Ограничения задаются через NSExtensionActivationRule в Info.plist расширения.

Сколько времени даётся на редактирование?

iOS выделяет до 30 секунд на выполнение операции finishContentEditing. При превышении лимита расширение принудительно завершается, а изменения не сохраняются. Фоновая обработка с CIFilter не продлевает это время.

Можно ли использовать Core Image и Metal в расширении?

Да, Core Image (CIFilter) и Metal (для кастомных шейдеров) полностью поддерживаются. Apple рекомендует выносить тяжёлые вычисления в фоновые потоки через Grand Central Dispatch.

Итоги

  • Photo Editing Extension — это встраиваемый инструмент редактирования в приложении Фото, работающий без переключения между приложениями
  • Архитектура использует PHContentEditingController для управления сессией редактирования и получения входных данных
  • PhotoKit предоставляет PHAsset, PHImageManager и PHContentEditingInput для доступа к медиаресурсам устройства
  • PHAdjustmentData обеспечивает неразрушающее редактирование — сериализация параметров изменений с возможностью отката
  • Расширение работает в песочнице с ограничением в 30 секунд и доступом только к одному снимку за сессию
  • Поддерживаются Core Image, Metal и все форматы PhotoKit: JPEG, HEIC, RAW, PNG, TIFF и Live Photos

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также