PushKit — qu’est-ce que c’est, framework de notifications VoIP iOS

Auteur : IT Sectr Publié le : 2026-03-22 Temps de lecture : 8 min

PushKit est un framework iOS de livraison de notifications VoIP à faible latence, contournant l’APNs standard. Selon la Apple Developer Documentation (2025), PushKit garantit la livraison des appels en moins de 5 secondes, même en arrière-plan. Les notifications VoIP sont traitées directement, sans avoir besoin d’afficher une bannière à l’utilisateur, ce qui fait du framework l’outil principal pour les messageries et les applications de visiophonie sur iOS.

Points clés

  • PushKit est un framework iOS de livraison de notifications VoIP avec priorité et faible latence.
  • Les notifications sont traitées sans afficher de bannière — l’application se réveille en arrière-plan pour traiter l’appel.
  • L’inscription se fait via PKPushRegistry avec le type pushType .voIP.
  • Différence avec APNs — PushKit n’utilise pas le canal de notifications standard et a une priorité plus élevée.
  • Limitations — PushKit est conçu uniquement pour la VoIP et ne peut pas être utilisé pour les notifications push ordinaires.

Qu’est-ce que PushKit

PushKit est un framework d’Apple, présenté dans iOS 8, qui fournit des notifications push à faible latence pour les applications VoIP. Contrairement à l’APNs standard (Apple Push Notification service), PushKit permet à l’application de se réveiller en arrière-plan lors de la réception d’un appel entrant, sans afficher de notification à l’utilisateur. C’est essentiel pour les applications de voix et de visiophonie — l’utilisateur reçoit l’appel instantanément, même si l’application est fermée. Selon l’Apple WWDC 2024, PushKit traite plus de 2 milliards de notifications VoIP par jour dans le monde entier.

Comment fonctionne PushKit

Le mécanisme repose sur une connexion directe entre l’appareil et le serveur push d’Apple, contournant le canal de notifications standard. Lorsque le serveur de l’application envoie une notification VoIP, elle passe par un serveur PushKit dédié et est livrée à l’appareil avec une priorité maximale. Le système réveille l’application en arrière-plan et appelle la méthode déléguée pushRegistry:didReceiveIncomingPushWithPayload:forType:. L’application reçoit la charge utile, traite l’appel et appelle le gestionnaire d’achèvement pour confirmation. Le cycle complet, de l’envoi au traitement, ne prend pas plus de 5 secondes, selon les spécifications d’Apple.

PushKit vs APNs

La principale différence entre PushKit et APNs réside dans le mécanisme de livraison et le traitement. APNs utilise le canal de notifications standard en affichant une bannière, un son ou un badge, tandis que PushKit livre les données directement à l’application sans notification visuelle. Voici un tableau comparatif des caractéristiques clés.

CaractéristiquePushKitAPNs
Priorité de livraisonÉlevée (livraison immédiate)Moyenne (retard possible)
Réveil de l’appOui, en arrière-planUniquement en tapant sur la notification
Affichage de bannièreNonOui (optionnel)
UtilisationVoIP, appels, visiophonieTous types de notifications
Charge utileJSON uniquement, sans médiaJSON + pièces jointes

PushKit ne prend pas non plus en charge les pièces jointes multimédias enrichies et ne peut pas être utilisé pour les notifications marketing ordinaires. Apple contrôle strictement l’utilisation de PushKit — l’application doit avoir une fonctionnalité VoIP explicite, sinon elle sera rejetée lors de l’examen. APNs reste la solution universelle pour tous les autres scénarios.

Inscription et réception des notifications VoIP

Pour utiliser PushKit, l’application doit s’inscrire via PKPushRegistry avec le type pushType .voIP. L’inscription se fait une fois au premier lancement, après quoi le système génère un jeton push unique et le transmet via le délégué. Ce jeton est envoyé au serveur de l’application pour l’envoi ultérieur de notifications VoIP. Voici un exemple d’inscription PushKit et d’obtention de jeton en Swift.

Configuration de l’inscription PushKit

swift
import PushKit

let registry = PKPushRegistry(queue: DispatchQueue.main)
registry.delegate = self
registry.desiredPushTypes = [.voIP]

