Tout ce que vous avez toujours voulu savoir sur les notifications dans iOS

Jolies petites alertes ..?

Les notifications sont un moyen d'informer les utilisateurs lorsque de nouvelles données deviennent disponibles pour leurs applications, même lorsque l'application ne s'exécute pas au premier plan.

Par exemple, une application de messagerie peut informer l'utilisateur de l'arrivée d'un nouveau message et une application de calendrier peut informer l'utilisateur d'un rendez-vous à venir.

Avec la sortie d' iOS-10, Apple a introduit de tout nouveaux frameworks pour prendre en charge les notifications, qu'elles soient locales ou distantes.Cette version était axée sur les notifications personnalisées .

Sans perdre de temps, passons rapidement aux détails.

Types de notifications

Nous pouvons globalement classer les notifications en deux catégories:

  • Notifications locales - l'application configure les détails de notification localement et transmet ces détails au système. Le système gère ensuite la remise de la notification lorsque l'application n'est pas au premier plan.
  • Notifications à distance - vous utilisez l'un des serveurs de votre entreprise pour transmettre des données aux appareils des utilisateurs via le service Apple Push Notification (APN).

Plus bas dans l'article, nous verrons comment nous pouvons obtenir les deux types de notification. Commençons par une introduction à ce nouveau cadre de notification que nous pouvons utiliser pour notre cause.

Quoi de neuf dans iOS-10 pour les notifications?

Avec la sortie d' iOS-10 , Apple a introduit deux nouveaux frameworks pour gérer les notifications:

  • User Notifications Framework - gère les notifications locales et distantes.
  • User Notifications UI Framework - personnalise l'apparence de l'interface de notification du système.

Nous utiliserons ces deux frameworks et certaines API spécifiques à la plateforme pour configurer nos notifications.

Avec les frameworks, l' extension d'application de service de notificationa également été introduit qui vous permet de modifier le contenu des notifications à distance avant leur livraison.

Apple permet également de personnaliser l'interface utilisateur de votre notification via l' extension de contenu de notification .

Est-ce trop à retenir? Ouais ... c'est sûrement ça. Mais ne t'inquiète pas. Nous verrons tout étape par étape avec le code correspondant. Vas-y doucement. ?

Tout d'abord, configurez-le!

Demander une autorisation

Pour que notre application informe l'utilisateur de quoi que ce soit, nous devons savoir si la personne qui l'utilise le souhaite en premier lieu. Peut-être qu'ils n'aiment pas que leur téléphone sonne et affiche des alertes tout le temps? ou peut-être veulent-ils vraiment les mises à jour, mais pas ce son irritant ... naahhh! ☠️

Donc, tout d'abord, nous devons obtenir la permission de l'utilisateur que nous allons notifier. Et c'est assez simple - juste deux lignes de code et nous avons terminé:

Vous devez écrire ce code dans AppDelegate’smethod - application:didFinishLaunchingWithOptions:avant d'en revenir.

Remarque: étant donné que le système enregistre la réponse de l'utilisateur, les appels à la requestAuthorization(options:completionHandler:)méthode lors des lancements suivants n'invitent pas à nouveau l'utilisateur.

Ajout de catégories et d'actions - Notifications exploitables

L'infrastructure des notifications utilisateur prend en charge l'ajout de catégories et d'actions aux notifications.

Catégories - Définissez les types de notifications que l'application prend en charge et communiquez au système comment nous voulons qu'une notification soit présentée.

Actions - Chaque catégorie peut avoir jusqu'à quatre actions associées. Les actions sont essentiellement des boutons personnalisés qui, en appuyant sur, rejettent l'interface de notification et transfèrent l'action sélectionnée à l'application pour une gestion immédiate.

Okayyy! Et qu'est ce que ca veut dire..??? Certains codes peuvent vous aider à mieux comprendre:

Dans le code ci-dessus, nous avons simplement créé une catégorie nommée INVITATIONavec quatre actions différentes - remindLater , accepter , déclin , etcommenter .

Les catégories et actions sont identifiées de manière unique par leurs identifiants. Chaque fois qu'une notification avec une catégorie est délivrée, le système présente la notification avec toutes les actions associées à cette catégorie une fois que l'utilisateur l'a développée. Voici à quoi cela ressemblera:?

