Comment fonctionnent les notifications push iOS?

99

Comment les notifications "push" iOS sont-elles envoyées à un appareil particulier sans que cet appareil ait besoin d'interroger un serveur?

Par exemple, disons que j'ai reçu un nouveau message sur Facebook. Facebook informe Apple que mon appareil doit recevoir une notification en tant que telle. Mais comment Apple sait-il sur quel appareil / adresse IP envoyer le message?

Andy Hin
la source
2
@Wain Je recherche une explication détaillée au niveau technique. Cet article est de très haut niveau. Mon appareil maintient donc à tout moment une connexion ouverte avec les serveurs push d'Apple?
Andy Hin
Je suis plus familier avec Android Push, mais généralement, lorsque vous installez l'application, il enregistre l'appareil avec un identifiant unique auprès d'Apple. Ensuite, lorsque Facebook envoie un message à Apple, Apple le transmettra à l'identifiant unique de l'appareil.
Panama Jack
6
@Pjack oui, mais avec mon appareil changeant constamment de tours de téléphonie cellulaire, de réseaux wifi différents, comment Apple connaît-il l'IP de mon identifiant unique?
Andy Hin
@whydna Merci d'avoir posé cette question. Je voulais comprendre exactement la même chose. Je crois que cela répond à ma question ici: stackoverflow.com/questions/18859732/…
MightyMouse
@AndyHin Le système d'exploitation de l'appareil (iOS) sait quel (s) serveur (s) APN sont valides. L'appareil se connecte à ces serveurs et maintient une connexion ouverte. Cette connexion est probablement associée à l'identifiant de l'appareil et à d'autres métadonnées (numéro de téléphone). Lorsqu'un message doit être «poussé», les APN trouvent la bonne connexion et l'envoient vers le bas de cette connexion déjà ouverte. Ainsi, les APN n'essaient pas d'établir une connexion à un appareil, c'est toujours l'appareil qui ouvre cette connexion. Une connexion par appareil.
Todd

Réponses:

49

C'était trop pour moi de mettre un commentaire ainsi.

De la documentation.

Le service de notification push Apple (APN) propage les notifications push aux appareils sur lesquels des applications sont enregistrées pour recevoir ces notifications. Chaque appareil établit une connexion IP accréditée et cryptée avec le service et reçoit des notifications via cette connexion persistante. Les fournisseurs se connectent aux APN via un canal persistant et sécurisé tout en surveillant les données entrantes destinées à leurs applications clientes. Lorsque de nouvelles données pour une application arrivent, le fournisseur prépare et envoie une notification via le canal aux APN, qui transmet la notification à l'appareil cible.

Je suggère de lire la documentation pour plus d'informations et comment utiliser et configurer. Tout est là.

Notifications push

Panama Jack
la source
Merci pour la réponse.
MightyMouse
7
Alors Apple maintient une adresse IP statique sur votre appareil?
CMCDragonkai
Je me suis demandé quand j'ai compris que mon serveur devait envoyer une notification à APNS POUR CHAQUE APPAREIL CIBLE! :(
Vladimir
4
@CMCDragonkai Le périphérique établit la connexion, pas le serveur.
Hitechcomputergeek
7
de sorte que les appareils maintiennent une longue connexion d'interrogation / socket toujours avec le service APN? Si tel est le cas, comment le service APN gère-t-il autant de connexions? Si un serveur peut contenir 50 000 connexions et qu'il y a toujours 500 millions d'utilisateurs, le service a besoin d'au moins 10000 serveurs. Est-ce un scénario pratique?
AV94
87

Chaque appareil peut être mis à jour avec des données à l'aide de ses propres jetons d'appareil. Cette image explique tout. .

entrez la description de l'image ici

Karan Alangat
la source
Une idée de l'utilisation du jeton d'appareil? Est-il utilisé pour crypter la communication entre le serveur APNS et l'application ou ailleurs?
Mugen
1
@Mugen: Le jeton d'appareil est utilisé par APNS pour identifier l'appareil sur lequel il est censé transmettre la charge utile envoyée par le fournisseur!
D4ttatraya
@Karan - Y a-t-il une distinction entre les notifications destinées à un utilisateur (par exemple "Hey utilisateur, vous avez un message!") Et celles destinées à réveiller une application et lui dire silencieusement de faire un traitement en arrière-plan?
Howiecamp
@Howiecamp Si vous utilisez la notification push, vous serez averti chaque fois qu'une notification a été reçue si l'application est en cours d'exécution. Les détails de la notification active sont également accessibles lorsque l'utilisateur appuie sur la notification du centre de notification et lance l'application. Pendant ce temps, vous pouvez exécuter les processus que vous souhaitez effectuer.
Karan Alangat
@KaranAlangat, Comment le décompte des badges est-il géré ici? Comment le serveur le sait-il?
GvSharma
22

J'ai créé une infographie pour expliquer le flux de travail des notifications push. J'espère que c'est utile.

entrez la description de l'image ici

Udit Agarwal
la source
22

Présentation des APN

Le service de notification push Apple (APN) est la pièce maîtresse de la fonction de notification à distance. Il s'agit d'un service robuste, sécurisé et très efficace permettant aux développeurs d'applications de propager des informations sur les appareils iOS (et, indirectement, watchOS), tvOS et macOS.

Lors du lancement initial de votre application sur l'appareil d'un utilisateur, le système établit automatiquement une connexion IP accréditée, chiffrée et persistante entre votre application et les APN. Cette connexion permet à votre application d'effectuer la configuration pour lui permettre de recevoir des notifications, comme expliqué dans Configuration de la prise en charge des notifications à distance.

L'autre moitié de la connexion pour l'envoi de notifications (le canal sécurisé et persistant entre un serveur fournisseur et les APN) nécessite une configuration dans votre compte développeur en ligne et l'utilisation de certificats cryptographiques fournis par Apple. Un fournisseur est un serveur que vous déployez et gérez, que vous configurez pour fonctionner avec des APN. La figure 1-1 montre le chemin de remise d'une notification à distance.

Figure 1-1 Envoi d'une notification à distance d'un fournisseur à une application

image: ../Art/remote_notif_simple.jpg

Une fois la configuration des notifications push terminée sur vos fournisseurs et dans votre application, vos fournisseurs peuvent ensuite envoyer des demandes de notification aux APN. Les APN transmettent les charges utiles de notification correspondantes à chaque appareil ciblé. À la réception d'une notification, le système fournit la charge utile à l'application appropriée sur l'appareil et gère les interactions avec l'utilisateur.

Si une notification pour votre application arrive alors que l'appareil est allumé mais que l'application n'est pas en cours d'exécution, le système peut toujours afficher la notification. Si l'appareil est mis hors tension lorsque les APN envoient une notification, les APN conservent la notification et essaient à nouveau plus tard (pour plus de détails, voir Qualité de service, Store-and-Forward et Notifications coalescées).

Responsabilités du fournisseur

Vos serveurs fournisseurs ont les responsabilités suivantes pour participer avec les APN:

  • Recevoir, via des APN, des jetons d'appareil uniques au monde et spécifiques à l'application et d'autres données pertinentes à partir d'instances de votre application sur les appareils des utilisateurs. Cela permet à un fournisseur de connaître chaque instance en cours d'exécution de votre application.
  • Déterminer, selon la conception de votre système de notification, quand des notifications à distance doivent être envoyées à chaque appareil.
  • Création et envoi de demandes de notification aux APN, chaque demande contenant une charge utile de notification et des informations de livraison; Les APN envoient ensuite les notifications correspondantes aux appareils prévus en votre nom.

Pour chaque demande de notification à distance envoyée par un fournisseur, il doit:

  • Construisez un dictionnaire JSON contenant la charge utile de la notification, comme décrit dans Création de la charge utile de notification à distance.
  • Ajoutez la charge utile, un jeton d'appareil unique au monde et d'autres informations de livraison à une requête HTTP / 2. Pour plus d'informations sur les jetons de périphérique, consultez Approbation de connexion APN à périphérique et jetons de périphérique. Pour plus d'informations sur le format de requête HTTP / 2 et les réponses et erreurs possibles des APN, consultez Communication avec les APN.
  • Envoyez la demande HTTP / 2 aux APN, y compris les informations d'identification cryptographiques sous la forme d'un jeton ou d'un certificat, via un canal sécurisé permanent.
  • L'établissement de ce canal sécurisé est décrit dans Architecture de sécurité.

Utilisation de plusieurs fournisseurs

La figure 1-2 illustre le type de réseau virtuel que les APN activent pour les appareils exécutant vos applications. Pour gérer la charge de notification, vous déployez généralement plusieurs fournisseurs, chacun avec sa propre connexion persistante et sécurisée aux APN. Chaque fournisseur peut ensuite envoyer des demandes de notification ciblant tout appareil pour lequel le fournisseur dispose d'un jeton d'appareil valide.

