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 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.
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.
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éristique | PushKit | APNs |
|---|---|---|
| Priorité de livraison | Élevée (livraison immédiate) | Moyenne (retard possible) |
| Réveil de l’app | Oui, en arrière-plan | Uniquement en tapant sur la notification |
| Affichage de bannière | Non | Oui (optionnel) |
| Utilisation | VoIP, appels, visiophonie | Tous types de notifications |
| Charge utile | JSON uniquement, sans média | JSON + 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.
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.
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.
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.
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.
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.
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.
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.
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
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.
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.
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.
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.
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é
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