Définissez toutes les catégories et actions juste en dessous où vous avez configuré les notifications dans la application:didFinishLaunchingWithOptions:méthode.

Incluez l'identifiant de catégorie (par exemple INVITATION) lors de la planification de votre notification, que ce soit localement ou à distance. Nous verrons comment faire cela dans la section suivante.

Planification des notifications locales

Maintenant que nous avons fini de configurer nos notifications, voyons comment en planifier une à partir de l'application .

La planification d'une notification locale ne nécessite que trois étapes simples:

  1. Préparez le contenu
  2. Ajouter un déclencheur - quand la notification doit être déclenchée
  3. Planifiez-le pour la livraison

Continuons rapidement avec le code, pour ne pas nous confondre avec tout ce qui se passe ici. LOL?

Dans le code ci-dessus, avec les autres contenus, nous avons également fourni un categoryIdentifierpour prendre en charge les notifications exploitables. Si nous ne le faisons pas, le système adoptera son comportement par défaut.

C'est ça. C'est tout ce dont vous avez besoin. Et oui ça marche vraiment ... hehehe.? Essayez-le avant de continuer. Vous pouvez télécharger l'exemple ici.

Remarque : les applications se comportent différemment en arrière-plan et au premier plan chaque fois qu'une notification est envoyée.

  1. L'application ne fonctionne pas / Application en arrière - plan - le système affiche les notifications locales directement à l'utilisateur. Nous ne recevons aucun rappel dans l'application pour cela.
  2. Application au premier plan - le système donne à l'application la possibilité de gérer la notification en interne. Le système coupe par défaut les notifications pour les applications de premier plan .

Lorsque l'application est au premier plan pendant que la notification est envoyée, nous obtenons la UNUserNotificationCenterDelegate'sméthode de rappel dans userNotificationCenter(_:willPresent:withCompletionHandler:)laquelle vous pouvez décider de gérer la notification en silence ou d'alerter l'utilisateur à ce sujet.

N'oubliez pas de vous conformer AppDelegateau UNUserNotificationCenterDelegateprotocole et de le définir comme délégué de l' UNUserNotificationCenterobjet partagé dans application:didFinishLaunchingWithOptions:.

let center = UNUserNotificationCenter.current()
center.delegate = self

Nous en avons terminé avec les notifications locales pour le moment. Passons maintenant à la façon dont nous pouvons planifier une notification depuis l'extérieur de notre application. Avant cela, voyons comment répondre aux actions personnalisées.

Répondre aux actions des utilisateurs

Configurer les notifications? ✔ Planification des notifications? ✔

Qu'en est-il de toucher une notification ou une action personnalisée dans la notification? Où cela mènera-t-il? Dans les deux cas, le système notifie à l'application le choix de l'utilisateur.

Chaque fois que l'utilisateur effectue une action dans la notification, la réponse est envoyée à UNUserNotificationCenterDelegate'smethod - userNotificationCenter(_:didReceive:withCompletionHandler:), où nous pouvons fournir un traitement spécifique à chaque action.

Remarque: si l'application n'est pas en cours d'exécution lors de la réception d'une réponse, le système lance l'application en arrière-plan pour traiter la réponse.

Notifications à distance

La notification push ou les notifications à distance, peu importe comment nous les appelons, sont l'une des plus fréquemment utilisées avec de nombreux cas d'utilisation.

Que ce soit les médias sociaux, le calendrier ou l'une des applications utilitaires, nous pouvons les voir presque partout. Des applications d'actualités nous informant du dernier contenu, à Medium lui-même qui nous alerte des derniers articles publiés.

Vous êtes-vous déjà demandé comment font-ils cela? Notifications locales ?? Ça pourrait être… ça fait la même chose - non? Peut-être pouvons-nous faire plus de configuration dans le local lui-même et faire fonctionner cela?

Mais Medium, par exemple, n'a pas accès à l'application sur notre appareil personnel, alors comment pourrait-il planifier des notifications? Exactement! Ça ne peut pas. C'est quelque chose de différent et quelque chose de plus que de simples locaux.