Figure 1-2 Pousser les notifications à distance de plusieurs fournisseurs vers plusieurs appareils

image: ../Art/remote_notif_multiple.jpg

Qualité de service, Store-and-Forward et Notifications coalescées

Le service Apple Push Notification comprend un composant de qualité de service (QoS) qui exécute une fonction de stockage et de retransmission. Si les APN tentent de délivrer une notification et que le périphérique de destination est hors ligne, les APN stockent la notification pendant une période limitée et la délivre lorsque le périphérique redevient disponible. Ce composant stocke uniquement la notification la plus récente par appareil et par application. Si un appareil est hors ligne, l'envoi d'une demande de notification ciblant cet appareil entraîne le rejet de la demande précédente. Si un appareil reste hors ligne pendant une longue période, toutes ses notifications stockées dans les APN sont supprimées.

Pour permettre la fusion de notifications similaires, vous pouvez inclure un identifiant de réduction dans une demande de notification. Normalement, lorsqu'un appareil est en ligne, chaque demande de notification que vous envoyez aux APN entraîne une notification envoyée à l'appareil. Cependant, lorsque la clé apns-collapse-id est présente dans votre en-tête de requête HTTP / 2, les APN fusionnent les requêtes dont la valeur pour cette clé est la même. Par exemple, un service de nouvelles qui envoie deux fois le même titre peut utiliser la même valeur d'identificateur de réduction pour les deux demandes. Les APN fusionneraient alors les deux demandes en une seule notification pour livraison à l'appareil. Pour plus de détails sur la clé apns-collapse-id.

Architecture de sécurité

Les APN appliquent la validation et l'authentification cryptographiques de bout en bout à l'aide de deux niveaux de confiance: confiance de connexion et confiance de jeton d'appareil.

La confiance de connexion fonctionne entre les fournisseurs et les APN, et entre les APN et les appareils.

L'approbation de jeton d'appareil fonctionne de bout en bout pour chaque notification à distance. Il garantit que les notifications sont acheminées uniquement entre les points de début (fournisseur) et de fin (appareil) corrects.

Un jeton d'appareil est une instance NSData opaque qui contient un identifiant unique attribué par Apple à une application spécifique sur un appareil spécifique. Seuls les APN peuvent décoder et lire le contenu d'un jeton d'appareil. Chaque instance d'application reçoit son jeton d'appareil unique lorsqu'elle s'enregistre auprès des APN, puis doit transmettre le jeton à son fournisseur, comme décrit dans Configuration de la prise en charge des notifications à distance. Le fournisseur doit inclure le jeton d'appareil dans chaque demande de notification push qui cible l'appareil associé; Les APN utilisent le jeton d'appareil pour garantir que la notification n'est envoyée qu'à la combinaison unique d'application-appareil à laquelle elle est destinée.

Les APN peuvent émettre un nouveau jeton d'appareil pour diverses raisons:

  • L'utilisateur installe votre application sur un nouvel appareil
  • L'utilisateur restaure l'appareil à partir d'une sauvegarde
  • L'utilisateur réinstalle le système d'exploitation
  • Autres événements définis par le système

Par conséquent, les applications doivent demander le jeton d'appareil au moment du lancement, comme décrit dans Approbation de connexion APN à appareil et jetons d'appareil. Pour obtenir des exemples de code, consultez Inscription pour recevoir des notifications à distance.

Pour établir des sessions TLS basées sur HTTP / 2 avec des APN, vous devez vous assurer qu'un certificat racine GeoTrust Global CA est installé sur chacun de vos fournisseurs. Si un fournisseur exécute macOS, ce certificat racine se trouve dans le trousseau par défaut. Sur d'autres systèmes, ce certificat peut nécessiter une installation explicite. Vous pouvez télécharger ce certificat depuis le site Web des certificats racine GeoTrust. Voici un lien direct vers le certificat.

La figure 1-3 illustre l'utilisation de l'API du fournisseur APN basé sur HTTP / 2 pour établir la confiance et l'utilisation des jetons d'authentification du fournisseur JWT pour l'envoi de notifications.

Figure 1-3 Établissement et utilisation de la confiance de connexion de fournisseur basée sur des jetons

image: ../Art/service_provider_ct.jpg

Comme le montre la figure 1-3, l'approbation de fournisseur basée sur des jetons fonctionne comme suit:

Votre fournisseur demande une connexion sécurisée avec les APN à l'aide de la sécurité de la couche de transport (TLS), représentée par la flèche intitulée «TLS initiation» sur la figure.

APNs remet ensuite à votre fournisseur un certificat APN, représenté par la flèche suivante dans la figure (intitulée «certificat APNs»), que votre fournisseur valide ensuite.

À ce stade, la confiance de connexion est établie et votre serveur fournisseur est activé pour envoyer des demandes de notification push à distance basées sur des jetons aux APN. Chaque demande de notification envoyée par votre fournisseur doit être accompagnée d'un jeton d'authentification JWT, représenté sur la figure par la flèche intitulée «Notification push».

Les APN répondent à chaque push, représentés dans la figure par la flèche intitulée "Réponse HTTP / 2".

Pour plus d'informations sur les réponses que votre fournisseur peut recevoir pour cette étape, consultez Réponse HTTP / 2 des APN.

La figure 1-4 illustre l'utilisation d'un certificat SSL émis par Apple pour établir la confiance entre un fournisseur et des APN. Contrairement à la figure 1-3, cette figure ne montre pas une notification push elle-même, mais s'arrête à l'établissement d'une connexion Transport Layer Security (TLS). Dans le schéma d'approbation basé sur les certificats, les demandes de notification push ne sont pas authentifiées, mais elles sont validées à l'aide du jeton d'appareil associé.

Figure 1-4 Établissement d'une approbation de connexion de fournisseur basée sur des certificats

image: ../Art/service_provider_ct_certificate_2x.png

Comme le montre la figure 1-4, la confiance fournisseur-APN basée sur un certificat fonctionne comme suit:

Votre fournisseur demande une connexion sécurisée avec les APN à l'aide de la sécurité de la couche de transport (TLS), représentée par la flèche intitulée «TLS initiation» sur la figure.

APNs remet ensuite à votre fournisseur un certificat APN, représenté par la flèche suivante dans la figure (intitulée «certificat APNs»), que votre fournisseur valide ensuite.