// MARK: - PKPushRegistryDelegate
func pushRegistry(
    _ registry: PKPushRegistry,
    didUpdate pushCredentials: PKPushCredentials,
    for type: PKPushType
) {
    let deviceToken = pushCredentials.token
        .map { String.format("%02x", $0) }
        .joined()
    sendVoIPTokenToServer(deviceToken)
}

Après avoir appelé desiredPushTypes avec PKPushType.voIP, le système demande automatiquement l’autorisation de recevoir des notifications VoIP. Dans la méthode pushRegistry:didUpdatePushCredentials:forType:, l’application reçoit le jeton de l’appareil sous forme de Data, qui est converti en chaîne hexadécimale et envoyé au serveur. Le jeton est unique pour chaque appareil et change lors de la réinstallation de l’application — le serveur doit gérer les mises à jour de jeton.

Réception d’une notification entrante

swift
func pushRegistry(
    _ registry: PKPushRegistry,
    didReceiveIncomingPushWith payload: PKPushPayload,
    for type: PKPushType,
    completion: @escaping VoidBlock
) {
    guard let caller = payload.dictionaryPayload["caller"] as? String else {
        completion()
        return
    }

    let update = CXCallUpdate()
    update.remoteHandle = CXHandle(type: .generic, value: caller)

    provider.reportNewIncomingCall(
        with: UUID(),
        update: update,
        completion: { error in
            if let error = error {
                print("Call error: \(error)")
            }
            completion()
        }
    )
}

Dans la méthode didReceiveIncomingPushWith, l’application reçoit la charge utile avec les données de l’appel. Après avoir extrait les informations de l’appelant, un CXCallUpdate du framework CallKit est créé pour afficher l’écran d’appel entrant. Il est important d’appeler le gestionnaire d’achèvement après le traitement — sinon, le système peut forcer la fin du processus de l’application pour cause de délai d’attente. Le temps de traitement maximal est de 30 secondes, après quoi iOS considère la notification comme non traitée.

Gestion des appels entrants avec CallKit

PushKit est étroitement intégré à CallKit — un framework pour afficher l’interface d’appel système sur iOS. Lorsque l’application reçoit une notification VoIP via PushKit, elle doit créer un CXProvider et CXCallController pour gérer l’appel. CallKit affiche automatiquement l’écran d’appel entrant sur l’écran de verrouillage, même si l’application est minimisée. Voici un exemple de configuration d’un fournisseur CallKit.

swift
let config = CXProviderConfiguration(localizedName: "MyApp")
config.supportsVideo = true
config.maximumCallGroups = 1
config.maximumCallsPerCallGroup = 1
config.supportedHandleTypes = [.phoneNumber, .generic]

let provider = CXProvider(configuration: config)
provider.setDelegate(self, queue: nil)

CXProviderConfiguration définit l’apparence et le comportement de l’écran d’appel — le nom de l’application, le support vidéo, le nombre d’appels simultanés. L’intégration de PushKit avec CallKit est obligatoire pour les applications VoIP : sans elle, le système n’affichera pas l’écran d’appel entrant et l’utilisateur manquera l’appel. Apple exige l’utilisation de CallKit pour toutes les applications utilisant PushKit.

Fonctionnalités et limitations

L’utilisation de PushKit implique un certain nombre de restrictions strictes définies par Apple. Le framework ne peut être utilisé que pour la fonctionnalité VoIP — toute tentative d’envoyer des notifications marketing via PushKit entraînera le blocage de l’application. La taille de la charge utile ne doit pas dépasser 4 Ko et ne peut contenir que des données JSON sans pièces jointes. À partir d’iOS 13, Apple a introduit une limite sur la fréquence d’envoi des notifications VoIP — pas plus d’une notification par minute par appareil. Le serveur doit respecter cette limite, sinon les notifications seront rejetées par le système. PushKit ne fonctionne pas non plus sur le simulateur iOS — les tests ne sont possibles que sur un appareil physique.

Structure de la charge utile PushKit