Ok, que diriez-vous d'envoyer la notification à un moment donné et de la montrer à un autre moment - cela répondra-t-il à notre question? Oui, ça le sera sûrement. Mais comment faire ça? Notifications à distance c'est.

C'est exactement ce qu'ils font. C'est la fonctionnalité qui a résolu LE GRAND PROBLÈME de «Se tenir à jour».

Terminologie

  • APN - la pièce maîtresse de la fonction de notification à distance. Il s'agit d'un service cloud qui permet aux applications tierces approuvées installées sur les appareils Apple d'envoyer des notifications push d'un serveur distant aux utilisateurs via une connexion sécurisée.
  • Jeton d'appareil - Un jeton spécifique à l'application qui est unique au monde et identifie une combinaison application-appareil. Il permet la communication entre le fournisseur, les APN et l'appareil.
  • Fournisseur - Serveur qui envoie réellement la notification à distance, y compris le jeton de périphérique et d'autres informations aux APN.

Remarque importante : ne mettez jamais en cache les jetons de périphérique dans votre application. Au lieu de cela, récupérez-les du système lorsque vous en avez besoin.

Les APN émettent un nouveau jeton d'appareil sur votre application lorsque certains événements se produisent. Le jeton d'appareil est garanti différent, par exemple, lorsqu'un utilisateur restaure un appareil à partir d'une sauvegarde, lorsque l'utilisateur installe votre application sur un nouvel appareil et lorsque l'utilisateur réinstalle le système d'exploitation.

Lorsque vous essayez d'extraire un jeton d'appareil mais qu'il n'a pas changé, la méthode d'extraction retourne rapidement.

Remarque: la capacité des APN à fournir des notifications à distance à une application non en cours d'exécution nécessite que l'application ait été lancée au moins une fois.

Comment ça marche réellement

Vous trouverez ci-dessous une petite explication rapide de la façon dont toutes les technologies ci-dessus fonctionnent ensemble en synchronisation pour terminer le flux de travail des notifications à distance.

  1. Apps'inscrit auprès d' APN
  2. Les APN envoient un jeton d' appareil à l' appareil avec puis l'envoient à l' application
  3. L'application envoie ce jeton d'appareil au fournisseur
  4. Le fournisseur envoie des notifications avec ce jeton d'appareil aux APN qui les envoient ensuite à l' appareil qui l'envoie ensuite à l' application .

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.

Gérez-le dans l'application

Maintenant que nous savons ce que sont les notifications à distance et ce qui est nécessaire pour les faire fonctionner, passons maintenant à la façon dont nous pouvons faire en sorte que notre application les prenne en charge. Parce que rien ne se passe tout seul?. Nous devons faire quelques configurations pour qu'ils fonctionnent.

Pour pouvoir gérer les notifications à distance, notre application doit:

  1. Activez les notifications à distance dans les capacités - un seul clic et vous avez terminé cette étape. Dans l' onglet Capabilities de notre projet Xcode, activez l' option Push Notifications . Assurez-vous que les notifications push sont ajoutées à l'ID d'application que nous utilisons pour le projet.

2. Inscrivez-vous au service Apple Push Notification (APN) et recevez un jeton d'appareil spécifique à l'application

La demande d'enregistrement auprès des APN est simple et rapide. Ajoutez simplement le code ci-dessous dans la UIApplicationDelegate’sméthode - application:didFinishLaunchingWithOptions:avant d'en revenir.

UIApplication.shared.registerForRemoteNotifications()

Maintenant, il y a deux possibilités: soit nous nous enregistrons avec succès, soit le processus échoue.

En cas d'inscription réussie, les APN envoient un jeton d'appareil spécifique à l'application à l'appareil dans UIApplicationDelegate’smethod— application:didRegisterForRemoteNotificationsWithDeviceToken:.

En cas de défaillance, nous recevons un rappel dans UIApplicationDelegate’smethod— application:didFailToRegisterForRemoteNotificationsWithError:.

3. Envoyez le jeton d'appareil au serveur du fournisseur de notifications

À partir de maintenant, nous avons reçu le jeton d'appareil des APN . Maintenant, nous devons envoyer ce jeton à notre fournisseur, qui l'utilisera tout en envoyant des notifications sur notre appareil.

