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 автоматично кешира миниатюри на изображения в RAM паметта, което ускорява повторното показване на прегледи. За разширението за редактиране се препоръчва използването на 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
// използвайте изображение за показване
}
Всяко 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 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също