EDITAR: Bien que cette réponse soit tout à fait applicable, il y a quelques ajouts (pas de changements) aux notifications dans iOS 12. Je recommande vivement de regarder WWDC 2018 : Les nouveautés en matière de notifications aux utilisateurs et lire cet article étonnant et à lire absolument .
Les principaux changements sont les suivants :
- notifications groupées avec un format de résumé
- notifications provisoires c'est à dire montrer les notifications directement dans le centre de notification sans la permission de l'utilisateur
- des notifications critiques qui ne tiennent pas compte de l'option "ne pas déranger" ou "muet".
- la possibilité d'interagir avec les notifications dans les extensions
- possibilité de réinitialiser ou de mettre à jour complètement les actions
- possibilité d'accéder en profondeur aux paramètres de notification de l'application à partir du centre de notification du téléphone
NOTE IMPORTANTE : Je ne sais pas depuis quand, mais d'après les documents d'Apple, la "notification silencieuse" a été renommé à "notification en arrière-plan".
Il y a trop de paramètres qui doivent être réglés correctement pour que ça fonctionne. Je vais essayer de les disséquer et de les rendre plus faciles à comprendre.
Dans l'ensemble, plusieurs éléments sont importants.
- la différence globale entre un silencieux y utilisateur notification
- différents types de utilisateur notifications
- comment une notification à distance, c'est-à-dire la charge utile est configuré à partir de votre serveur
- comment activer les notifications push et les notifications à distance en mode arrière-plan sur votre projet
- comment enregistrer votre jeton avec les APNs pour à distance y silencieux l'architecture des notifications et des APNs
- comment demander l'autorisation de utilisateur notifications
- l'activation de l'actualisation de l'application en arrière-plan et des notifications à partir de l'écran d'accueil. dispositif
- ce qui est
content-available
- comprendre que l'iOS est en amont à votre application lorsqu'il s'agit de recevoir une notification à distance.
- que se passe-t-il lorsque le système d'exploitation reçoit des notifications lorsque l'application a été arrêtée par l'utilisateur ?
- Une note sur la fiabilité et l'architecture des APNs
Je recommande vivement à tout le monde de regarder les 7 premières minutes de : WWDC 2015 : Nouveautés dans les notifications . A partir de là, le présentateur mentionne qu'il existe 2 grands types de notifications :
Notifications silencieuses
Ils se produisent en arrière-plan, c'est pourquoi vous ne voyez jamais d'alerte/de badge/de son. Les choses sont téléchargées sans que vous les connaissiez.
bug d'iOS 11
Voir aquí . Les versions initiales d'iOS 11 présentaient des bogues pour les notifications silencieuses. Assurez-vous que que vous avez la dernière version pour vos tests, sinon, cela peut ne pas fonctionner
Notifications des utilisateurs
Comme son nom l'indique, il s'agit d'un lien avec la utilisateur . C'est-à-dire que l'utilisateur verra une alerte/un badge ou entendra un son. Il en existe 2 types.
Notifications locales
Une notification locale peut être déclenché de 3 manières différentes :
-
UNLocationNotificationTrigger
: Vous voyez une alerte lorsque vous êtes proche d'un magasin Walmart.
-
UNTimeIntervalNotificationTrigger
: par exemple, vous voyez une alerte toutes les 10 minutes.
-
UNCalendarNotificationTrigger
comme le 1er décembre à 13h00 2017.
Notifications à distance
Elles sont similaires aux notifications locales mais elles sont déclenchées depuis le serveur, par exemple un message WhatsApp qui a un champ From (maman) et un champ body (je t'aime !).
Enregistrement des jetons et architecture des APNs :
Pour recevoir une notification silencieuse ou à distance, vous devez vous enregistrer pour un jeton en utilisant :
application.registerForRemoteNotifications()
L'enregistrement ne nécessite PAS l'autorisation de l'utilisateur. Cela permet aux notifications silencieuses de devenir transparentes. Voir <a href="https://developer.apple.com/videos/play/wwdc2015/720?time=142" rel="nofollow noreferrer">ce moment de la vidéo de la WWDC</a>
Les notifications silencieuses sont activées par défaut . L'utilisateur n'a pas besoin d'approuver votre -- ne donne pas la permission à votre application de les utiliser, et vous pouvez juste commencer à les utiliser sans demander à l'utilisateur la permission.
<a href="https://developer.apple.com/videos/play/wwdc2015/720?time=126" rel="nofollow noreferrer">De la WWDC</a>
Souvenez-vous de APNs est livré à vos utilisateurs par APNs et non par votre serveur. Votre code iOS doit donc envoyer ce jeton à votre serveur. Ainsi, le serveur peut associer un jeton d'appareil donné à l'utilisateur. Lorsque vous voulez pousser vers un certain utilisateur, votre serveur indique simplement aux APNs d'envoyer une charge utile à un jeton spécifique. Ce qu'il est important de comprendre, c'est que votre serveur et les APN sont deux choses différentes.
Le flux de celui-ci ressemble à ceci :
- Le serveur/fournisseur envoie une charge utile aux APN.
- Les APN envoient une notification à tous les appareils cibles d'un compte donné. Par exemple, votre iPhone et votre Mac peuvent tous deux recevoir des notifications pour les e-mails/messages.
- Ensuite, votre iPhone/Mac transmettra ce message à l'application. Les APN n'envoient pas directement les messages à votre application. Elle les envoie à l'appareil. Puis l'iOS l'envoie à votre application.
Pour en savoir plus, voir la documentation Aperçu des APNs y Envoi de demandes de notification aux APNs
Être capable de montrer badges/alertes/sons, vous devez demander autorisation de l'utilisateur :
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { (granted, error) in
guard error == nil else {
//Display Error.. Handle Error.. etc..
return
}
if granted {
//Do stuff here..
//Register for RemoteNotifications. Your Remote Notifications can display alerts now :)
application.registerForRemoteNotifications()
}
else {
//Handle user denying permissions..
}
}
Question : Dois-je demander l'accès une fois pour les notifications locales et une fois pour les notifications à distance ?
Non. Il suffit d'écrire l'extrait ci-dessus et il demandera l'accès à les deux à distance et locale.
Maintenant, passons à la partie délicate :D
Projet Xcode + Réglages iPhone
Dois-je activer quelque chose pour recevoir des notifications silencieuses ?
- Vous devez activer Notifications push de vos capacités Xcode :
Si vous ne l'activez pas, votre application ne recevra pas de jeton. Et sans jeton, le serveur ne vous reconnaît pas.
- Pour pouvoir télécharger des trucs à partir du arrière-plan vous devez l'activer : notifications à distance des modes d'arrière-plan.
Pour activer backgroundModes vous pouvez le faire soit en utilisant votre plist o Capacités de Xcode .
La raison pour laquelle vous pouvez le faire, de l'une ou l'autre façon, est que plist est plus proche de votre code et est l'ancienne façon, peut-être qu'il est là pour le support de l'héritage. Xcode capabilities est la nouvelle méthode facile.
plist :
L'élément 0 est juste un <strong>indice </strong>il ne s'agit pas de la clé d'un dictionnaire (ce que l'on voit normalement dans une plist), l'UIBackgroundModes est une clé d'un dictionnaire. <code>array</code> de cordes. Les cordes doivent uniquement provenir d'un <em>valeur acceptée </em>de la <a href="https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/iPhoneOSKeys.html#//apple_ref/doc/uid/TP40009252-SW10" rel="nofollow noreferrer">Tableau UIBackgroundModes </a>.
Capacités de Xcode :
Vérifiez le Remote Notification
en Xcode sous les modes d'arrière-plan comme ci-dessous :
Si vous ne faites rien de ce qui précède, vous pouvez désactiver les notifications avec :
tuera Notifications locales et à distance
Cependant si vous faire activez le rafraîchissement de l'application en arrière-plan à partir des capacités de la plist ou du Xcode, puis même si les notifications sont désactivées pour l'application, vous recevrez toujours des notifications silencieuses !
Si l'utilisateur souhaite désactiver les notifications silencieuses, il doit désactiver les deux notifications et désactiver l'actualisation de l'application en arrière-plan pour votre application / sur l'ensemble du système. Pour désactiver l'actualisation de l'application en arrière-plan sur l'ensemble de votre système, vous devez procéder comme suit :
Pourquoi est-ce que je dis tout cela ? Pour vous expliquer que paramètres des notifications silencieuses et push sont différentes pour l'utilisateur et les restrictions pour les envoyer sont différentes. Pour en savoir plus, voir ce moment extrait de la vidéo de la WWDC . Voir ici à la place (le lien précédent était mort) :
Les notifications silencieuses sont activées par défaut.
L'utilisateur n'a pas besoin d'approuver votre ne donne pas la permission à votre application pour les utiliser, et vous pouvez commencer à les utiliser sans demander la sans demander la permission à l'utilisateur.
Mais les notifications silencieuses sont le mécanisme derrière le rafraîchissement rafraîchir.
A tout moment, vous savez que l'utilisateur peut aller dans les paramètres et désactiver les désactiver.
Vous ne pouvez donc pas compter sur leur disponibilité permanente.
Vous ne savez pas si l'utilisateur peut les désactiver, et vous ne recevez pas de plus de notification.
Cela signifie également que les notifications silencieuses sont délivrées avec la meilleure efficacité possible. effort.
Cela signifie que lorsque la notification arrive sur l'appareil de l'utilisateur, le système va faire des choix.
Il va utiliser différents signaux de l'appareil et du comportement de l'utilisateur. l'utilisateur, comme l'alimentation ou l'heure de la journée, pour décider du bon moment moment de délivrer la notification et de lancer votre application.
Il peut essayer d'économiser la batterie ou de s'adapter au comportement de l'utilisateur. et rendre le contenu disponible quand l'utilisateur est le plus susceptible de l'utiliser.
Voir aussi aquí .
CAVEAT : Même si vous désactivez le rafraîchissement de l'arrière-plan de l'application et si vous désactivez l'autorisation des notifications, vous pouvez toujours recevoir des notifications silencieuses si votre application est en ARRIÈRE-plan. Si votre application est en arrière-plan, elle ne sera pas délivrée.
Dois-je activer quelque chose pour recevoir des notifications à distance ?
Il vous suffit d'activer Notifications push de vos capacités Xcode :
Si vous ne l'activez pas, votre application ne recevra pas de jeton. Et sans jeton, le serveur ne vous reconnaît pas.
APNs Structure de la charge utile
Curieux... Pouvez-vous me dire à quoi devrait ressembler ma charge utile ?
Je vous recommande vivement de voir Apple § documentation . C'est très clair ET AUSSI VOIR Envoi de demandes de notification aux APNs . En gros, la plateforme effectue un appel HTTP/2 aux APN et envoie les données utiles souhaitées. Il est essentiel d'envoyer les bons en-têtes, sinon vos notifications ne seront pas transmises aux appareils !
Merci, mais pouvez-vous me dire les parties importantes ?
uhhmm... OK, mais juste pour que tu saches que ça vient du lien que je viens de dire :
Para Notifications silencieuses il n'y a qu'un seul critère :
- La charge utile
aps
Le dictionnaire doit inclure le content-available
clé avec une valeur de 1
.
- Par docs vous pouvez envoyer d'autres champs
Si des mises à jour visibles par l'utilisateur accompagnent la mise à jour de fond vous pouvez définir les clés d'alerte, de son ou de badge dans le dictionnaire aps selon le cas.
Un exemple de charge utile ressemblerait à ceci :
{
"aps" : {
"content-available" : 1
},
"acme1" : "bar",
"acme2" : 42
}
acme1, acme2, ou simplement des données personnalisées ! Mais pour le aps
vous DEVEZ suivre la structure d'Apple, sinon, il ne sera pas carte correctement et vous ne serez pas en mesure de lire les données correctement.
Note : Je n'ai pas vérifié, mais un autre ingénieur a mentionné que si vous avez notifications provisoires activé, vous devez inclure un champ d'alerte avec un corps vide pour garantir la transmission des notifications silencieuses. Par exemple :
{
"aps" : {
"content-available" : 1,
"alert" : {
"body" : "",
},
},
}
Para Notifications des utilisateurs :
Vous avez besoin d'un alert
à l'intérieur de votre aps
.
A titre d'exemple :
{
"aps" : {
"alert" : "You got your emails.",
"badge" : 9,
"sound" : "bingbong.aiff"
},
"acme1" : "bar",
"acme2" : 42
}
Il existe également un troisième option dont je parlerai plus loin dans la réponse.
Quant à ce que le fixe aps
y alert
Les clés de dictionnaire sont, voir ces Documents d'Apple .
OK, je l'ai. Qu'est-ce que content-available
?
C'est très simple. C'est juste un drapeau qui indique à votre application que vous devez vous réveiller et télécharger quelque chose parce que j'ai du contenu disponible pour le téléchargement ! Pour plus d'informations, voir ceci moment précis .
Par défaut, le content-available
n'est pas inclus, c'est-à-dire que, par défaut, les notifications que vous envoyez ne le fera pas déclencher application(_:didReceiveRemoteNotification:fetchCompletionHandler:)
ou faire quelque chose dans votre application. L'application se contenterait d'afficher la notification. Si vous voulez réveiller l'application (pour faire quelque chose en arrière-plan), vous devez inclure content-available
et le régler sur 1
.
§ : Si vous utilisez Firebase La structure et les clés de votre charge utile peuvent être légèrement différentes. Par exemple, la clé content-available
est remplacé par content_available
. Pour en savoir plus, voir Documentation sur Firebase et aussi aquí .
Je sais que vous m'avez dit que je ne peux télécharger quelque chose dans mon application que lorsque j'utilise les notifications silencieuses, mais y a-t-il un moyen de réveiller mon application en arrière-plan ET de télécharger quelque chose pour les notifications à distance ?
Oui, mais alors, comme pour la notification silencieuse, vous devez également définir l'option content-available
à 1, pour qu'il sache qu'il faut se réveiller et télécharger quelque chose. Sinon, il émettra juste une alerte/un badge/un son mais ne téléchargera rien.
NOTES IMPORTANTES :
- Si votre application n'a que des notifications silencieuses, il suffit d'activer les "notifications push" + "notifications à distance" dans les capacités et de définir les paramètres suivants
content-available
a 1
pour chaque charge utile.
- Si votre application ne comporte que des notifications à distance, il suffit d'activer les "notifications push" à partir des capacités. Il n'y a rien à faire pour le
content-available
.
- Toutefois, si vous souhaitez que vos notifications affichent une alerte/un badge/un son et qu'elles téléchargent également quelque chose en arrière-plan, vous devez activer et définir à la fois les "notifications à distance" et les "notifications push".
content-available
a 1
.
(TROISIÈME OPTION)
{
"aps" : {
"content-available" : 1
"alert" : "You got your emails.",
"badge" : 9,
"sound" : "bingbong.aiff"
},
"acme1" : "bar",
"acme2" : 42
}
<a href="https://developer.apple.com/videos/play/wwdc2015/720?time=305" rel="nofollow noreferrer">Ce moment </a>de la vidéo de la WWDC mentionne le
Pour citer l'ingénieur Apple :
Maintenant, vous pouvez dans un utilisateur notification à distance, vous pouvez définir les mêmes contenu disponible que vous définissez dans les notifications silencieuses, et qui permet à votre application d'avoir du temps pour télécharger le contenu ou mettre à jour le contenu qu'elle veut afficher de sorte que lorsque l'utilisateur tape sur la notification, votre contenu est disponible. Et l'utilisateur voit ce que ce qu'il fait. C'est une façon d'avoir une notification silencieuse à l'intérieur d'un utilisateur. des notifications comme un résumé.
Notifications et cycle de vie des applications iOS
Je suis confus au sujet des notifications à distance. Je pensais que chaque fois que je recevais une notification, mon application devenait active en arrière-plan et téléchargeait quelque chose. Pouvez-vous m'expliquer ?
par exemple, en ce moment :
-
Votre iPhone vient de recevoir une notification à distance dont le corps est "sans expéditeur". Pour recevoir cette notification, WhatsApp ** n'a pas besoin** d'être exécuté en arrière-plan, c'est-à-dire que vous n'avez pas besoin d'activer les "Notifications à distance" dans BackgroundModes. Vous recevrez toujours la notification même si votre application a été quittée de force ou suspendue parce que l'option de notification à distance est activée. Le processus est géré par le système d'exploitation, et non par l'application WhatsApp. . Cependant, si vous voulez être en mesure de télécharger le message réel ou son image/vidéo sur WhatsApp (de sorte qu'une fois que votre utilisateur ouvre WhatsApp, la vidéo soit là à attendre l'utilisateur), alors vous devez activer votre application. Pour ce faire, vous devez content-available : 1
et mettre en œuvre application(_:didReceiveRemoteNotification:fetchCompletionHandler:)
.
-
De même, si vous désactivez les données cellulaires pour une application, vous recevrez toujours ses notifications. Cependant, en tapant sur cette notification, l'utilisateur ne le fera pas être en mesure de faire n'importe quel demandes de réseau pour cette application. Ils pourront seulement ouvrir l'application.
-
Ou, pour un autre scénario similaire, si le serveur/point d'accès auquel vous êtes connecté a un accès restreint pour, disons, WhatsApp, il vous permettra toujours de recevoir les notifications APN. Toutefois, en appuyant sur cette notification, l'utilisateur ne le fera pas être en mesure de faire n'importe quel demandes de réseau pour cette application. Ils pourront seulement ouvrir l'application.
CAVEAT : Si l'application a été quittée de force par l'utilisateur, alors, bien que vous receviez la notification pour les raisons mentionnées ci-dessus, vous ne pouvez rien faire pour faire sortir l'application de son état de fin automatiquement (même si vous aviez content-available
réglé sur 1
). Aucune de vos méthodes déléguées ne serait touchée. Le site utilisateur doit ouvrir l'application et ce n'est qu'ensuite que les méthodes de votre délégué seront atteintes.
Une note sur la fiabilité et l'architecture des APNs :
Bien que les notifications soient largement utilisées pour fournir le contenu réel de l'application, elles ne sont PAS conçues pour livrer dans l'application. Ils sont plutôt conçus pour informer l'utilisateur que "quelque chose de nouveau est arrivé (un message de 2b ou une petite image de 50kb, ou une image de 10MB ou une vidéo de 2 GB). Ouvrez l'application si vous le souhaitez. Au fait, voici un petit morceau de ce message (le message lui-même). si il peut s'adapter, le titre de l'image ou une vignette affichée dans la notification, un titre de la vidéo ou une vignette affichée dans la vidéo". Pour en savoir plus, voir Repli "best-effort" des APN iOS . Je répète que vous ne téléchargez jamais la pièce jointe de 40 Mo envoyée dans l'e-mail. Vous êtes simplement informé de son existence. Vous en envoyez juste assez (une vue miniature de la pièce jointe) pour que l'utilisateur soit informé des nouveautés et puisse décider s'il doit ou non ouvrir l'application pour en savoir plus. Lorsque j'ai découvert iOS, je pensais que l'image ou la vidéo était envoyée par le biais de la notification push. Ce n'est pas le cas !
En particulier dans le cas des notifications silencieuses :
Lorsqu'un appareil reçoit une notification en arrière-plan, le système peut mettre en attente et retarder la livraison de la notification, ce qui peut avoir les effets secondaires suivants :
-
Lorsque le système reçoit une nouvelle notification en arrière-plan, il écarte l'ancienne notification et ne retient que la plus récente.
-
Si quelque chose quitte de force ou tue l'application, le système rejette la notification maintenue.
-
Si l'utilisateur lance l'application, le système délivre immédiatement la notification retenue. Pousser des mises à jour de fond dans votre application <a href="https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/pushing_background_updates_to_your_app" rel="nofollow noreferrer">docs</a>
-
APNs envoie un nombre limité de notifications silencieuses (notifications avec la clé de disponibilité du contenu) par jour. En outre, si l'appareil a déjà dépassé son budget d'énergie pour la journée, les notifications silencieuses ne sont plus envoyées jusqu'à ce que le budget d'énergie soit réinitialisé, ce qui se produit une fois par jour. Ces limites sont désactivées lorsque vous testez votre application à partir de Xcode. Consultez la section Pousser les mises à jour en arrière-plan de votre application.
<a href="https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/handling_notification_responses_from_apns" rel="nofollow noreferrer">Conseils de dépannage pour le traitement des erreurs renvoyées par les PNA</a>
Même pour les notifications d'utilisateurs distants, il se peut que l'utilisateur ne soit pas connecté à Internet, ce qui peut entraîner l'expiration du contenu ou l'étranglement des APN si vous envoyez trop de notifications ou trop rapidement. Voir encore ici
Pour faire court, les APN et le système d'exploitation sont les rois et vous êtes en dessous. Vous ne pouvez donc pas compter sur lui pour se conformer à tous vos ordres. Cela dit, il est super fiable dans le sens où vous voyez la plupart des applications de messagerie l'utiliser avec succès.
Addendum Comment générer un certificat de notification push, .p12
o .pem
et comment tester tout cela ?
Regarde juste ça excellente réponse . Il contient le plus grand nombre de captures d'écran que j'ai jamais vu.
1 votes
NOTE : Les documents d'Apple ont renommé silencieux notification à arrière-plan notification !