Device Token : fonctionnement, obtention du jeton APNS et mise à jour

Auteur : IT Sectr Publié le : 2026-03-21 Temps de lecture : 11 min

Device Token est un identifiant unique qu’APNS attribue à chaque appareil iOS pour acheminer les notifications push. Le jeton est généré par le système lors de l’inscription de l’application pour recevoir des notifications et doit être transmis au serveur pour envoyer des notifications push à cet appareil spécifiquement. Selon la Documentation développeur Apple, 2026, le Device Token peut changer lors de la réinstallation de l’application, de la restauration de l’appareil à partir d’une sauvegarde ou d’une mise à jour d’iOS. Par conséquent, le serveur doit régulièrement mettre à jour les jetons pour garantir la livraison.

Points clés

  • Unicité — Device Token est unique pour chaque couple application-appareil dans un environnement APNS spécifique (sandbox/production).
  • Impermanence — le jeton peut changer lors de la réinstallation de l’application, de la restauration à partir d’une sauvegarde ou d’une mise à jour d’iOS ; un mécanisme de mise à jour est nécessaire sur le serveur.
  • Inscription — l’application demande l’autorisation de notification via UNUserNotificationCenter, après quoi le système renvoie le Device Token dans le délégué AppDelegate.
  • APNS Sandbox vs Production — pour le développement, l’environnement sandbox d’APNS est utilisé avec un certificat séparé ; les jetons de production sont différents et ne sont acceptés que par l’APNS de production.
  • Format du jeton — une chaîne hexadécimale de 32 octets qui est envoyée au serveur et utilisée dans l’en-tête apns-topic lors de l’envoi de notifications push.

Qu’est-ce qu’un Device Token

Device Token (jeton d’appareil) est un identifiant unique sous forme de chaîne hexadécimale qu’APNS (Apple Push Notification Service) génère pour chaque application sur un appareil iOS. Le jeton est la clé par laquelle le serveur envoie des notifications push à un appareil spécifique. Sans Device Token valide, le serveur ne peut pas livrer les notifications push — APNS rejette la requête avec une erreur 400 BadRequest.

Comment le jeton est formé

Le Device Token est créé par le système iOS lors du premier contact de l’application avec APNS après l’installation. Le processus de génération implique une liaison cryptographique avec le bundle ID de l’application et l’identifiant unique de l’appareil (UID), après quoi APNS renvoie à l’application un jeton de 32 octets au format hexadécimal (64 caractères). Le jeton n’est pas permanent — le système peut en générer un nouveau sous certaines conditions.

Rôle du jeton dans la livraison des notifications push

Lorsque le serveur envoie une notification push, il inclut le Device Token dans la requête HTTP/2 à APNS. APNS valide le jeton : si le jeton appartient à un autre environnement (sandbox au lieu de production), a expiré ou a été révoqué, le serveur Apple renvoie une erreur 410 Gone ou 400 BadRequest. Ce n’est qu’après une validation réussie du jeton qu’APNS commence à livrer la notification à l’appareil.

Différence entre Device Token et autres identifiants

Device Token ne doit pas être confondu avec IDFA (Identifier for Advertisers), IDFV (Identifier for Vendor) ou UID (Unique Device Identifier). IDFA et IDFV sont utilisés pour la publicité et les analyses, UID est un numéro de série matériel. Device Token existe exclusivement pour les notifications push et ne divulgue pas d’informations sur l’utilisateur ou l’appareil en dehors d’APNS.

IdentifiantObjectifPermanence
Device TokenAcheminement des notifications push APNSPeut changer
IDFAPublicité et suiviPeut être réinitialisé par l’utilisateur
IDFVIdentification du fournisseur (analyses)Permanent pour les applications du même développeur
Bundle IDIdentifiant unique de l’applicationPermanent

Comment l’appareil obtient et enregistre le jeton

Le processus d’obtention d’un Device Token comprend plusieurs étapes obligatoires, de la demande d’autorisation à l’utilisateur jusqu’à l’envoi du jeton au serveur. Chaque étape est critique — en sauter une rend impossible l’envoi de notifications push à l’appareil.

Demande d’autorisation de notification

La première étape consiste pour l’application à demander à l’utilisateur l’autorisation d’envoyer des notifications via UNUserNotificationCenter.current().requestAuthorization. L’utilisateur peut accepter, refuser ou sélectionner des options facultatives (alerte, badge, son). Sans consentement explicite de l’utilisateur, le système n’émettra pas de Device Token, même si l’application appelle registerForRemoteNotifications. Après avoir obtenu l’autorisation, l’application appelle UIApplication.shared.registerForRemoteNotifications(), ce qui lance le processus d’inscription auprès d’APNS.

