Photo Editing Extension — este un mecanism iOS care permite aplicațiilor terțe să adauge instrumente de editare direct în aplicația Foto de sistem. Spre deosebire de editorii completi, extensia nu încarcă imaginea într-o aplicație separată — utilizatorul aplică filtre, corectează culorile sau adaugă efecte fără a părăsi interfața standard. Conform Apple Developer Documentation (2025), PhotoKit oferă peste 40 de API-uri pentru lucrul cu resursele foto, inclusiv PHAdjustmentData și PHContentEditingController.
Principalele puncte
Photo Editing Extension — este un tip de app extension în iOS care introduce instrumente de procesare a imaginilor în interfața standard a aplicației Foto. Utilizatorul deschide o fotografie, apasă butonul „Editează” și selectează extensia dorită din lista celor instalate. După editare, rezultatul este salvat înapoi în bibliotecă, iar fișierul original rămâne disponibil pentru restaurare.
O astfel de arhitectură rezolvă problema cheie a experienței utilizatorului: nu este nevoie să comutați între aplicații, să exportați și importați imagini sau să urmăriți versiunile. Conform WWDC 2025, toate extensiile funcționează într-un proces izolat cu propriul sandbox și timp de execuție limitat — până la 30 de secunde per operație de editare.
Extensia nu are acces la fișiere arbitrare din memoria dispozitivului — doar la fotografia pe care utilizatorul a transmis-o explicit prin interfața de selecție. Aceasta asigură securitatea datelor utilizatorului atunci când folosește instrumente terțe.
PhotoKit — este framework-ul Apple pentru lucrul cu mediateca dispozitivului, apărut în iOS 8. Acesta oferă acces programatic la resursele Foto, inclusiv fotografii, videoclipuri, albume și metadate. Pentru extensiile de editare, PhotoKit servește ca strat intermediar între stocare și interfața de modificare.
PHAsset reprezintă un obiect media individual în bibliotecă — o fotografie sau un videoclip. Prin PHAsset se pot obține metadate: data capturii, tipul fișierului, locația pe hartă și orientarea camerei. PHAssetResource oferă acces la resursele de bază — de exemplu, la fișierul original al fotografiei în format RAW sau HEIC.
Pentru extensia de editare, PHContentEditingInput este critic — un obiect care conține fișierul complet al imaginii (sau videoclipului) disponibil pentru citire și procesare. Extensia primește acest obiect în momentul activării și îl folosește ca material sursă.
PHImageManager gestionează încărcarea și stocarea în cache a imaginilor. Pentru extensia de editare nu este utilizat direct — extensia primește fișierul complet prin PHContentEditingInput. Totuși, PHImageRequestOptions permite configurarea parametrilor cererii: dimensiune, tipul de livrare (sincron sau asincron) și formatul rezultatului.
Conform Apple, PHImageManager stochează automat miniaturile imaginilor în memoria RAM, ceea ce accelerează reafișarea previzualizărilor. Pentru extensia de editare se recomandă utilizarea PHImageRequestOptionsDeliveryModeHighQualityFormat pentru a obține cea mai bună calitate a imaginii.
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
// folosește imaginea pentru afișare
}
Fiecare Photo Editing Extension implementează protocolul PHContentEditingController — elementul central de control al extensiei. Protocolul definește metode pentru afișarea interfeței, obținerea datelor de intrare și salvarea rezultatului.
beginContentEditing(with:) este apelat la începutul sesiunii de editare. Extensia primește PHContentEditingInput și trebuie să afișeze interfața cu imaginea originală. finishContentEditing(completionHandler:) finalizează editarea — extensia returnează PHContentEditingOutput cu fișierul modificat și AdjustmentData. cancelContentEditing() anulează modificările fără a salva.
Un aspect important: la momentul apelării beginContentEditing, extensia are acces doar la o singură versiune a fotografiei — cea solicitată de utilizator. Nu se poate accesa o altă fotografie sau album. Aceasta este o restricție a sandbox-ului introdusă de Apple pentru securitate.
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 separă interfața de editare de logica de salvare. Procesul principal iOS apelează beginContentEditing, extensia își arată UI-ul, utilizatorul face modificări, apoi finishContentEditing generează un fișier nou. Apple recomandă ca toată procesarea consumatoare de resurse — filtre CIFilter, manipulări Core Image — să fie executată în fundal, nu în thread-ul principal, pentru a nu bloca interfața.
PHAdjustmentData — mecanismul cheie care asigură editarea nedistructivă în Photo Editing Extension. Este un obiect care conține informații despre modificările aplicate într-un format arbitrar. Extensia serializează parametrii filtrelor, măștile și setările în AdjustmentData și le salvează împreună cu imaginea modificată.
La redeschiderea fotografiei, extensia citește AdjustmentData, restaurează starea anterioară a interfeței și permite utilizatorului să continue editarea de acolo. Dacă extensia nu este instalată — fotografia se afișează în ultima versiune salvată, iar originalul este stocat separat.
Conform Apple Documentation, PHAdjustmentData stochează formatIdentifier și formatVersion — șiruri pentru identificarea formatului datelor. La actualizarea extensiei, trebuie verificată versiunea și gestionate corect formatele vechi.
let adjustmentData = PHAdjustmentData(
formatIdentifier: "com.example.photoediting",
formatVersion: "1.0",
data: NSKeyedArchiver.archivedData(
withRootObject: params,
requiringSecureCoding: true
)
)
output.adjustmentData = adjustmentData
În momentul finishContentEditing, extensia scrie AdjustmentData în obiectul PHContentEditingOutput împreună cu fișierul de imagine modificat. Sistemul salvează apoi ambele componente: versiunea pentru afișare și metadatele pentru restaurarea sesiunii de editare.
Photo Editing Extension apare automat în meniul aplicației Foto după instalarea aplicației care o conține. Utilizatorul deschide o fotografie, selectează „Editează”, iar în rândul de jos al instrumentelor sunt afișate toate extensiile de editare instalate — atât sistemice, cât și terțe.
Extensia se înregistrează prin Info.plist al aplicației principale cu cheia NSExtensionActivationRule, care specifică ce tipuri de conținut activează extensia. Pentru un editor foto, ActivationRule necesită de obicei image — extensia nu va fi afișată pentru videoclipuri sau fotografii live.
Apple recomandă specificarea tipurilor concrete de activare pentru a nu supraîncărca meniul de editare. Dacă extensia suportă doar JPEG și HEIC, merită să limitați activarea la aceste formate.
<!-- 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>
După selectarea extensiei, iOS creează un proces separat cu un UIViewController personalizat care se afișează deasupra interfeței Foto. Utilizatorul vede fotografia sa, instrumentele extensiei și butoanele „Anulează” / „Gata”. Extensia nu poate modifica navigația în afara controlerului său și nici nu poate accesa alte părți ale sistemului.
Conform Human Interface Guidelines de la Apple, interfața extensiei trebuie să fie minimă și funcțională — fără reclame, linkuri externe și elemente de navigație inutile. Se recomandă utilizarea UIScrollView pentru afișarea paletei de instrumente, pentru a nu aglomera ecranul.
Întrebări frecvente
Extensia primește PHContentEditingInput cu URL-ul fișierului complet al imaginii prin metoda beginContentEditing(with:). Accesul este acordat doar la o singură fotografie selectată — fără drepturi asupra altor resurse din bibliotecă.
Nu, originalul nu este niciodată modificat. Extensia creează o versiune nouă prin PHContentEditingOutput, iar AdjustmentData stochează parametrii modificărilor pentru posibilitatea revenirii la starea inițială.
Extensia funcționează cu toate formatele suportate de PhotoKit: JPEG, HEIC, RAW, PNG, TIFF și Live Photos. Restricțiile se stabilesc prin NSExtensionActivationRule în Info.plist al extensiei.
iOS alocă până la 30 de secunde pentru executarea operației finishContentEditing. La depășirea limitei, extensia este încheiată forțat, iar modificările nu sunt salvate. Procesarea în fundal cu CIFilter nu prelungește acest timp.
Da, Core Image (CIFilter) și Metal (pentru shadere personalizate) sunt complet suportate. Apple recomandă mutarea calculelor grele în thread-uri de fundal prin Grand Central Dispatch.
Concluzii
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și