Notification Content Extension est une extension iOS qui permet de remplacer l'interface standard des notifications push par une UIView personnalisée. Le développeur obtient un contrôle total sur l'affichage du contenu : images, vidéos, animations, polices personnalisées et éléments interactifs. Selon Apple Developer, 2025, Notification Content Extension prend en charge toute interface UIKit dans l'espace limité de la notification.
Points clés
Notification Content Extension est une extension d'application dans iOS qui remplace le modèle standard d'affichage des notifications push par une UIView personnalisée. Contrairement à une notification classique où le contenu est limité au titre, au sous-titre et au corps, l'extension permet d'afficher toute interface UIKit : une carte avec coordonnées, un graphique, une galerie d'images ou un formulaire de saisie.
Lorsque iOS reçoit une notification push avec un categoryIdentifier spécifié, le système vérifie si une extension est enregistrée pour cette catégorie. Si oui — le système lance l'extension dans un processus séparé et lui transmet le contenu de la notification. L'extension affiche sa propre interface au lieu de l'interface standard. L'utilisateur interagit avec l'interface personnalisée sans ouvrir l'application principale.
Il est important de ne pas confondre Notification Content Extension avec Notification Service Extension. La Service Extension traite le contenu avant l'affichage de la notification (téléchargement des pièces jointes, déchiffrement). La Content Extension remplace l'interface après réception du contenu prêt. Les deux extensions peuvent fonctionner ensemble : la Service Extension prépare les données, la Content Extension les affiche.
| Caractéristique | Content Extension | Service Extension |
|---|---|---|
| Objectif | UI personnalisée de notification | Modification du contenu avant affichage |
| Temps d'exécution | Pendant que l'utilisateur voit la notification | Jusqu'à 30 secondes en arrière-plan |
| Interface | UIView UIKit complète | Aucune interface |
| API | UNNotificationContentExtension | UNNotificationServiceExtension |
Notification Content Extension fonctionne dans un processus isolé avec des ressources limitées. L'extension n'a pas accès au stockage principal de l'application via NSUserDefaults, sauf via App Group. La taille de l'extension est limitée à 50 Mo décompressée. Le temps d'affichage du contenu est également limité — si l'extension ne termine pas la mise à jour dans un délai raisonnable, le système la termine.
Pour créer l'extension dans Xcode, il faut ajouter une nouvelle cible de type Notification Content Extension. Xcode crée automatiquement MainInterface.storyboard avec un contrôleur qui hérite de UIViewController et implémente UNNotificationContentExtension.
Dans Xcode, sélectionnez File → New → Target → Notification Content Extension. Indiquez le nom de l'extension, le langage (Swift ou Objective-C) et assurez-vous que le projet est connecté à la même équipe de développement. Après la création de la cible, un dossier apparaît avec trois fichiers : MainInterface.storyboard, Info.plist et le fichier du contrôleur.
Dans le Info.plist de l'extension, il est obligatoire de spécifier le tableau NSExtensionAttributes avec la clé UNNotificationExtensionCategory. Ce tableau contient les identifiants des catégories de notification pour lesquelles l'extension sera activée. La clé optionnelle UNNotificationExtensionInitialContentSizeRatio définit le rapport d'aspect initial de l'interface personnalisée pour un positionnement correct.
Il est recommandé de maintenir une architecture propre dans la cible d'extension : un dossier séparé pour les contrôleurs, un autre pour les vues personnalisées. Comme l'extension est un binaire séparé, le code de l'application principale n'est pas directement accessible. Pour le partage de code, créez un framework séparé ou utilisez App Group pour les données.
UNNotificationContentExtension est le protocole que le contrôleur de Notification Content Extension doit implémenter. La seule méthode obligatoire est didReceive(_:with:), appelée lors de la réception d'une notification. Le contrôleur reçoit la notification et le contrôleur de vue prêt qui doit être mis à jour avec les données.
Le contrôleur de l'extension doit hériter de UIViewController et implémenter UNNotificationContentExtension. Le Storyboard ou xib est lié à ce contrôleur. Lors de la réception d'une notification, la méthode didReceive transmet le contenu et le contrôleur met à jour ses vues.
import UIKit
import UserNotifications
import UserNotificationsUI
class CustomNotificationViewController: UIViewController {
@IBOutlet var titleLabel: UILabel!
@IBOutlet var customImageView: UIImageView!
func didReceive(
notification: UNNotification
) {
let content = notification.request.content
titleLabel.text = content.title
loadAttachment(content.attachments.first)
}
private func loadAttachment(attachment: UNNotificationAttachment?) {
guard let url = attachment?.URL else { return }
if let image = UIImage(contentsOfFile: url.path) {
customImageView.image = image
}
}
}
extension CustomNotificationViewController: UNNotificationContentExtension {
func didReceive(
notification: UNNotification
) {
didReceive(notification: notification)
}
}
Le système détermine la taille de l'interface personnalisée en fonction de la clé UNNotificationExtensionInitialContentSizeRatio dans Info.plist et du contenu actuel. Il est recommandé de définir cette clé à 0.1 pour une taille initiale minimale, puis de modifier la taille via preferredContentSize après le chargement du contenu.
Notification Content Extension offre une liberté totale dans la création de l'interface. On peut utiliser tous les composants UIKit : UITableView, MKMapView, WKWebView, UIStackView. Cependant, il est important de tenir compte de l'espace limité de la notification et d'optimiser les performances.
Un des scénarios populaires est l'affichage d'une carte avec localisation. Pour cela, on ajoute MKMapView au Storyboard de l'extension, et le contrôleur transmet les coordonnées du contenu de la notification. N'oubliez pas d'ajouter MapKit à la cible de l'extension. Lors de l'utilisation de la carte, tenez compte de la limite mémoire de l'extension — le chargement de tuiles complexes peut dépasser les ressources disponibles.
Notification Content Extension prend en charge les animations UIView, y compris le redimensionnement, le déplacement et la transparence des éléments. Lors de l'entrée en mode étendu de la notification, on peut lancer une animation d'apparition du contenu. Les animations doivent être courtes (jusqu'à 0,5 seconde) et ne pas gêner l'interaction de l'utilisateur avec la notification. Évitez les animations infinies — elles consomment de la batterie et réduisent les performances.
Comme l'extension est un UIViewController complet, vous pouvez ajouter des gestes et des gestionnaires de touches. Les gestes UIKit (UITapGestureRecognizer, UIButton) fonctionnent de manière standard. Pour les actions nécessitant l'ouverture de l'application, utilisez le délégué de l'extension ou userNotificationCenter. Les éléments interactifs doivent être suffisamment grands pour un toucher confortable dans un espace limité — la taille minimale de la cible tactile est de 44x44 points selon les recommandations Apple.
Le contenu multimédia est la fonctionnalité clé de Notification Content Extension. La notification peut contenir des images, des GIF, de l'audio et de la vidéo qui sont affichés dans l'interface personnalisée. Les pièces jointes sont livrées via UNNotificationAttachment, qui peut être ajouté par le serveur via le payload ou par Notification Service Extension après téléchargement. Les formats pris en charge sont JPEG, PNG, MPEG-4 et MP3.
Pour afficher une image, il suffit d'obtenir UNNotificationAttachment du contenu de la notification et de le charger à partir de l'URL locale. Il est important de se rappeler que l'extension n'a accès qu'aux fichiers locaux — les ressources distantes doivent être préalablement téléchargées par Service Extension. Taille maximale de la pièce jointe — 50 Mo sous iOS 15+, la limite change à chaque mise à jour ultérieure. Pour prendre en charge plusieurs images, utilisez UNNotificationAttachment avec des identifiants différents et affichez-les via UIPageViewController.
Pour afficher une image dans l'interface personnalisée, l'extension obtient UNNotificationAttachment du contenu de la notification et le charge à partir de l'URL locale. La pièce jointe doit être préalablement téléchargée par Notification Service Extension — Content Extension n'a pas accès au réseau. Taille maximale de la pièce jointe multimédia — 50 Mo sous iOS 15+, dans les versions antérieures la limite était de 10 Mo. L'extension doit gérer correctement l'absence de pièce jointe et afficher une interface de repli. Pour précharger des images basse résolution, utilisez des versions miniatures créées par Service Extension avant l'attachement.
iOS prend en charge la lecture vidéo dans Notification Content Extension via AVPlayerLayer. L'extension peut afficher un lecteur vidéo avec des boutons de contrôle directement dans la notification. C'est particulièrement utile pour les applications de surveillance, de streaming ou de prévisualisation de contenu. La lecture automatique sans son est autorisée à condition que l'utilisateur s'attende à du contenu multimédia dans cette notification. Lors de l'implémentation du lecteur vidéo, ajoutez des éléments de contrôle : lecture/pause, barre de progression et bouton de fermeture. Assurez-vous que la vidéo ne démarre pas automatiquement avec le son — cela viole les recommandations Apple concernant l'expérience utilisateur. Pour un diaporama de plusieurs images, utilisez une transition animée entre elles via UIView.transition avec l'option de transition de retournement de page.
Notification Content Extension fonctionne dans un environnement limité avec une limite mémoire d'environ 50 Mo. Pour optimiser les performances, utilisez le chargement différé des images, évitez les calculs lourds sur le thread principal et appliquez Auto Layout avec des contraintes simples. Les opérations lourdes telles que le traitement d'images ou l'analyse de données, exécutez-les dans des files d'attente en arrière-plan (DispatchQueue.global). En cas de dépassement de la limite mémoire, le système terminera l'extension et l'utilisateur verra la notification standard. Il est recommandé de profiler l'extension via Instruments (Allocations et Time Profiler) avant la publication, ainsi que de vérifier la consommation mémoire sur des appareils réels avec différentes versions d'iOS.
Foire aux questions
Oui, à partir d'iOS 16, Notification Content Extension prend en charge SwiftUI via UIHostingController. Cependant, UIKit reste le choix le plus stable pour les interfaces complexes en raison du support limité de SwiftUI dans les extensions.
Vérifiez que le categoryIdentifier dans le payload de la notification correspond à UNNotificationExtensionCategory dans le Info.plist de l'extension. Assurez-vous également que l'extension a été ajoutée à la cible principale de l'application et qu'elle est correctement signée.
Utilisez App Group — stockage partagé (suite UserDefaults) ou conteneur de fichiers. L'application principale et l'extension doivent être dans le même groupe de développement et avoir la capacité App Groups activée.
Utilisez la méthode didReceive(_:with:) avec UNNotificationContentExtensionMediaPlayPauseButtonType pour le contrôle multimédia ou demandez une mise à jour via le délégué. La mise à jour complète du contenu sans nouvelle notification n'est pas possible.
Sélectionnez la cible de l'extension dans Xcode et lancez sur le simulateur. Utilisez lldb et les points d'arrêt comme dans une application normale. Pour tester, envoyez une notification push via Firebase Console ou localement via Pusher.
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