Photo Editing Extension est un mécanisme iOS qui permet aux applications tierces d'ajouter des outils d'édition directement dans l'application Photos système. Contrairement aux éditeurs complets, l'extension ne charge pas la photo dans une application séparée — l'utilisateur applique des filtres, ajuste les couleurs ou ajoute des effets sans quitter l'interface standard. Selon la documentation développeur Apple (2025), PhotoKit fournit plus de 40 API pour travailler avec les ressources photo, y compris PHAdjustmentData et PHContentEditingController.
Points clés
Photo Editing Extension est un type d'extension d'application sur iOS qui intègre des outils de traitement d'image dans l'interface standard de l'application Photos. L'utilisateur ouvre une photo, appuie sur le bouton Modifier et sélectionne l'extension souhaitée dans la liste des extensions installées. Après l'édition, le résultat est enregistré dans la bibliothèque et le fichier original reste disponible pour une restauration.
Cette architecture résout un problème clé de l'expérience utilisateur : il n'est pas nécessaire de changer d'application, d'exporter et d'importer des images, ou de suivre les versions. Selon la WWDC 2025, toutes les extensions fonctionnent dans un processus isolé avec leur propre bac à sable et un temps d'exécution limité — jusqu'à 30 secondes par opération d'édition.
L'extension n'a pas accès aux fichiers arbitraires dans la mémoire de l'appareil — seulement à la photo que l'utilisateur a explicitement transmise via l'interface de sélection. Cela garantit la sécurité des données utilisateur lors de l'utilisation d'outils tiers.
PhotoKit est un framework Apple pour travailler avec la bibliothèque multimédia de l'appareil, introduit dans iOS 8. Il fournit un accès programmatique aux ressources Photos, y compris les images, les vidéos, les albums et les métadonnées. Pour les extensions d'édition, PhotoKit sert de couche intermédiaire entre le stockage et l'interface de modification.
PHAsset représente un objet multimédia individuel dans la bibliothèque — une photo ou une vidéo. Via PHAsset, on peut obtenir des métadonnées : date de capture, type de fichier, emplacement sur la carte et orientation de l'appareil photo. PHAssetResource donne accès aux ressources sous-jacentes — par exemple, au fichier photo original au format RAW ou HEIC.
Pour une extension d'édition, PHContentEditingInput est d'une importance cruciale — un objet qui contient le fichier image (ou vidéo) complet disponible pour la lecture et le traitement. L'extension reçoit cet objet au moment de l'activation et l'utilise comme matériel source.
PHImageManager gère le chargement et la mise en cache des images. Pour une extension d'édition, il n'est pas utilisé directement — l'extension reçoit le fichier complet via PHContentEditingInput. Cependant, PHImageRequestOptions permet de configurer les paramètres de requête : taille, type de livraison (synchrone ou asynchrone) et format du résultat.
Selon Apple, PHImageManager met automatiquement en cache les vignettes d'images dans la RAM, ce qui accélère l'affichage répété des aperçus. Pour les extensions d'édition, il est recommandé d'utiliser PHImageRequestOptionsDeliveryModeHighQualityFormat pour obtenir la meilleure qualité d'image.
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
}
Chaque Photo Editing Extension implémente le protocole PHContentEditingController — l'élément central de contrôle de l'extension. Le protocole définit des méthodes pour afficher l'interface, recevoir les données d'entrée et enregistrer le résultat.
beginContentEditing(with:) est appelé au début de la session d'édition. L'extension reçoit PHContentEditingInput et doit afficher l'interface avec l'image originale. finishContentEditing(completionHandler:) termine l'édition — l'extension retourne PHContentEditingOutput avec le fichier modifié et AdjustmentData. cancelContentEditing() annule les modifications sans les enregistrer.
Une nuance importante : au moment de l'appel de beginContentEditing, l'extension obtient accès à une seule version de la photo — celle qui a été demandée par l'utilisateur. Elle ne peut pas accéder à une autre photo ou à un album. Il s'agit d'une restriction de bac à sable introduite par Apple pour des raisons de sécurité.
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 sépare l'interface d'édition de la logique d'enregistrement. Le processus principal iOS appelle beginContentEditing, l'extension affiche son interface utilisateur, l'utilisateur effectue des modifications, puis finishContentEditing génère un nouveau fichier. Apple recommande d'effectuer tous les traitements gourmands en ressources — filtres CIFilter, manipulations Core Image — dans un thread d'arrière-plan, et non dans le thread principal, afin de ne pas bloquer l'interface.
PHAdjustmentData est le mécanisme clé qui permet l'édition non destructive dans Photo Editing Extension. C'est un objet qui contient des informations sur les modifications appliquées dans un format arbitraire. L'extension sérialise les paramètres de filtres, les masques et les réglages dans AdjustmentData et les enregistre avec l'image modifiée.
Lors de la réouverture de la photo, l'extension lit AdjustmentData, restaure l'état précédent de l'interface et permet à l'utilisateur de continuer l'édition là où il s'était arrêté. Si l'extension n'est pas installée, la photo s'affiche dans la dernière version enregistrée, tandis que l'original est stocké séparément.
Selon la documentation Apple, PHAdjustmentData stocke formatIdentifier et formatVersion — des chaînes pour identifier le format des données. Lors de la mise à jour de l'extension, vous devez vérifier la version et gérer correctement les anciens formats.
let adjustmentData = PHAdjustmentData(
formatIdentifier: "com.example.photoediting",
formatVersion: "1.0",
data: NSKeyedArchiver.archivedData(
withRootObject: params,
requiringSecureCoding: true
)
)
output.adjustmentData = adjustmentData
Au moment de finishContentEditing, l'extension écrit AdjustmentData dans l'objet PHContentEditingOutput avec le fichier image modifié. Le système enregistre ensuite les deux composants : la version pour l'affichage et les métadonnées pour restaurer la session d'édition.
Photo Editing Extension apparaît automatiquement dans le menu de l'application Photos après l'installation de l'application qui la contient. L'utilisateur ouvre une photo, sélectionne Modifier, et dans la rangée inférieure d'outils, toutes les extensions d'édition installées — système et tierces — sont affichées.
L'extension est enregistrée via le Info.plist de l'application principale avec la clé NSExtensionActivationRule, qui spécifie quels types de contenu activent l'extension. Pour un éditeur de photos, ActivationRule nécessite généralement image — l'extension n'apparaîtra pas pour les vidéos ou les Live Photos.
Apple recommande de spécifier des types d'activation concrets pour ne pas surcharger le menu d'édition. Si l'extension ne prend en charge que JPEG et HEIC, il convient de limiter l'activation à ces formats.
<!-- 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>
Après la sélection d'une extension, iOS crée un processus séparé avec un UIViewController personnalisé qui s'affiche par-dessus l'interface Photos. L'utilisateur voit sa photo, les outils de l'extension et les boutons Annuler/Terminé. L'extension ne peut pas modifier la navigation en dehors de son propre contrôleur ni accéder à d'autres parties du système.
Selon les Règles d'Interface Humaine d'Apple, l'interface de l'extension doit être minimale et fonctionnelle — sans publicité, liens superflus ou éléments de navigation inutiles. Il est recommandé d'utiliser UIScrollView pour afficher la palette d'outils afin de ne pas encombrer l'écran.
Questions fréquentes
L'extension reçoit PHContentEditingInput avec l'URL du fichier image complet via la méthode beginContentEditing(with:). L'accès est accordé uniquement à une seule photo sélectionnée — sans droits sur les autres ressources de la bibliothèque.
Non, l'original n'est jamais modifié. L'extension crée une nouvelle version via PHContentEditingOutput, et AdjustmentData stocke les paramètres des modifications pour permettre un retour à l'état original.
L'extension fonctionne avec tous les formats pris en charge par PhotoKit : JPEG, HEIC, RAW, PNG, TIFF et Live Photos. Les limitations sont définies via NSExtensionActivationRule dans le Info.plist de l'extension.
iOS alloue jusqu'à 30 secondes pour l'opération finishContentEditing. Si la limite est dépassée, l'extension est terminée de force et les modifications ne sont pas enregistrées. Le traitement en arrière-plan avec CIFilter ne prolonge pas ce temps.
Oui, Core Image (CIFilter) et Metal (pour les shaders personnalisés) sont entièrement pris en charge. Apple recommande de déléguer les calculs lourds à des threads d'arrière-plan via Grand Central Dispatch.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi