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 аутоматски кешира минијатуре слика у 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 за приказ палете алата како би се избегло загушeње екрана.
Често постављана питања
Проширење добија 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. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође