Tester l’envoi de notifications depuis votre Mac

Dans le cadre du développement d’une application iOS il est assez courant de devoir envoyer des notifications push. Cela nécessite la création d’une clé qui servira au chiffrement d’un JWT servant à authentifier la requête lors de l’envoi à Apple. Il peut parfois être nécessaire de tester que votre clé est bien acceptée par Apple et que votre application est bien configurée pour les recevoir etc.

Nous allons donc voir comment faire vous-même l’envoi de la requête à Apple via cURL afin de tester que tout fonctionne bien.

Pré-requis

Afin de pouvoir suivre le petit tuto qui suit mais surtout afin de pouvoir faire l’envoi de la requête à la fin, assurez-vous d’avoir complété ce qui suit :

  • Implémenter le code lié aux notifications (demande d’acceptation des notifications et méthodes de delegate pour recevoir le token de l’appareil)
  • Créer une clé .p8 sur developer.apple.com pour signer le JWT d’authentification de la requête (Documentation d’Apple)
  • Connaître l’ID de la clé .p8 créée précédemment
  • Connaître l’ID de son équipe (le Team ID)
  • Connaître le bundleID de l’app à laquelle vous souhaitez envoyer les notifications
  • Récupérer le token de l’appareil sur lequel vous souhaitez envoyer les notifications

JSON

Créez un fichier header.json avec le contenu suivant :

{
   "alg" : "ES256",
   "kid" : “PUSH_NOTIF_KEY_ID”
}
  • alg (algorithm) correspond à l’algorithme utilisé pour signer le JWT
  • kid (key-id) est l’ID de la clé utilisée pour le chiffrement de la signature (votre clé p8)

Créez un fichier payload.json avec le contenu suivant (https://www.epochconverter.com) :

{
   "iss": “TEAM_ID”,
   "iat": EPOCH_TIME
}
  • iss (issuer) est l’émetteur du JWT (votre ID d’équipe)
  • iat (issued at) est la date et heure de création du JWT au format epoch

JWT

Header

Ouvrez le terminal et saisissez la commande suivante afin d’encoder en base64 le contenu du fichier header.json qui constituera le header de votre futur JWT (en remplaçant le chemin vers le fichier si besoin) :

cat Desktop/header.json | openssl enc -base64 -A

Cela devrait vous donner une chaîne de caractères telle que ewogICAiYWxnIiA6ICJFUzI1NiIsCiAgICJraWQiIDogIlBVU0hfTk9USUZfS0VZX0lEIgp9Cg==

Body

Répétez la commande mais pour le fichier payload.json qui formera le body du JWT :

cat Desktop/payload.json | openssl enc -base64 -A

À nouveau vous devriez récupérer une chaîne de caractères telle que ewogICAiaXNzIjogIlRFQU1fSUQiLAogICAiaWF0IjogMTE2ODMzMjA2MAp9Cg==

Vous pouvez maintenant réunir les 2 chaînes de caractères récupérées avec un point entre les deux : ewogICAiYWxnIiA6ICJFUzI1NiIsCiAgICJraWQiIDogIlBVU0hfTk9USUZfS0VZX0lEIgp9Cg==.ewogICAiaXNzIjogIlRFQU1fSUQiLAogICAiaWF0IjogMTE2ODMzMjA2MAp9Cg==

Signature

Nous allons maintenant chiffrer cette nouvelle chaîne de caractères (constituée des 2 précédentes) afin de créer la signature du JWT. Pour cela, utilisez la commande suivante en prenant soin d’indiquer le bon chemin vers le fichier de votre clé p8 :

echo -n “ewogICAiaXNzIjogIlRFQU1fSUQiLAogICAiaWF0IjogMTE2ODMzNTY2MAp9Cg==.ewogICAiaXNzIjogIlRFQU1fSUQiLAogICAiaWF0IjogMTE2ODMzMjA2MAp9Cg==” | openssl dgst -sha256 -sign Desktop/push_key.p8 | openssl enc -base64 -A

Cela devrait vous donner un résultat ressemblant tel que celui-ci : MEUCICzXD/WcIMFwVHd2wax1TODp5CtnbBVHNSvKjdGcLGvzAiEAlnfQN2/05xlhTQPIK9wn5tb6GYBWHIgVaVFzp4655ak=

Concaténation

Vous êtes alors maintenant en mesure de compléter le JWT en ajoutant cette 3ème chaîne de caractères à la fin des 2 précédentes, toujours en séparant avec un point. Et voilà votre JWT complet :

ewogICAiYWxnIiA6ICJFUzI1NiIsCiAgICJraWQiIDogIlBVU0hfTk9USUZfS0VZX0lEIgp9Cg==.ewogICAiaXNzIjogIlRFQU1fSUQiLAogICAiaWF0IjogMTE2ODMzMjA2MAp9Cg==.MEUCICzXD/WcIMFwVHd2wax1TODp5CtnbBVHNSvKjdGcLGvzAiEAlnfQN2/05xlhTQPIK9wn5tb6GYBWHIgVaVFzp4655ak=

Vous avez maintenant votre JWT complet et donc tout ce qu’il faut pour faire la requête ! Si vous le souhaitez vous pouvez le vérifier ici : https://jwt.io.

La requête cURL

Le JWT vas constituer le bearer d’authentification ajouté au header de la requête. Voilà ce que vous devriez avoir (pensez bien à remplacer com.myapp.MyApp par le bundleID de votre app ainsi que le DEVICE_PUSH_TOKEN par celui récupéré dans les pré-requis et correspondant à l’appareil devant recevoir la notification) :

curl -v \
  --header "authorization: bearer ewogICAiYWxnIiA6ICJFUzI1NiIsCiAgICJraWQiIDogIlBVU0hfTk9USUZfS0VZX0lEIgp9Cg==.ewogICAiaXNzIjogIlRFQU1fSUQiLAogICAiaWF0IjogMTE2ODMzNTY2MAp9Cg==.MEUCIQDAnAWA7dmcuFvxYOKN1nMmxD/G7JgH5gJxP8TkbpWI6AIgH4F7yIeVGb3Ph/SWfUedabqEZhAZqWy+X0tpx4tphBM=" \
  --header "apns-topic: com.myapp.MyApp \
  --header "apns-push-type: alert" \
  --header "apns-priority: 5" \
  --header "apns-expiration: 0" \
  --data '{"aps":{"alert":{"title":"Test", "subtitle":"Test from Terminal", "body":"Test from Terminal"}}}' \
  --http2  https://api.development.push.apple.com:443/3/device/DEVICE_PUSH_TOKEN

Si tout fonctionne vous devriez voir apparaître la notification sur l’appareil, et si c’est le cas; bien joué vous avez réussi !

🎉

En savoir plus sur Thibault Le Cornec

Abonnez-vous pour poursuivre la lecture et avoir accès à l’ensemble des archives.

Continue reading