Comme nous n'avons pas de fournisseur, pour l'instant nous pouvons utiliser Easy APNs Provider pour tester nos notifications push. Plus bas, nous verrons comment exactement nous pouvons utiliser cet outil.

Pour l'instant, téléchargez-le et installez-le sur votre Mac.

4. Mettre en œuvre la prise en charge de la gestion des notifications distantes entrantes

Nous avons notre jeton d'appareil et notre fournisseur le sait également. Ensuite, le fournisseur enverra la notification comprenant ce jeton et d'autres informations, et nous l'obtiendrons sur notre appareil.

Maintenant quoi? Que se passera-t-il quand il arrivera? Comment apparaîtra-t-il sur l'appareil? Que se passera-t-il lorsque nous tapoterons dessus? Qu'en est-il de toutes les actions que nous avons configurées précédemment? Pouvons-nous les amener ici?

Trop de questions ❓❓❓Eh bien, ne vous inquiétez pas. Nous aurons des réponses à chacun d'entre eux une par une.

Que se passera-t-il quand il arrivera? Nous aurons un rappel dans UIApplicationDelegate’smethod— application(_:didReceiveRemoteNotification:fetchCompletionHandler:). Il indique à l'application qu'une notification à distance est arrivée indiquant qu'il y a des données à récupérer.

Comment apparaîtra-t-il sur l'appareil? Il apparaîtra avec l'interface de notification par défaut. Si la charge utile de la notification est configurée avec la catégorie , elle apparaîtra comme notification actionnable avec toutes les actions attachées à cette catégorie. Nous discuterons de la charge utile dans la section suivante.

Que se passera-t-il lorsque nous tapoterons dessus? Identique aux notifications locales. UNUserNotificationCenterDelegate'smethod - userNotificationCenter(_:didReceive:withCompletionHandler:)est appelée avec l'objet de réponse.

Gérez-le sur le fournisseur

Nous avons couvert la plupart des choses dont nous avons besoin pour intégrer les notifications push dans notre application. Bien que nous sachions comment les gérer dans l'application, nous sommes encore à court de les gérer sur le fournisseur.

Nous avons le fournisseur. Il sait quel jeton d'appareil utiliser, mais cela seul ne fera pas apparaître une notification sur notre appareil avec un titre et d'autres détails. Il ne fera apparaître aucune des actions non plus.

Ainsi, l'envoi de notifications du fournisseur nécessite les éléments suivants:

  1. Un jeton d'appareil
  2. Certificat APNs - nous pouvons l'obtenir à partir du compte développeur
  3. Charge utile - toutes les données personnalisées que vous souhaitez envoyer à votre application, et comprend des informations sur la manière dont le système doit notifier l'utilisateur. Il s'agit simplement d'un dictionnaire JSON avec des paires clé-valeur. L'illustration ci-dessous peut vous aider à mieux la comprendre.

Voyons tout ce qu'il y a dans ce dictionnaire JSON :

  1. apsdictionnaire- le plus important. Contient des clés définies par Apple et est utilisé pour déterminer comment le système qui reçoit la notification doit alerter l'utilisateur.
  2. alertedictionnaire- c'est plus un élément explicite. Fournit le contenu de la notification.
  3. catégorie - pour les notifications exploitables. Toutes les actions attachées à cette catégorie seront disponibles dans les notifications.
  4. contenu disponible- Pour prendre en charge une notification de mise à jour en arrière-plan, définissez cette clé sur 1.
  5. contenu-mutable- Pour activer la modification d'une notification via l' extension d'application de service de notification , définissez-la sur 1.

Ici, vous pouvez en savoir plus sur la personnalisation de la charge utile selon vos besoins. Ceci est une référence aux clés que nous pouvons ajouter dans le dictionnaire aps

Extension d'application du service de notification

À ce stade, nous savons quelles notifications à distancesont, comment ils fonctionnent, tout ce dont nous avons besoin pour les faire fonctionner - à peu près tout! Depuis que nous venons de les faire fonctionner parfaitement✌️.

Maintenant, la question est de savoir si nous voulons modifier un contenu dans la notification reçue du fournisseur, avant de le présenter sur l'appareil? Que faire si la notification contient un lien d'image que nous devons télécharger avant de la livrer à l'utilisateur? Pouvons-nous faire cela avec ce que nous savons déjà? Nous n'avons pas accès au fournisseur… alors comment allons-nous?

On ne peut pas en fait. Nous ne pouvons pas changer ce que nous obtenons, mais nous pouvons certainement changer ce que nous présentons.

C'est ce à quoi sert l' extension d'application de service de notification: modifier le contenu des notifications à distance avant la livraison. C'est aussi simple que ça en a l'air. Pas de code sophistiqué, rien. C'est vraiment très simple.

Ajout de l'extension de service de notification au projet

Les extensions dans un projet xcode sont ajoutées en tant que cible. Sélectionnez Fichier - Nouveau - Cible - Extension du service de notification.

Conditions préalables

Avant de commencer à modifier le contenu, il existe certaines restrictions sur le moment où le contenu peut être modifié.

Le contenu ne peut être modifié que si:

  • La notification à distance est configurée pour afficher une alerte.
  • Le dictionnaire aps de la notification distante inclut la clé de contenu mutable avec la valeur définie sur 1.

Nous ne pouvons pas modifier les notifications silencieuses ou celles qui diffusent uniquement un son ou insèrent l'icône de l'application.

Ainsi, pour prendre en charge toute modification du contenu des notifications, ces conditions doivent être remplies.

Modifier le contenu

La cible d'extension de service de notification par défaut fournie par Xcode contient une sous-classe de la UNNotificationServiceExtensionclasse que nous devons modifier.

Il contient deux méthodes:

  1. didReceive(_:withContentHandler:)- apportez les modifications nécessaires à la notification et informez le système lorsque vous avez terminé. Cette méthode a un temps limité (environ 30 secondes) pour effectuer sa tâche et exécuter le bloc de complétion fourni.
  2. serviceExtensionTimeWillExpire()- Nous dit que l'extension est sur le point d'être terminée. Donnez-nous une dernière chance de soumettre nos modifications. Si nous ne mettons pas à jour le contenu de la notification avant l'expiration du délai, le système affiche le contenu d'origine.

Regardons un exemple. Nous allons changer le corps de la charge utile dans l' extrait de code 7 en « Adresse: Sea Shells Apartments, Mumbai ».

Toute l'implémentation par défaut des deux méthodes est fournie par l'extension elle-même. Nous devons simplement apporter les modifications souhaitées, comme dans la ligne 8 de l'extrait de code ci-dessus. Juste une seule ligne de code pour le moment. De même, vous pouvez modifier d'autres champs selon vos besoins.

Extension de contenu de notification

Avoir une interface utilisateur accrocheuse est toujours mieux qu'une simple interface utilisateur par défaut. Ajouter des couleurs et de jolies polices n'est jamais une mauvaise idée. Nous allons faire de même avec nos notifications pour leur donner un aspect Wow !?

Et et et… Apple est de nouveau là à notre secours. C'est l'extension de contenu de notification . Cela présente une interface personnalisée pour un local livréounotification à distance .

Ajout d'une extension de contenu de notification au projet

Je pense que nous savons déjà comment faire cela. Pas nous? Nous allons à la même chose que nous avons fait pour ajouter l' extension de service de notification . Sélectionnez Fichier - Nouveau - Cible - Extension de contenu de notification.

Ajout de clés à Info.plist de l'extension

Pour prendre en charge l'interface utilisateur personnalisée pour les notifications locales et distantes, nous devons apporter des modifications dans le fichier Info.plist d'extension de contenu.

  1. UNNotificationExtensionCategory (reqd.) - Une chaîne ou un tableau de chaînes. Chaque chaîne contient l'identifiant d'une catégorie déclarée par l'application. La catégorie , je dois dire, est vraiment très importante pour les notifications. L'interface utilisateur personnalisée n'apparaîtra que pour les notifications appartenant aux catégories spécifiées.
  2. UNNotificationExtensionInitialContentSizeRatio (reqd.) - Un nombre à virgule flottante qui représente la taille initiale de la vue du contrôleur de vue exprimée sous la forme d'un rapport entre sa hauteur et sa largeur . C'est le contrôleur de vue que nous utiliserons pour créer une interface utilisateur personnalisée. Nous en discuterons dans la prochaine section.
  3. UNNotificationExtensionDefaultContentHidden - si true : affiche uniquement le contenu personnalisé. Si faux : affiche le contenu personnalisé + par défaut.
  4. UNNotificationExtensionOverridesDefaultTitle - si vrai : définissez le titre de la notification sur le titre du contrôleur de vue. Si faux : le titre de la notification est défini sur le nom de l'application.