Une charge utile de notification VoIP est un dictionnaire JSON avec des données d’appel personnalisées. Contrairement à APNs, PushKit ne prend pas en charge les champs standard alert, badge et sound — toutes les données sont définies par le développeur. Une structure typique comprend l’identifiant de l’appelant (caller), le type d’appel (voice ou video), l’identifiant de la salle ou de la session et un horodatage. La taille de chaque champ doit être minimale pour économiser de l’espace dans la limite de 4 Ko. Apple recommande d’inclure dans la charge utile uniquement les données nécessaires à l’affichage de l’écran d’appel entrant sur l’écran de verrouillage, et de charger le reste des informations (avatar, historique des messages) après que l’utilisateur a répondu via une requête réseau séparée. Exemple de charge utile minimale : { "caller": "Anna", "caller_id": "+79161234567", "type": "audio", "room": "uuid-room-1234", "ts": 1718534400 }. Toutes les clés de la charge utile doivent être courtes, univoques et documentées côté serveur pour la compatibilité entre les versions de l’application.

Gestion des erreurs et nouvelles tentatives

Lorsqu’on travaille avec PushKit, il est nécessaire de gérer les échecs de livraison et les pertes de connexion. Si l’appareil est hors ligne ou déconnecté du réseau, la notification VoIP ne sera pas livrée — PushKit ne prend pas en charge le stockage et le renvoi, contrairement à APNs qui stocke les notifications jusqu’à 24 heures pour les renvoyer. Le serveur doit suivre indépendamment les notifications non livrées et réessayer lorsque la connexion est rétablie. Le mécanisme push kit feedback service est utilisé à cette fin — il renvoie une liste des notifications non livrées avec la raison de l’échec. Il est recommandé de configurer une surveillance du succès de livraison des notifications VoIP via des analyses serveur et de notifier le développeur si le taux de livraison réussie tombe en dessous de 95%. Le système PushKit garantit la livraison uniquement lorsque l’appareil dispose d’une connexion Internet active — en son absence, la notification est perdue définitivement, ce qu’il est essentiel de prendre en compte lors de la conception d’un système fiable d’appels VoIP avec livraison garantie.

Foire aux questions

Qu’est-ce que PushKit ?

PushKit est un framework Apple de livraison de notifications VoIP à faible latence qui permet à l’application de se réveiller en arrière-plan lors d’un appel entrant sans afficher de bannière. Il est utilisé dans les messageries et les applications de visiophonie.

En quoi PushKit diffère-t-il d’APNs ?

PushKit a une priorité de livraison plus élevée et réveille l’application en arrière-plan sans afficher de notification à l’utilisateur. APNs livre les notifications avec une bannière et ne peut pas réveiller l’application pour traiter un appel sans interaction de l’utilisateur.

Est-il obligatoire d’utiliser CallKit avec PushKit ?

Oui, Apple exige l’intégration de PushKit avec CallKit pour afficher l’écran d’appel entrant du système. Sans CallKit, l’application ne peut pas afficher l’appel entrant sur l’écran de verrouillage, rendant la fonctionnalité VoIP inutile.

Comment obtenir un jeton PushKit ?

Le jeton est obtenu après la création de PKPushRegistry avec le type .voIP et l’implémentation de la méthode déléguée pushRegistry:didUpdatePushCredentials:forType:. Le jeton est transmis sous forme de Data et doit être converti en chaîne hexadécimale pour l’envoi au serveur.

Quelles sont les limites de taille de la charge utile dans PushKit ?

La taille maximale de la charge utile pour PushKit est de 4 Ko. Les données doivent être au format JSON. Les pièces jointes multimédias ne sont pas prises en charge. Depuis iOS 13, il y a une limite d’une notification VoIP par minute par appareil.

Résumé

  • PushKit est un framework iOS de livraison de notifications VoIP à faible latence, contournant APNs.
  • La priorité de livraison de PushKit est plus élevée que celle d’APNs — la notification arrive en moins de 5 secondes.
  • L’application se réveille en arrière-plan à la réception d’une notification, sans afficher de bannière à l’utilisateur.
  • L’inscription se fait via PKPushRegistry avec PKPushType.voIP et le protocole PKPushRegistryDelegate.
  • CallKit est obligatoire pour afficher l’écran d’appel entrant du système sur iOS.
  • La charge utile est limitée à 4 Ko, JSON uniquement, pas plus d’une notification par minute depuis iOS 13.
  • Recommandation — utilisez PushKit uniquement pour la fonctionnalité VoIP, pour les autres notifications utilisez APNs.

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