Notification Service Extension — comment fonctionne le traitement des notifications push

Auteur : IT Sectr Publié le : 2026-06-16 Temps de lecture : 9 min

Notification Service Extension est une extension iOS qui intercepte une notification push immédiatement après sa réception mais avant son affichage à l'utilisateur. L'extension peut déchiffrer une charge utile cryptée, télécharger et joindre des fichiers multimédia, et modifier le texte ou le titre de la notification en temps réel. Selon la documentation développeur Apple (2025), pour activer l'extension, le serveur doit envoyer la clé mutable-content:1 dans les attributs de la notification — c'est la seule condition pour lancer UNNotificationServiceExtension.

Points clés

  • Notification Service Extension modifie une notification push avant de l'afficher à l'utilisateur sur un appareil iOS
  • L'activation de l'extension nécessite le paramètre mutable-content:1 dans la charge utile de la notification du serveur
  • Le protocole principal est UNNotificationServiceExtension avec les méthodes didReceive(_:withContentHandler:) et serviceExtensionTimeWillExpire()
  • L'extension peut télécharger des pièces jointes multimédia depuis le réseau et les attacher à la notification via UNNotificationAttachment
  • Le temps d'exécution est limité — le système alloue environ 30 secondes pour le traitement complet d'une notification

Qu'est-ce que Notification Service Extension

Notification Service Extension est une extension d'application dans iOS qui intercepte une notification push entrante du côté de l'appareil et permet de modifier son contenu avant que l'utilisateur ne la voie. C'est le seul type d'extension de notification qui travaille avec le contenu et non avec l'affichage.

La principale différence avec Notification Content Extension : Service Extension fonctionne avant l'affichage de la notification et peut modifier le titre, le corps, le fichier sonore et les pièces jointes. Content Extension fonctionne après l'affichage et gère uniquement la présentation visuelle de la notification terminée. Ces deux extensions peuvent fonctionner ensemble : Service Extension télécharge une image, et Content Extension l'affiche dans une interface personnalisée.

L'extension s'active automatiquement à la réception d'une notification push avec l'attribut mutable-content:1 dans le dictionnaire aps. iOS lance l'extension en arrière-plan, lui transmet la UNNotificationRequest originale et attend une version modifiée à afficher.

Traitement des notifications push à la volée

UNNotificationServiceExtension reçoit la UNNotificationRequest complète avec le contenu original. L'extension peut modifier n'importe quel champ de UNNotificationContent : title, subtitle, body, userInfo, attachments et sound. Les modifications sont appliquées avant que la notification ne soit affichée.

Scénarios d'utilisation typiques

Déchiffrement de contenu — si une notification push contient une charge utile cryptée, l'extension la déchiffre avant l'affichage. Téléchargement de médias — joindre une image ou une vidéo à la notification. Localisation — adapter le texte de la notification aux paramètres régionaux de l'appareil. Enrichissement des données — ajouter des informations supplémentaires depuis le stockage local ou le cache.

Selon Apple, le scénario le plus courant parmi les applications est le téléchargement d'images pour les notifications multimédia enrichies. Le serveur envoie une URL d'image dans la charge utile, l'extension la télécharge dans un répertoire temporaire et crée une UNNotificationAttachment, que le système affiche dans une interface standard ou personnalisée.

Modification du texte et du titre

L'extension peut réécrire complètement le texte de la notification, remplacer le titre ou ajouter un sous-titre. Par exemple, une application de messagerie peut recevoir une notification cryptée, la déchiffrer dans l'extension et afficher un texte lisible. Ou une application d'actualités peut ajouter une catégorie d'actualité au sous-titre avant l'affichage.

swift
override func didReceive(
    _ request: UNNotificationRequest,
    withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void
) {
    let content = request.content.mutableCopy()
        as! UNMutableNotificationContent
    if let imageURL = content.userInfo["media-url"]
        as? String {
        downloadAndAttach(imageURL: imageURL,
            content: content,
            handler: contentHandler)
    }
}

