Photo Editing Extension — це механізм iOS, який дозволяє стороннім додаткам додавати інструменти редагування прямо в системний додаток Фото. На відміну від повноцінних редакторів, розширення не завантажує знімок в окремий додаток — користувач застосовує фільтри, коригує кольори або накладає ефекти, не виходячи зі стандартного інтерфейсу. За даними Apple Developer Documentation (2025), PhotoKit надає понад 40 API для роботи з ресурсами фотографій, включаючи PHAdjustmentData та PHContentEditingController.
Головне
Photo Editing 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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також