Obtention du jeton auprès d’APNS

Après l’inscription, APNS renvoie le jeton via le délégué AppDelegate : application(_:didRegisterForRemoteNotificationsWithDeviceToken:). Un appel réussi contient un objet Data avec le jeton, qui doit être converti en chaîne hexadécimale pour la transmission au serveur. En cas d’erreur, le système appelle application(_:didFailToRegisterForRemoteNotificationsWithError:) avec une description du problème : configuration de certificat incorrecte, indisponibilité du réseau ou configuration de projet incorrecte.

Envoi du jeton à votre serveur

Après avoir reçu le jeton, l’application doit l’envoyer immédiatement à son serveur pour le stocker dans la base de données. La requête API inclut le jeton, l’identifiant de l’appareil (pour le mappage), l’environnement (sandbox/production) et éventuellement des données supplémentaires : version de l’OS, modèle de l’appareil, langue. Il est recommandé de renvoyer le jeton à chaque lancement de l’application afin que le serveur ait toujours un jeton à jour.

swift
// Demander l’autorisation et s’inscrire auprès d’APNS
func registerForPushNotifications() {
    UNUserNotificationCenter.current()
        .requestAuthorization(options: [.alert, .sound, .badge]) {
        [weak self] granted, error in
        guard granted else {
            print("Autorisation non accordée")
            return
        }
        DispatchQueue.main.async {
            UIApplication.shared
                .registerForRemoteNotifications()
        }
    }
}

// Obtenir le Device Token d’APNS
func application(
    _ application: UIApplication,
    didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data
) {
    let tokenString = deviceToken
        .map { String(format: "%02.2hhx", $0) }
        .joined()
    print("Device Token : \(tokenString)")

    // Envoyer le jeton au serveur
    PushTokenService.shared
        .sendTokenToServer(tokenString) { success in
        if success {
            UserDefaults.standard.set(tokenString,
                forKey: "lastDeviceToken")
        }
    }
}

Gestion des jetons côté serveur

Le côté serveur du système push doit stocker le Device Token dans la base de données, associé à l’utilisateur et à l’environnement. Lors de l’envoi d’une notification, le serveur forme une requête à APNS, incluant le jeton dans l’URL et un jeton JWT (ou certificat) pour l’autorisation. Une gestion correcte des jetons affecte de manière critique le taux de livraison des notifications push.

Structure de la base de données des jetons

La table des jetons sur le serveur doit contenir au minimum : Device Token (unique), ID utilisateur, environnement (sandbox/production), date de dernière mise à jour et statut (actif/inactif). Il est recommandé d’ajouter un index sur le jeton pour une recherche rapide lors de l’envoi et sur l’utilisateur pour obtenir la liste de tous les appareils d’un utilisateur. De nombreuses applications permettent à un utilisateur d’avoir plusieurs appareils — chacun avec son propre jeton.

Autorisation des requêtes à APNS

Pour envoyer une notification push, le serveur doit autoriser la requête à APNS de deux manières. Basée sur certificat utilise un certificat SSL généré dans Apple Developer Console. Basée sur jeton utilise un JWT (JSON Web Token) avec une clé .p8 valide jusqu’à 30 jours sans nécessité de renouveler le certificat. L’autorisation basée sur jeton est considérée comme plus moderne et est recommandée par Apple pour les nouveaux projets.

Formation d’une requête HTTP/2 APNS

La requête à APNS inclut la méthode HTTP/2 POST, une URL avec le chemin /3/device/{device_token}, des en-têtes d’autorisation et un corps JSON avec la charge utile. L’en-tête apns-topic doit contenir le bundle ID de l’application. apns-priority indique la priorité de livraison (5 — immédiatement, 10 — avec économie de batterie). apns-expiration définit le temps en secondes depuis l’époque jusqu’auquel APNS tentera de livrer la notification.

js
// Exemple d’envoi de push sur Node.js via APNS HTTP/2
const http2 = require('http2');
const client = http2.connect('https://api.push.apple.com');

const deviceToken = 'abcdef0123456789...';
const payload = JSON.stringify({
    "aps": { "alert": "Hello!", "sound": "default" }
});

const req = client.request({
    ':method': 'POST',
    ':path': `/3/device/${deviceToken}`,
    'apns-topic': 'com.example.app',
    'apns-priority': '10',
    'apns-expiration': '0',
    'authorization': `bearer ${jwtToken}`
});
req.write(payload);
req.end();
req.on('response', (headers) => {
    if (headers[':status'] === '200') {
        console.log('Push envoyé avec succès');
    }
});