Protocole UNNotificationServiceExtension

UNNotificationServiceExtension est la classe de base dont hérite Service Extension. La classe définit deux méthodes de cycle de vie : didReceive(_:withContentHandler:) — la méthode de traitement principale, et serviceExtensionTimeWillExpire() — le gestionnaire de délai d'attente.

Méthode didReceive:withContentHandler:

didReceive(_:withContentHandler:) est appelée lors de la réception d'une notification. L'extension reçoit une UNNotificationRequest et une fermeture contentHandler, qui doit être appelée avec le UNMutableNotificationContent modifié. L'extension est obligée d'appeler contentHandler — si elle ne le fait pas, iOS affichera la notification originale après l'expiration du délai.

Important : l'extension ne peut traiter qu'une seule notification à la fois. Si plusieurs notifications arrivent simultanément, iOS crée des instances d'extension séparées pour chacune. Vous ne pouvez pas utiliser d'état global pour un traitement séquentiel.

Méthode serviceExtensionTimeWillExpire:

serviceExtensionTimeWillExpire() est appelée par le système lorsque le temps d'exécution restant est sur le point d'expirer. Dans cette méthode, vous devez immédiatement appeler contentHandler avec le contenu prêt à ce moment-là — même si le fichier multimédia n'a pas fini de télécharger. Si vous n'appelez pas contentHandler dans cette méthode, iOS affichera la notification originale.

Il est recommandé de sauvegarder un contenu minimalement acceptable dans cette méthode — par exemple, une notification avec du texte et un titre mais sans image dont le téléchargement n'a pas été terminé à temps.

Cryptage et pièces jointes multimédia

UNNotificationAttachment est un objet créé par l'extension pour joindre un fichier multimédia à la notification. L'extension télécharge le fichier depuis le réseau, le sauvegarde dans un répertoire temporaire et crée une UNNotificationAttachment en spécifiant le type de contenu.

Création d'une pièce jointe à partir d'un fichier téléchargé

UNNotificationAttachment est créée à l'aide de l'initialiseur init(identifier:url:options:). L'URL doit pointer vers un fichier local dans le répertoire temporaire accessible à l'extension. Après la création, la pièce jointe est ajoutée au tableau attachments de UNMutableNotificationContent.

Apple recommande d'utiliser URLSession avec une configuration en arrière-plan pour le téléchargement — lors de l'utilisation d'URLSession standard, le téléchargement bloque le thread et consomme du temps sur la limite de 30 secondes. URLSession en arrière-plan continue le téléchargement même lorsque l'extension se termine, et le résultat peut être utilisé au prochain lancement.

Déchiffrement d'une charge utile cryptée

Si le serveur envoie une notification cryptée, l'extension doit déchiffrer la charge utile avant d'appeler contentHandler. Le déchiffrement implique généralement de demander une clé depuis Keychain ou App Group, de déchiffrer via CommonCrypto, et de remplacer le body ou userInfo de la notification. En cas d'erreur de déchiffrement, vous devez appeler contentHandler avec le contenu original — pour que l'utilisateur voie au moins qu'une notification est arrivée, même si elle est illisible.

swift
func downloadAndAttach(
    imageURL: String,
    content: UNMutableNotificationContent,
    handler: @escaping (UNNotificationContent) -> Void
) {
    let task = URLSession.shared.dataTask(with:
        URL(string: imageURL)!) { data, _, _ in
        let url = FileManager.default
            .temporaryDirectory
            .appendingPathComponent("image.jpg")
        try? data?.write(to: url)
        let attachment = try? UNNotificationAttachment(
            identifier: "image", url: url)
        content.attachments = [attachment].compactMap { $0 }
        handler(content)
    }
    task.resume()
}

Délais d'attente et mécanismes de repli

