Notification Content Extension est un type d'extension iOS qui remplace le modèle de notification push standard par une interface utilisateur entièrement personnalisée. Les développeurs peuvent afficher des images, des lecteurs audio, des boutons d'action, des barres de progression et des animations personnalisées dans une notification, transformant la bannière standard en une mini-application complète. Selon la WWDC 2025, l'extension utilise UNNotificationContentExtension et prend en charge jusqu'à 4 pièces jointes multimédias dans une seule notification, ainsi que le traitement des actions interactives via UNNotificationAction.
Points clés
Notification Content Extension est une extension d'application qui remplace l'affichage des notifications push sur iOS. Au lieu d'une bannière standard avec un titre, un corps de message et des boutons, vous pouvez montrer une interface entièrement conçue dans Interface Builder ou par programmation via UIKit ou SwiftUI.
Contrairement à Notification Service Extension, qui modifie le contenu avant l'affichage, Content Extension est responsable uniquement de la présentation visuelle. . L'extension reçoit la notification complète après toutes les modifications et décide comment l'afficher. C'est la différence clé entre les deux types d'extensions de notification.
L'extension est activée lorsque l'utilisateur effectue un geste d'expansion — faire défiler la notification vers le bas ou appuyer dessus (selon le modèle de l'appareil). iOS lance le processus d'extension, crée un contrôleur à partir du nib ou storyboard spécifié et délivre la notification via UNNotificationContentExtension .
Le développement commence par l'ajout d'une nouvelle cible dans Xcode avec le modèle Notification Content Extension. Xcode crée un fichier MainInterface.storyboard et une classe héritant de UIViewController qui implémente le protocole UNNotificationContentExtension.
La hauteur maximale de la zone personnalisée est de 320 points sur iPhone (pour les modèles à grand écran) et 352 points sur iPad. Le contenu qui dépasse ces limites est coupé. Pour s'adapter à différentes tailles, il est recommandé d'utiliser Auto Layout et UIScrollView pour le contenu défilable. La largeur correspond toujours à la largeur de la notification et change automatiquement lors de la rotation de l'appareil.
Les Apple Human Interface Guidelines avertissent : l'interface de notification doit être concise et contenir un seul élément principal — une image, un lecteur, une carte ou un formulaire de saisie rapide. De multiples éléments interactifs submergent l'utilisateur et compliquent l'interaction.
App Group est le seul mécanisme de partage de données entre l'extension et l'application principale. Grâce au répertoire partagé App Group, les images mises en cache, les jetons et les paramètres peuvent être transférés. Les appels API directs à l'application principale ou l'accès à ses UserDefaults ne sont pas disponibles en raison de l'isolement des processus.
class NotificationViewController: UIViewController {
func didReceive(
_ notification: UNNotification
) {
guard let attachment = notification
.request.content.attachments.first()
else { return }
if attachment.url.startAccessingSecurityScopedResource() {
imageView.image = UIImage(contentsOfFile:
attachment.url.path)
attachment.url.stopAccessingSecurityScopedResource()
}
}
}
UNNotificationContentExtension est le protocole principal qui définit le cycle de vie d'une notification personnalisée. Le protocole fournit des méthodes pour recevoir du contenu, gérer les actions et administrer l'interface.
didReceive(_:with:) est appelée lorsqu'une notification est reçue. L'extension reçoit un objet UNNotification et UNNotificationContentExtensionMediaPlayPauseButtonType pour gérer le lecteur multimédia. Dans cette méthode, vous devez configurer l'interface — charger une image, initialiser le lecteur ou afficher des données. Le système appelle cette méthode chaque fois que la notification est mise à jour en temps réel.
Il est important de noter que l'extension dispose d'un temps limité pour s'exécuter — environ 30 secondes pour un cycle d'affichage complet. Si l'interface n'est pas préparée dans ce délai, iOS affichera la notification système. Pour les ressources lourdes — chargement d'images depuis le réseau, décodage vidéo — il est recommandé d'utiliser des opérations asynchrones avec pré- mise en cache via App Group.
Le protocole inclut des méthodes optionnelles pour les boutons lecture/pause : mediaPlay, mediaPause, mediaPlayPauseButtonType. Si la notification contient du contenu audio ou vidéo, l'extension peut afficher un lecteur intégré avec un élément de contrôle système. iOS ajoute automatiquement un bouton de lecture dans le coin supérieur droit de l'extension lorsque le type de bouton approprié est retourné.
UNNotificationAttachment est un objet qui contient des données multimédias jointes à une notification. Les images, fichiers audio et vidéo sont ajoutés au stade de la création de la notification sur le serveur ou dans Notification Service Extension via UNNotificationAttachment.
Pour les images : JPEG, PNG, GIF, HEIF. Pour l'audio : MP3, AAC, ALAC, WAV. Pour la vidéo : MPEG-4, H.264, HEVC. Taille maximale de chaque pièce jointe : 50 Mo, jusqu'à 4 pièces jointes par notification. Le système télécharge automatiquement les pièces jointes en arrière-plan avant d'afficher la notification et donne à l'extension accès aux URL locales via des ressources à portée de sécurité.
Selon Apple, l'extension ne doit pas télécharger elle-même les médias — UNNotificationAttachment contient déjà une URL locale après que le système a terminé le téléchargement. Cependant, si la pièce jointe n'a pas été téléchargée à temps (par exemple, en raison d'une mauvaise connexion), l'extension peut afficher un espace réservé ou un texte alternatif.
Chaque UNNotificationAttachment fournit une URL à portée de sécurité à laquelle l'extension doit accéder via startAccessingSecurityScopedResource() et libérer via stopAccessingSecurityScopedResource(). Ces méthodes doivent être appelées par paires — sinon la ressource ne sera pas libérée et provoquera une fuite de droits d'accès.
let attachment = notification.request.content.attachments.first()
guard attachment.url.startAccessingSecurityScopedResource()
else { return }
defer { attachment.url.stopAccessingSecurityScopedResource() }
let data = try Data(contentsOf: attachment.url)
imageView.image = UIImage(data: data)
Notification Content Extension prend en charge des actions interactives personnalisées — des boutons affichés sous le contenu de la notification. Les actions sont enregistrées lors de la création de la catégorie de notification via UNNotificationCategory et peuvent être destructives, textuelles ou d'arrière-plan.
UNNotificationAction est une action simple avec un titre et un indicateur facultatif de destructivité. UNTextInputNotificationAction est une action avec un champ de saisie de texte, par exemple pour les réponses rapides aux messages. Les deux types prennent en charge l'option UNNotificationActionOptions.authenticationRequired — nécessitant le déverrouillage de l'appareil avant l'exécution.
L'extension reçoit l'action sélectionnée via la méthode didReceive(_:withCompletionHandler:), qui transmet un objet UNNotificationResponse avec l'identifiant de l'action et un texte optionnel. L'extension peut traiter la réponse elle-même ou la transmettre à l'application principale via le conteneur partagé App Group.
let category = UNNotificationCategory(
identifier: "message",
actions: [
UNTextInputNotificationAction(
identifier: "reply",
title: "Reply",
options: .authenticationRequired
),
UNNotificationAction(
identifier: "mark_read",
title: "Mark Read",
options: .foreground
)
],
intentIdentifiers: []
)
Questions fréquemment posées
Content Extension est responsable de l'affichage visuel de la notification, tandis que Service Extension est responsable de la modification du contenu avant l'affichage. Content Extension fonctionne après Service Extension et ne peut pas modifier le payload de la notification.
Swift et Objective-C pour UIKit. À partir d'iOS 16, SwiftUI est également pris en charge pour créer des interfaces de notification via NotificationContentView avec des modificateurs de taille et de configuration.
Oui, à partir d'iOS 16, l'extension peut utiliser SwiftUI via UIHostingController. Cependant, toutes les compétences UIKit — taille, contraintes, ressources à portée de sécurité — sont préservées et appliquées au contenu SwiftUI.
4 pièces jointes par notification. Chaque pièce jointe peut peser jusqu'à 50 Mo. Les formats pris en charge incluent les images (JPEG, PNG, HEIF), l'audio (MP3, AAC) et la vidéo (MPEG-4, H.264).
App Group — un répertoire partagé sur le disque. UserDefaults avec le suffixe app group fonctionne également. Les appels API directs à l'application principale ne sont pas disponibles en raison de l'isolement des processus.
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