Votre fournisseur doit ensuite renvoyer son certificat de fournisseur fourni par Apple (que vous avez précédemment obtenu à partir de votre compte de développeur en ligne, comme expliqué dans «Générer un certificat SSL client APNs universel» dans l'aide Xcode) aux APN, représenté par la flèche intitulée «Fournisseur certificat."

APNs valide ensuite votre certificat de fournisseur, confirmant ainsi que la demande de connexion provient d'un fournisseur légitime, et établit votre connexion TLS.

À ce stade, la confiance de connexion est établie et votre serveur fournisseur est activé pour envoyer des demandes de notification push à distance basées sur des certificats aux APN.

Approbation de connexion APN à appareil et jetons d'appareil

La confiance entre les APN et chaque appareil est établie automatiquement, sans participation de votre application, comme décrit dans cette section.

Chaque appareil dispose d'un certificat cryptographique et d'une clé cryptographique privée, fournis par le système d'exploitation lors de l'activation initiale de l'appareil et stockés dans le trousseau de l'appareil. Lors de l'activation, les APN authentifient et valident la connexion à l'appareil, en fonction du certificat et de la clé, comme illustré à la Figure 6-5.

Figure 1-5 Établissement de la confiance de connexion entre un appareil et les APN

image: ../Art/service_device_ct.jpg

Comme le montre la figure 1-5, la confiance APN-appareil fonctionne comme suit:

  • La négociation d'approbation commence lorsque l'appareil lance une connexion TLS avec des APN, comme indiqué dans la flèche supérieure de la figure.
  • APNs renvoie un certificat APNs à l'appareil.
  • Le système d'exploitation valide ce certificat puis, comme indiqué dans la flèche «Certificat de périphérique», envoie le certificat de périphérique aux APN.
  • Enfin, comme indiqué par la flèche du bas de la figure, les APN valident le certificat de l'appareil, établissant la confiance.
  • Avec une connexion TLS établie entre les APN et l'appareil, les applications de l'appareil peuvent s'enregistrer auprès des APN pour recevoir leurs jetons d'appareil spécifiques à l'application pour les notifications à distance. Pour plus de détails et des exemples de code, consultez Inscription pour recevoir des notifications à distance dans Configuration de la prise en charge des notifications à distance.

Après avoir reçu le jeton d'appareil, une application doit se connecter au fournisseur associé de l'application et lui transmettre le jeton. Cette étape est nécessaire car un fournisseur doit inclure le jeton d'appareil plus tard lorsqu'il envoie une demande de notification aux APN, ciblant l'appareil. Le code que vous écrivez pour transférer le jeton est également affiché dans Inscription pour recevoir des notifications à distance.

Qu'un utilisateur active un périphérique pour la première fois ou que les APN aient émis un nouveau jeton de périphérique, le processus est similaire et est illustré à la Figure 6-6.

Figure 1-6 Gestion du jeton de périphérique

image: ../Art/token_generation.jpg

L'obtention et la gestion d'un jeton d'appareil spécifique à une application fonctionnent comme suit:

Votre application s'enregistre auprès des APN pour les notifications à distance, comme indiqué dans la flèche du haut. Si l'application est déjà enregistrée et que le jeton d'appareil spécifique à l'application n'a pas changé, le système renvoie rapidement le jeton existant à l'application et ce processus passe à l'étape 4.

Lorsqu'un nouveau jeton d'appareil est nécessaire, les APN en génèrent un à l'aide des informations contenues dans le certificat de l'appareil. Il crypte le jeton à l'aide d'une clé de jeton et le renvoie à l'appareil, comme indiqué dans la flèche du milieu pointant vers la droite.

Le système renvoie le jeton d'appareil à votre application en appelant votre application: didRegisterForRemoteNotificationsWithDeviceToken: méthode de délégué.

Lors de la réception du jeton, votre application (dans la méthode déléguée) doit le transmettre à votre fournisseur au format binaire ou hexadécimal. Votre fournisseur ne peut pas envoyer de notifications à l'appareil sans ce jeton. Pour plus de détails, voir Inscription pour recevoir des notifications à distance dans Configuration de la prise en charge des notifications à distance.

IMPORTANT

Les jetons de périphérique APN sont de longueur variable. Ne codez pas leur taille en dur.

Lorsque votre fournisseur envoie une demande de notification push aux APN, il inclut un jeton d'appareil qui identifie une combinaison application-appareil unique. Cette étape est illustrée dans la flèche «Token, Payload» entre le fournisseur et les APN dans la Figure 6-7. Les APN déchiffrent le jeton pour garantir la validité de la demande et pour déterminer le périphérique cible. Si les APN déterminent que l'expéditeur et le destinataire sont légitimes, ils envoient alors la notification au périphérique identifié.

Figure 1-7 Chemin de notification à distance du fournisseur à l'appareil

image: ../Art/token_trust.jpg

Une fois que l'appareil reçoit la notification (et après l'étape finale illustrée à la figure 1-7), le système transmet la notification à distance à votre application.

Réf: Apple Push Notification Service

Maintenant, regardez ici pour comprendre le flux technique: Comment implémenter le service de notification push Apple sur une application iOS?

Krunal
la source
7
Haha, vous venez littéralement de coller l'intégralité de l'entrée Apple Docs dans SO!
Matt Mc
@MattMc - Oui, j'étais novice pour SO, quand j'ai posté cette réponse et à ce moment-là j'ai posté un lien vers APNS mais un lien n'est pas considéré comme une réponse sur SO, alors j'ai fait ça .... :)
Krunal
1
C'est vrai en fait, bien mieux que la réponse juste un lien;)
Matt Mc
14

L'appareil ne continue pas d'interroger le serveur pour les notifications push.

Pour faire simple, considérez qu'un iPhone est connecté à Internet. Lors de la connexion à Internet, l'iPhone établit la connexion au serveur Apple Push Notifications, cette connexion est une connexion ouverte, ce qui signifie que les données peuvent être envoyées à l'iPhone depuis le serveur au moment où les données arrivent au serveur.

Apple n'utilise pas le protocole HTTP pour les notifications Push, mais si vous comprenez le protocole HTTP, sa méthodologie est presque similaire.

http://en.wikipedia.org/wiki/Push_technology#HTTP_server_push

user4248688
la source
Qu'est-ce qu'ils utilisent sinon http?
Howiecamp
2

Il y a une très belle explication des notifications push dans cet article .

Sous iOS, les applications ne peuvent pas faire grand-chose en arrière-plan. Les applications ne sont autorisées à effectuer qu'un ensemble limité d'activités afin de préserver la durée de vie de la batterie.

Mais que se passe-t-il si quelque chose d'intéressant se produit et que vous souhaitez informer l'utilisateur, même s'il n'utilise pas actuellement votre application?

Tarek
la source