Voici une illustration qui peut nous aider à mieux comprendre les touches ci-dessus.

Dans l'illustration ci-dessus, les clés dans Info.plist sont configurées comme:

  1. UNNotificationExtensionCategory - INVITATION
  2. UNNotificationExtensionInitialContentSizeRatio - 1
  3. UNNotificationExtensionDefaultContentHidden - false
  4. UNNotificationExtensionOverridesDefaultTitle - false

Création de l'interface utilisateur personnalisée

L'extension de contenu de notification nous fournit un UIViewControllerqui est conforme au UNNotificationContentExtensionprotocole. Ce contrôleur présente l'interface de la notification. Le Storyboardfichier dans l'extension contient un seul ViewController que nous pouvons utiliser pour créer n'importe quelle interface utilisateur que nous voulons que la notification présente.

Une fois que nous avons créé l'interface utilisateur, nous devons connecter les éléments dans le NotificationViewControllerafin de remplir les détails. Chaque fois qu'une notification arrive avec une catégorie attendue , nous recevons un rappel dans UNNotificationContentExtension’smethod - didReceive(_:). C'est ici que nous pouvons ajouter des détails à notre interface utilisateur personnalisée.

Nous avons presque terminé avec l'interface utilisateur personnalisée de notre notification. Encore une chose. Étant donné que l'interface utilisateur personnalisée est associée à la catégorie des notifications ,qui peuvent avoir des actions qui y sont attachées. Et… vous avez raison! «Nous obtiendrons nos actions automatiquement sans aucune manipulation personnalisée. Brillant!?

Contenu + Belle interface utilisateur + Actions personnalisées - Tout est fait. Que demander de plus? Apple, tu es géniale!?

Un dernier point: nous pouvons également ajouter une gestion aux actions personnalisées dans l'extension. Le système appelle la didReceive(_:completionHandler:)méthode pour répondre aux actions sélectionnées. Si notre contrôleur de vue n'implémente pas cette méthode, le système fournit l'action sélectionnée à votre application pour la gestion.

Si elle est mise en œuvre, nous devons gérer toutes les actions possibles dans cette méthode. Une chose qui est importante ici est la completionfermeture.

completion: Le bloc à exécuter lorsque vous avez terminé d'effectuer l'action. Vous devez appeler ce bloc à un moment donné de votre implémentation. Le bloc n'a pas de valeur de retour.

La fermeture accepte un seul paramètre dismissde type UNNotificationContentExtensionResponseOption. Nous proposons les options suivantes:

  1. doNotDismiss - Ne fermez pas l'interface de notification.
  2. dismiss - Ignorez l'interface de notification.
  3. dismissAndForwardAction--Ignorez l'interface de notification et transférez la notification à l'application.

Cela résume nos notifications. Trop de choses à retenir? La pratique fait des progrès ?. Essayez de créer vos propres notifications maintenant!

Exemple de projet

Vous pouvez télécharger l'exemple de projet à partir d'ici.

Et le projet d'exemple pour l' extension de contenu de notification peut être trouvé ici.

Lectures complémentaires

N'oubliez pas de lire mes autres articles:

  1. Tout sur Codable dans Swift 4
  2. Colorez-le avec GRADIENTS - iOS
  3. Codage pour iOS 11: Comment faire glisser et déposer dans des collections et des tableaux
  4. Tout ce que vous devez savoir sur les extensions d'aujourd'hui (widget) dans iOS 10
  5. Sélection de UICollectionViewCell simplifiée .. !!

N'hésitez pas à laisser des commentaires au cas où vous auriez des questions.