Envoi par lots et limitation de débit

Lors de l’envoi de notifications push à un grand nombre d’appareils, utilisez l’envoi par lots avec contrôle de débit. APNS recommande de ne pas dépasser 1500 requêtes par seconde par connexion. En cas de dépassement de la limite, le serveur Apple renvoie une erreur 429 Too Many Requests. Pour les campagnes à grande échelle, utilisez plusieurs connexions et répartissez la charge uniformément entre les appareils.

Mise à jour et invalidation des jetons

Device Token n’est pas permanent et peut changer dans plusieurs scénarios, ce qui nécessite un mécanisme de mise à jour sur le serveur. Si le serveur continue d’envoyer des notifications push à un jeton obsolète, APNS renvoie une erreur 410 Gone, indiquant que le jeton n’est plus valide pour l’environnement donné.

Quand le jeton change

Apple documente plusieurs scénarios dans lesquels le Device Token change : l’utilisateur réinstalle l’application, restaure l’appareil à partir d’une sauvegarde iCloud, installe une nouvelle version d’iOS ou réinitialise les paramètres réseau ou de confidentialité. Dans chaque cas, l’application recevra un nouveau jeton d’APNS lors de son prochain lancement. Le serveur doit mettre à jour le jeton dans la base de données, en supprimant l’ancien et en enregistrant le nouveau.

Traitement de l’erreur 410 Gone d’APNS

Lorsque le serveur envoie une notification push à un jeton obsolète, APNS renvoie HTTP 410 avec l’en-tête apns-unless-timestamp. Cet en-tête indique l’heure à partir de laquelle le jeton est devenu invalide. Le serveur doit immédiatement supprimer ou désactiver ce jeton dans la base de données pour éviter de lui renvoyer des notifications. Ignorer l’erreur 410 gaspille des ressources et réduit le taux de délivrabilité.

Nettoyage périodique des jetons inactifs

Pour maintenir la base de données de jetons à jour, il est recommandé d’effectuer un nettoyage périodique. Le script de nettoyage analyse les journaux APNS des N derniers jours, trouve tous les jetons ayant reçu une erreur 410 et les désactive dans la base de données. De plus, les jetons sans activité utilisateur depuis plus de 90 jours peuvent être supprimés — ce sont des enregistrements inutiles qui ne font qu’augmenter la taille de la base de données.

Validation des jetons avant envoi massif

Avant l’envoi massif de notifications push (newsletters, campagnes promotionnelles), il est recommandé de pré-valider les jetons. APNS ne fournit pas d’API directe pour la validation par lots des jetons. La stratégie utilisée consiste donc à envoyer un push de test avec une faible priorité et à analyser les erreurs. Les jetons qui renvoient une erreur 410 sont exclus de l’envoi principal.

Exemple de code pour obtenir un Device Token

Parcourons le cycle complet d’obtention d’un Device Token en Swift, y compris la gestion des erreurs et l’envoi au serveur. Le code couvre la demande d’autorisation, l’inscription auprès d’APNS, la conversion de Data en chaîne hexadécimale, la gestion des erreurs et l’envoi du jeton à votre propre serveur avec des tentatives de réessai en cas d’échec.

swift
import UIKit
import UserNotifications

final class PushNotificationManager: NSObject {

    static let shared = PushNotificationManager()
    private let apiClient = APIClient()
    private var currentToken: String?

    func register() {
        UNUserNotificationCenter.current()
            .requestAuthorization(
                options: [.alert, .badge, .sound]) {
            [weak self] granted, error in
            guard granted else {
                Analytics.log(
                    "Push permission denied")
                return
            }
            DispatchQueue.main.async {
                UIApplication.shared
                    .registerForRemoteNotifications()
            }
        }
    }

    func handleDeviceToken(_ tokenData: Data) {
        let token = tokenData
            .map { String(format: "%02.2hhx", $0) }
            .joined()

        guard token != currentToken else { return }
        currentToken = token
        sendTokenToServer(token)
    }

    func handleRegistrationError(_ error: Error) {
        Analytics.log(
            "Push registration failed: \(error)")

        // Réessayer après un délai en cas d’erreurs réseau
        if let urlError = error as? URLError,
            urlError.code == .notConnectedToInternet {
            DispatchQueue.main.asyncAfter(
                deadline: .now() + 10) { [weak self] in
                self?.register()
            }
        }
    }

    private func sendTokenToServer(_ token: String) {
        let body = PushTokenRequest(
            token: token,
            environment: Environment.current == .debug
                ? "sandbox" : "production",
            osVersion: UIDevice.current.systemVersion,
            locale: Locale.current.identifier
        )
        apiClient.sendToken(body) { [weak self] result in
            if case .success = result {
                self?.currentToken = token
            }
        }
    }
}

Gestion des erreurs lors de l’inscription

Les erreurs lors de l’inscription à APNS peuvent être causées par diverses raisons. Les plus courantes incluent l’indisponibilité du réseau, une configuration de certificat incorrecte dans Xcode (par exemple, la capacité Push Notifications désactivée), l’utilisation du simulateur (qui ne prend pas en charge les push) ou un profil de provisionnement incorrect. En production, il est important de journaliser les erreurs et, si possible, de répéter l’inscription au prochain lancement de l’application.

Test du Device Token sur le simulateur

Le simulateur iOS ne prend pas en charge la réception d’un vrai Device Token. Pour tester l’inscription sur le simulateur, utilisez des vérifications d’architecture i386 : dans une compilation de débogage, vous pouvez simuler la réception du jeton ou utiliser des tests d’interface utilisateur avec des objets simulés. Les tests réels de notifications push sont toujours effectués sur un appareil physique connecté à Xcode.

Foire aux questions

Le Device Token d’un même utilisateur peut-il changer ?

Oui, le Device Token peut changer lors de la réinstallation de l’application, de la restauration de l’appareil à partir d’une sauvegarde ou d’une mise à jour d’iOS. Le serveur doit gérer les mises à jour de jetons : lors de la réception d’un nouveau jeton d’un appareil connu, remplacer l’ancien ; en cas d’erreur 410, supprimer le jeton de la base de données.

Quel est le format d’un Device Token ?

Un Device Token est une chaîne hexadécimale de 32 octets et de 64 caractères en minuscules (0–9, a–f). Exemple : «a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2». Le jeton est transmis en tant que Data depuis APNS et converti en chaîne côté application.

Quelle est la différence entre un jeton sandbox et un jeton de production ?

Un jeton sandbox est délivré pour les applications compilées avec un profil de provisionnement de développement et fonctionne uniquement avec api.sandbox.push.apple.com. Un jeton de production est destiné à l’App Store et à TestFlight et fonctionne avec api.push.apple.com. Le serveur doit faire la distinction entre les environnements et envoyer les notifications push au point de terminaison APNS approprié.

Que doit faire le serveur s’il reçoit une erreur 410 d’APNS ?

Une erreur 410 Gone signifie que le Device Token est invalide. Le serveur doit immédiatement supprimer ce jeton de la base de données et cesser d’essayer de lui envoyer des notifications. L’en-tête apns-unless-timestamp dans la réponse indique depuis quand le jeton a cessé de fonctionner.

Comment vérifier que l’application a reçu un Device Token ?

Vérifiez la méthode déléguée application(_:didRegisterForRemoteNotificationsWithDeviceToken:) dans AppDelegate. Si la méthode est appelée, le jeton a été reçu. Utilisez les journaux de débogage ou OSLog pour afficher le jeton dans la console Xcode. Sur un appareil physique, vérifiez que le jeton est envoyé au serveur à l’aide de Network Link Conditioner.

Résumé

  • Device Token — un identifiant hexadécimal unique de 64 caractères pour un appareil dans APNS, nécessaire pour acheminer les notifications push.
  • Obtention du jeton — le processus comprend la demande d’autorisation à l’utilisateur, l’inscription à APNS via registerForRemoteNotifications et le traitement dans AppDelegate.
  • Le jeton n’est pas permanent — il peut changer lors de la réinstallation de l’application, de la restauration à partir d’une sauvegarde ou d’une mise à jour d’iOS ; un mécanisme de mise à jour est nécessaire sur le serveur.
  • Sandbox vs Production — différents environnements APNS utilisent différents jetons et points de terminaison ; le serveur doit déterminer correctement l’environnement lors de l’envoi.
  • Gestion sur le serveur — les jetons sont stockés dans la base de données liés à l’utilisateur, à l’environnement et au statut ; une erreur 410 Gone signale l’invalidité du jeton.
  • Autorisation APNS — le serveur utilise un jeton JWT ou un certificat SSL pour authentifier les requêtes ; JWT est recommandé par Apple pour les nouveaux projets.
  • Device Token — un composant fondamental de l’infrastructure push, dont dépend la livraison de chaque notification, depuis la bonne obtention et le stockage.

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