Photo Editing Extension è un meccanismo iOS che consente alle app di terze parti di aggiungere strumenti di modifica direttamente nell'app Foto di sistema. A differenza degli editor completi, l'estensione non carica la foto in un'app separata — l'utente applica filtri, regola i colori o aggiunge effetti senza uscire dall'interfaccia standard. Secondo la documentazione per sviluppatori Apple (2025), PhotoKit fornisce oltre 40 API per lavorare con le risorse fotografiche, inclusi PHAdjustmentData e PHContentEditingController.
Punti Chiave
Photo Editing Extension è un tipo di estensione di app in iOS che incorpora strumenti di elaborazione delle immagini nell'interfaccia standard dell'app Foto. L'utente apre una foto, preme il pulsante Modifica e seleziona l'estensione desiderata dall'elenco di quelle installate. Dopo la modifica, il risultato viene salvato nella libreria e il file originale rimane disponibile per il ripristino.
Questa architettura risolve un problema chiave dell'esperienza utente: non è necessario cambiare app, esportare e importare immagini o tenere traccia delle versioni. Secondo il WWDC 2025, tutte le estensioni funzionano in un processo isolato con il proprio sandbox e tempo di esecuzione limitato — fino a 30 secondi per operazione di modifica.
L'estensione non ha accesso a file arbitrari nella memoria del dispositivo — solo alla foto che l'utente ha esplicitamente passato attraverso l'interfaccia di selezione. Ciò garantisce la sicurezza dei dati dell'utente quando si utilizzano strumenti di terze parti.
PhotoKit è un framework Apple per lavorare con la libreria multimediale del dispositivo, introdotto in iOS 8. Fornisce accesso programmatico alle risorse di Foto, incluse immagini, video, album e metadati. Per le estensioni di modifica, PhotoKit funge da strato intermedio tra l'archiviazione e l'interfaccia di modifica.
PHAsset rappresenta un singolo oggetto multimediale nella libreria — una foto o un video. Tramite PHAsset è possibile ottenere metadati: data di scatto, tipo di file, posizione sulla mappa e orientamento della fotocamera. PHAssetResource fornisce accesso alle risorse sottostanti — ad esempio, al file foto originale in formato RAW o HEIC.
Per un'estensione di modifica, PHContentEditingInput è di vitale importanza — un oggetto che contiene il file immagine (o video) completo disponibile per la lettura e l'elaborazione. L'estensione riceve questo oggetto al momento dell'attivazione e lo utilizza come materiale sorgente.
PHImageManager gestisce il caricamento e la memorizzazione nella cache delle immagini. Per un'estensione di modifica, non viene utilizzato direttamente — l'estensione riceve il file completo tramite PHContentEditingInput. Tuttavia, PHImageRequestOptions consente di configurare i parametri della richiesta: dimensione, tipo di consegna (sincrona o asincrona) e formato del risultato.
Secondo Apple, PHImageManager memorizza automaticamente nella cache le miniature delle immagini in RAM, accelerando la visualizzazione ripetuta delle anteprime. Per le estensioni di modifica, si consiglia di utilizzare PHImageRequestOptionsDeliveryModeHighQualityFormat per ottenere la migliore qualità dell'immagine.
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
}
Ogni Photo Editing Extension implementa il protocollo PHContentEditingController — l'elemento centrale di controllo dell'estensione. Il protocollo definisce metodi per visualizzare l'interfaccia, ricevere dati di input e salvare il risultato.
beginContentEditing(with:) viene chiamato quando inizia la sessione di modifica. L'estensione riceve PHContentEditingInput e deve visualizzare l'interfaccia con l'immagine originale. finishContentEditing(completionHandler:) completa la modifica — l'estensione restituisce PHContentEditingOutput con il file modificato e AdjustmentData. cancelContentEditing() annulla le modifiche senza salvarle.
Una sfumatura importante: al momento della chiamata beginContentEditing, l'estensione ottiene accesso solo a una versione della foto — quella richiesta dall'utente. Non può accedere a un'altra foto o album. Questa è una restrizione del sandbox introdotta da Apple per la sicurezza.
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 separa l'interfaccia di modifica dalla logica di salvataggio. Il processo principale iOS chiama beginContentEditing, l'estensione mostra la sua UI, l'utente apporta modifiche, quindi finishContentEditing genera un nuovo file. Apple raccomanda di eseguire tutta l'elaborazione intensiva di risorse — filtri CIFilter, manipolazioni Core Image — in un thread in background, non in quello principale, per non bloccare l'interfaccia.
PHAdjustmentData è il meccanismo chiave che consente la modifica non distruttiva in Photo Editing Extension. È un oggetto che contiene informazioni sulle modifiche applicate in un formato arbitrario. L'estensione serializza parametri di filtri, maschere e impostazioni in AdjustmentData e li salva insieme all'immagine modificata.
Quando la foto viene riaperta, l'estensione legge AdjustmentData, ripristina lo stato precedente dell'interfaccia e consente all'utente di continuare la modifica dallo stesso punto. Se l'estensione non è installata, la foto viene visualizzata nell'ultima versione salvata, mentre l'originale viene archiviato separatamente.
Secondo la documentazione Apple, PHAdjustmentData memorizza formatIdentifier e formatVersion — stringhe per identificare il formato dei dati. Quando si aggiorna l'estensione, è necessario verificare la versione e gestire correttamente i formati vecchi.
let adjustmentData = PHAdjustmentData(
formatIdentifier: "com.example.photoediting",
formatVersion: "1.0",
data: NSKeyedArchiver.archivedData(
withRootObject: params,
requiringSecureCoding: true
)
)
output.adjustmentData = adjustmentData
Al momento di finishContentEditing, l'estensione scrive AdjustmentData nell'oggetto PHContentEditingOutput insieme al file immagine modificato. Il sistema salva quindi entrambi i componenti: la versione per la visualizzazione e i metadati per ripristinare la sessione di modifica.
Photo Editing Extension appare automaticamente nel menu dell'app Foto dopo aver installato l'app che la contiene. L'utente apre una foto, seleziona Modifica e nella riga inferiore degli strumenti vengono mostrate tutte le estensioni di modifica installate — sia di sistema che di terze parti.
L'estensione viene registrata tramite Info.plist dell'app principale con la chiave NSExtensionActivationRule, che specifica quali tipi di contenuto attivano l'estensione. Per un editor di foto, ActivationRule richiede generalmente image — l'estensione non apparirà per video o Live Photos.
Apple raccomanda di specificare tipi di attivazione concreti per non sovraccaricare il menu di modifica. Se l'estensione supporta solo JPEG e HEIC, vale la pena limitare l'attivazione a questi formati.
<!-- 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>
Dopo aver selezionato un'estensione, iOS crea un processo separato con un UIViewController personalizzato che viene visualizzato sopra l'interfaccia di Foto. L'utente vede la sua foto, gli strumenti dell'estensione e i pulsanti Annulla/Fatto. L'estensione non può modificare la navigazione al di fuori del proprio controller né accedere ad altre parti del sistema.
Secondo le Linee Guida per l'Interfaccia Umana di Apple, l'interfaccia dell'estensione deve essere minima e funzionale — senza pubblicità, link estranei o elementi di navigazione superflui. Si consiglia di utilizzare UIScrollView per visualizzare la palette degli strumenti e non ingombrare lo schermo.
Domande Frequenti
L'estensione riceve PHContentEditingInput con l'URL del file immagine completo tramite il metodo beginContentEditing(with:). L'accesso viene concesso solo a una foto selezionata — senza diritti su altre risorse della libreria.
No, l'originale non viene mai modificato. L'estensione crea una nuova versione tramite PHContentEditingOutput e AdjustmentData memorizza i parametri delle modifiche per la possibilità di tornare allo stato originale.
L'estensione funziona con tutti i formati supportati da PhotoKit: JPEG, HEIC, RAW, PNG, TIFF e Live Photos. Le limitazioni vengono impostate tramite NSExtensionActivationRule nell'Info.plist dell'estensione.
iOS assegna fino a 30 secondi per l'operazione finishContentEditing. Se il limite viene superato, l'estensione viene terminata forzatamente e le modifiche non vengono salvate. L'elaborazione in background con CIFilter non prolunga questo tempo.
Sì, Core Image (CIFilter) e Metal (per shader personalizzati) sono completamente supportati. Apple raccomanda di scaricare i calcoli pesanti su thread in background tramite Grand Central Dispatch.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche