Apple push notification certificate : .p8 ou .p12 avec Expo
Par Mehdi Azizi
Publié le , 8 min
Pour tes notifications push, Apple propose une clé .p8 sans expiration, valable pour toutes tes apps, ou un certificat .p12 annuel. Avec Expo, EAS gère la clé.
Le certificat push d'Apple autorise un serveur à envoyer des notifications à ton app par APNs, le service de notifications d'Apple. Il existe sous deux formes : un certificat .p12, valable un an et lié à une seule app, ou une clé .p8, qui n'expire pas et sert à toutes les apps de ton compte. Avec Expo, tu n'as pas besoin du certificat : EAS te propose de créer une clé .p8 au premier build, et le service push d'Expo s'en sert pour toi.
Le guide sur le certificat développeur et le provisioning profile évoque la clé push en quelques lignes. Ici, on va au bout : le choix entre les deux formats, les environnements sandbox et production, le renouvellement, et les pannes qui coupent les notifications en TestFlight.
Je publie mes apps avec Expo et EAS. Solys et TradaZen déclarent le plugin expo-notifications dans leur configuration : c'est lui qui prépare l'app à recevoir des notifications.
Pourquoi Apple demande un certificat ou une clé
Une notification push part d'un serveur, le tien ou celui d'Expo, qui la confie à APNs, qui la livre à l'iPhone. APNs doit donc vérifier que ce serveur a le droit d'écrire à ton app. Apple propose deux façons de le prouver.
- La connexion par jeton, avec une clé .p8. Selon Apple, elle est plus rapide, utilisable depuis plusieurs serveurs, et une même clé couvre toutes les apps de ton équipe ou une partie. Ton serveur signe avec elle un jeton, à refaire au moins toutes les heures.
- La connexion par certificat, avec un fichier .p12. Apple précise que ce certificat est lié à une seule app et valable un an. Plusieurs apps, plusieurs certificats.
La page d'Apple sur les expirations le rappelle : la clé de signature des jetons APNs n'expire jamais.
Le tableau .p8 / .p12
| Critère | Clé .p8 | Certificat .p12 |
|---|---|---|
| Durée | Pas d'expiration | Un an |
| Portée | Toutes tes apps | Une seule app |
| Environnement | Choisi à la création | Sandbox et production |
| Renouvellement | Aucun, sauf révocation | Chaque année |
| Téléchargement | Une seule fois | Export depuis le Mac |
| Nombre | Deux par environnement | Un par app |
| Usage avec Expo | Créée et gérée par EAS | Absent de la doc Expo |
Trois précisions. Le fichier .p8 ne se télécharge qu'une fois : Apple ne le garde pas dans ton compte. Le .p12, lui, s'exporte depuis le trousseau du Mac qui a créé le certificat. Et la limite de deux clés par environnement vaut pour les clés d'équipe. Pour les clés limitées à certaines apps, Apple en autorise jusqu'à 200 par environnement.
La page d'Expo sur les identifiants ne parle que de la clé push, et en compte deux par compte au maximum, sans distinguer les environnements ni les clés par app. Pour une app Expo, la clé .p8 est le bon choix.
Sandbox et production : deux environnements
APNs a deux serveurs : développement, aussi appelé sandbox, et production. Apple réserve le premier aux tests et le second aux apps publiées. L'app sait lequel utiliser grâce à l'entitlement aps-environment. Selon Apple, sa valeur suit le profil de signature : development avec un profil de développement, production avec un profil de distribution et pour TestFlight.
Un build TestFlight parle donc à la production, exactement comme l'App Store.
Côté Expo, deux détails. La documentation d'expo-notifications indique que l'entitlement est toujours écrit en development dans le projet, puis passé en production dans l'archive d'un build de release. Et à sa création, le jeton Expo est rattaché à l'environnement de l'app, détecté automatiquement : tu n'as rien à choisir à l'envoi.
Si tu crées la clé toi‑même, Apple te demande son environnement et sa portée : toute l'équipe ou certaines apps. Sa documentation pour développeurs décrit désormais des clés d'équipe limitées à la sandbox ou à la production, les anciennes clés valables partout restant acceptées. L'aide du compte, elle, affirme encore que la clé sert aux deux environnements. Apple se contredit : retiens l'environnement que tu choisis à la création. Une clé réservée à la sandbox ne servira ni à TestFlight ni à l'App Store.
Comment Expo gère la clé push
D'après le guide de configuration d'Expo, mis à jour le 28 juillet 2026, ton premier build de développement te propose de configurer les notifications push et de générer une clé APNs. Réponds oui aux deux. Sans EAS Build, lance eas credentials. Il te faut un compte Apple Developer payant.
Ensuite :
- EAS stocke la clé et l'associe à ton app. Selon Expo, une clé sert à autant d'apps que tu veux, et en téléverser une nouvelle ne change pas les jetons Expo Push de tes utilisateurs.
- Ton serveur n'appelle pas APNs. Il envoie au service push d'Expo, qui transmet à APNs. Expo te demande de lire les reçus environ 15 minutes après l'envoi : c'est là que s'affichent les erreurs.
- Le plugin pose l'entitlement. Déclare
expo-notificationsdansplugins:
{
"expo": {
"plugins": ["expo-notifications"]
}
}
Deux pièges. La FAQ d'Expo dit qu'Expo Go ne gère plus les notifications push depuis le SDK 53, alors que la page d'expo-notifications ne vise qu'Android. Dans les deux cas, Expo conseille un build de développement : teste avec lui. Et supprimer la clé avec eas credentials la retire des serveurs d'Expo, pas de ton compte Apple. Pour libérer une place, révoque-la dans le portail Apple. Comme tout secret, le fichier .p8 ne doit jamais finir dans ton dépôt : la règle est la même que pour les clés API d'une app Expo.
Renouveler : ce qui expire vraiment
La clé .p8 n'a rien à renouveler. Elle ne s'arrête que si tu la révoques. Si tu la crois compromise, Apple conseille de créer une nouvelle clé, de basculer dessus, puis seulement de révoquer l'ancienne. Pour remplacer la clé avec Expo, la FAQ donne la marche à suivre : eas credentials, iOS, ton profil de build, puis retrait de la clé push et génération d'une nouvelle.
Le certificat .p12 expire chaque année. Apple demande de le mettre à jour avant l'échéance et de surveiller sa date dans le trousseau. Une fois expiré ou révoqué, tu ne peux plus envoyer de notifications à ton app. Apple ne décrit pas de renouvellement à part : tu crées un nouveau certificat depuis l'identifiant de l'app, tu l'installes sur ton serveur avant l'échéance, puis tu retires l'ancien. Le meilleur renouvellement reste de passer à la clé.
Tu gères des iPhone avec Intune ou un autre outil de gestion de flotte ? Ce n'est pas le même certificat. Le certificat push de gestion des appareils se crée sur l'Apple Push Certificates Portal et se renouvelle chaque année. Apple conseille de noter le compte Apple utilisé : il servira au renouvellement.
Les pannes typiques et leur correction
Ça marche en développement, pas en TestFlight
- Tu envoies au mauvais jeton. Le build TestFlight s'inscrit en production et obtient un nouveau jeton. Un jeton issu de ton build de développement ne marche pas : Apple répond
BadDeviceTokenquand le jeton ne correspond pas à l'environnement. Récupère le jeton depuis l'app TestFlight elle‑même. - L'app de production n'a pas d'identifiants push. C'est le diagnostic de la FAQ d'Expo. Vérifie la page des identifiants du projet sur expo.dev, ou
eas credentials. - Ta clé est limitée à la sandbox. Remplace-la par une clé valable en production.
- L'iPhone n'obtient pas de jeton. Si tu as installé le build TestFlight par-dessus un build Xcode, Expo suggère de redémarrer l'appareil.
« No valid aps-environment entitlement string found »
Selon la FAQ d'Expo, cette erreur signale qu'aucune clé push n'est configurée pour ton projet iOS. Vérifie la page des identifiants, puis relance un build : EAS te propose alors de générer la clé. Vérifie aussi que expo-notifications figure bien dans plugins.
ITMS-90078 : Missing Push Notification Entitlement
Apple envoie cet e-mail après l'envoi : ton app semble s'inscrire à APNs, mais sa signature ne contient pas l'entitlement aps-environment. La note d'Expo sur le SDK 51 l'explique. Depuis ce SDK, l'entitlement n'est ajouté que si expo-notifications est installé. L'avertissement vient de deux contrôles d'Apple. Le premier compare les capacités de ton identifiant d'app aux entitlements de l'app. Le second repère dans le binaire une méthode d'inscription aux notifications, que le code d'Expo contient dans toutes les apps.
C'est un avertissement, pas un refus, précise Expo. Si tu utilises les notifications, ajoute le plugin et refais un build : EAS synchronise les capacités de l'identifiant d'app à chaque build. Sinon, retire la capacité Push Notifications de ton identifiant dans le portail Apple. L'avertissement peut persister, sans conséquence.
InvalidCredentials ou toutes les apps muettes d'un coup
InvalidCredentials dans un reçu veut dire que tes identifiants push ne sont plus valides, souvent parce que la clé a été révoquée. Toutes les apps qui l'utilisaient se taisent en même temps. La correction d'Expo : eas credentials, puis une nouvelle clé. Si le reçu mentionne InvalidProviderToken, Expo conseille de refaire un build en régénérant la clé push et le profil.
Avant d'activer les notifications
Pour tester les notifications sur ton iPhone avant la sortie, suis TestFlight pour tester ton app. Si tu envoies des notifications silencieuses pour réveiller l'app, relis la guideline 2.5.4 sur les modes d'arrière-plan. Toute la chaîne, sans Mac, est dans publier une app iOS sans Mac, et les étapes de la sortie sur la page publier une application sur l'App Store.
Avant ton premier envoi, fais le diagnostic gratuit : il te dit ce qui bloque dans ton projet et t'envoie ma checklist anti-refus Apple. Pour construire l'app, brancher les abonnements et la publier, le Kit iOS suit le parcours en quatre étapes avec le code de départ de mes apps, à ton rythme.
Questions fréquentes
Le certificat push Apple expire-t-il ?
Le certificat .p12 expire au bout d'un an, et tes notifications s'arrêtent s'il n'est pas remplacé. La clé .p8 n'expire jamais : elle ne s'arrête que si tu la révoques. C'est la raison principale de préférer la clé.
Faut-il un certificat push par app ?
Avec un certificat .p12, oui : chaque certificat est lié à une seule app. Une clé .p8 sert à toutes les apps de ton compte. Avec Expo, une seule clé peut donc couvrir tout ton catalogue.
Comment renouveler un certificat push Apple ?
Crée un nouveau certificat depuis l'identifiant de ton app, avec une nouvelle demande de signature, installe-le sur ton serveur, puis retire l'ancien. Fais-le avant l'échéance. Le plus simple reste de passer à une clé .p8, qui ne se renouvelle pas.
J'ai perdu mon fichier .p8, que faire ?
Apple ne permet de le télécharger qu'une fois. Si EAS a créé la clé, Expo la garde et tes notifications continuent. Sinon, crée une nouvelle clé, ajoute-la avec eas credentials, puis révoque l'ancienne dans le portail Apple. Les jetons Expo Push de tes utilisateurs ne changent pas.
Faut-il refaire un build après avoir changé de clé push ?
En général, non. La clé sert au serveur qui envoie, pas à l'app installée, et Expo indique qu'une nouvelle clé ne change pas les jetons. Exception : si les reçus signalent InvalidProviderToken, Expo conseille de refaire un build avec une nouvelle clé et un nouveau profil.