Notification Service Extension fonctionne dans des délais stricts. iOS alloue un temps d'exécution fixe — environ 30 secondes à partir de l'activation. Si l'extension n'a pas appelé contentHandler dans ce délai, le système termine de force le processus et affiche la notification originale sans modification.

Stratégie de dégradation progressive

Il est recommandé d'implémenter un repli à plusieurs niveaux : d'abord essayer de télécharger le média, en cas de succès appeler contentHandler avec le contenu complet ; en cas d'échec appeler contentHandler avec le texte mais sans média ; en cas d'erreur critique transmettre le contenu original. Cette approche garantit que l'utilisateur verra toujours une notification et non un écran vide.

Selon Apple, la cause la plus fréquente des délais d'attente est le téléchargement de grands fichiers multimédia sur une connexion lente. Pour réduire le risque, il est recommandé d'optimiser la taille des images sur le serveur — envoyer des aperçus jusqu'à 300 Ko au lieu de la résolution complète. Les images en taille réelle doivent être téléchargées lors de l'ouverture de l'application.

Surveillance des performances

Pour suivre les délais d'attente et les erreurs de l'extension, vous pouvez utiliser os_log pour enregistrer des messages de diagnostic dans le Unified Logging System. Bien que la journalisation directe dans un fichier dans l'extension soit difficile, os_log permet d'analyser les performances via Console.app sur l'appareil du développeur. Apple recommande d'ajouter des métriques à chaque appel didReceive — temps de téléchargement, taille du fichier, résultat de l'opération.

swift
override func serviceExtensionTimeWillExpire() {
    let fallback = bestEffortContent as?
        UNMutableNotificationContent
        ?? request.content.mutableCopy()
        as! UNMutableNotificationContent
    contentHandler(fallback)
}

Foire aux questions

Comment le serveur active-t-il Notification Service Extension ?

Le serveur ajoute la clé mutable-content:1 au dictionnaire aps de la notification push. Sans ce paramètre, le système ignore l'extension et affiche la notification standard.

Peut-on utiliser l'extension sans mutable-content ?

Non. mutable-content:1 est une condition obligatoire pour activer Service Extension. Si la clé est absente ou définie sur 0, la notification est affichée sans appeler l'extension.

Que se passe-t-il lorsque la limite de 30 secondes est dépassée ?

iOS termine de force l'extension et affiche la notification originale sans modification. Pour éviter cela, implémentez serviceExtensionTimeWillExpire() avec un contenu minimalement acceptable.

Comment transmettre les clés de cryptage à l'extension ?

Via App Group (UserDefaults ou fichier partagé) ou Keychain avec accès partagé entre l'application et l'extension. Transmettre les clés directement dans la charge utile de la notification n'est pas sécurisé.

Combien de fichiers multimédia peuvent être joints dans Service Extension ?

Jusqu'à 4 pièces jointes par notification, chacune jusqu'à 50 Mo. La taille totale des pièces jointes affecte le temps de téléchargement — plus il y a de fichiers, plus le risque de délai d'attente est élevé.

Résumé

  • Notification Service Extension modifie les notifications push sur l'appareil avant leur affichage, en changeant le texte, le titre et les pièces jointes multimédia
  • L'activation nécessite la clé mutable-content:1 dans le dictionnaire aps — sans elle, l'extension ne se lance pas
  • Le protocole principal UNNotificationServiceExtension définit les méthodes didReceive et serviceExtensionTimeWillExpire pour le traitement
  • L'extension peut télécharger des médias depuis le réseau, déchiffrer des charges utiles et ajouter jusqu'à 4 pièces jointes à la notification
  • Le temps d'exécution est limité à environ 30 secondes — si dépassé, iOS affiche la notification originale
  • Une stratégie de dégradation progressive avec repli à plusieurs niveaux est recommandée pour éviter les notifications vides

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.

Discuter du projet

Lisez aussi