Une introduction au framework UserNotifications

introduction

Avec iOS 10, tvOS 10 et watchOS 3, Apple introduit un nouveau cadre appelé le UserNotifications cadre. Ce nouvel ensemble d'API offre une manière unifiée, orientée objet, de travailler avec les notifications locales et distantes sur ces plates-formes. Ceci est particulièrement utile car, comparé aux API existantes, les notifications locales et distantes sont maintenant traitées de manière très similaire, et l'accès au contenu des notifications ne se fait plus uniquement à l'aide de dictionnaires..

Dans ce tutoriel, je vais passer en revue les bases de ce nouveau cadre et montrer comment vous pouvez facilement en tirer parti pour prendre en charge les notifications pour vos applications..

Ce tutoriel nécessite que vous exécutiez Xcode 8 avec les derniers kits de développement iOS, tvOS et watchOS..

1. Enregistrement pour les notifications

La première étape pour toute application prenant en charge les notifications consiste à demander l’autorisation de l’utilisateur. Comme avec les versions précédentes d'iOS, lors de l'utilisation du cadre UserNotifications, il est courant de le faire dès que l'application a fini de se lancer.. 

Avant d'utiliser l'une des API UserNotifications, vous devez ajouter l'instruction d'importation suivante à tous les fichiers de code Swift qui accèdent au framework:

importer UserNotifications

Ensuite, pour enregistrer votre application pour les notifications, vous devrez ajouter le code suivant à votre AppDéléguerde  application (_: didFinishLaunchingWithOptions :) méthode:

let center = UNUserNotificationCenter.current () let options: UNAuthorizationOptions = [.alert, .badge, .sound] center.requestAuthorization (options: options) (accordé, erreur) dans si accordé application.registerForRemoteNotifications ()

Initialement, avec ce code, nous obtenons une référence au courant UNUserNotificationCenter objet. Ensuite, nous configurons notre UNAuthorizationOptions avec les capacités de notification que nous voulons que notre application ait. Veuillez noter que vous pouvez avoir n'importe quelle combinaison d'options ici, par exemple, juste alerte ou les deux badge et du son

À l'aide de ces deux objets, nous demandons ensuite l'autorisation à notre application d'afficher des notifications en appelant le requestAuthorization (options: completionHandler :) méthode sur notre UNUserNotificationCenter exemple. Le bloc de code du gestionnaire d'achèvement comporte deux paramètres:

  • UNE Bool valeur indiquant si l'autorisation a été accordée ou non par l'utilisateur.
  • Une option Erreur objet qui contiendra des informations si, pour une raison quelconque, le système n'était pas en mesure de demander une autorisation de notification pour votre application.

Vous verrez que dans le code ci-dessus, si l'autorisation est accordée par l'utilisateur, nous nous enregistrons pour les notifications à distance. Si vous souhaitez implémenter les notifications push, cette ligne de code est requise. Vous devrez également faire un peu de configuration supplémentaire pour votre projet, comme détaillé dans ce tutoriel:

  • Configuration des notifications push sur iOS

    À l'origine, Apple avait introduit les notifications push pour permettre aux applications de réagir aux événements si l'application ne s'exécutait pas au premier plan. Cependant, le…
    Bart Jacobs
    Notifications push

Veuillez noter que l’enregistrement pour les notifications à distance appellera le même UIApplication méthodes de rappel comme dans les versions précédentes d'iOS. En cas de succès, application (_: didRegisterForRemoteNotificationsWithDeviceToken :) sera appelé, et application (_: didFailToRegisterForRemoteNotificationsWithError :) sera appelé en cas d'échec.

2. Notifications de planification

Pour cette section du didacticiel, nous nous concentrerons entièrement sur la planification des notifications locales à l'aide du cadre UserNotifications. L'envoi de notifications push à distance n'a pas changé en raison de l'introduction de ce nouveau cadre..

Une notification locale, avant d’être programmée, est représentée par une instance de UNNotificationRequest classe. Les objets de ce type sont constitués des composants suivants:

  • Identifiant: un unique Chaîne ce qui vous permet de distinguer les notifications individuelles les unes des autres.
  • Contenu: une UNNotificationContent objet contenant toutes les informations nécessaires à l'affichage de votre notification, notamment le titre, le sous-titre et le numéro de badge de l'application.
  • Déclencheur: une UNNotificationTrigger objet utilisé par le système pour déterminer quand votre notification doit être "envoyée" à votre application. 

Pour commencer, nous allons examiner les différents types de déclencheurs que vous pouvez configurer pour les notifications locales. le UNNotificationTrigger class est une classe abstraite, ce qui signifie que vous ne devez jamais en créer d'instance directement. Au lieu de cela, vous utiliserez les sous-classes disponibles. Actuellement, le cadre UserNotifications vous en fournit trois:

  • UNTimeIntervalNotificationTrigger, qui permet à une notification d'être envoyée une quantité de temps définie après la planification.
  • UNCalendarNotificationTrigger, qui permet d'envoyer une notification à une date et une heure spécifiques, quelle que soit l'heure à laquelle elle a été programmée.
  • UNLocationNotificationTrigger, qui permet d'envoyer une notification lorsque l'utilisateur entre ou quitte une région géographique désignée.

Le code suivant vous montre comment créer un déclencheur de chaque type:

let timeTrigger = UNTimeIntervalNotificationTrigger (timeInterval: 60.0 * 60.0, répète: false) var date = DateComponents () date.hour = 22 let calendarTrigger = UNCalendarNotificationTrigger (dateComposants (), date, heure de lecture: répète: true) 120.0) let region = CLCircularRegion (centre: centre, rayon: 500.0, identificateur: "Emplacement") region.notifyOnEntry = true; region.notifyOnExit = false; let locationTrigger = UNLocationNotificationTrigger (région: région, répète: false)

Avec le code ci-dessus, les conditions de déclenchement suivantes ont été créées:

  • le timeTrigger se déclenche une heure après la notification est prévue. le intervalle de temps paramètre passé dans le UNTimeIntervalNotificationTrigger l'initialiseur est mesuré en secondes.
  • le calendarTrigger va tirer à plusieurs reprises tous les jours à 22h00. La date et l’heure exactes du déclenchement de la gâchette peuvent facilement être modifiées en modifiant d’autres propriétés du DateComponents objet que vous passez dans le UNCalendarNotificationTrigger initialiseur.
  • le emplacementTrigger se déclenche lorsque l'utilisateur arrive à moins de 500 mètres de la coordonnée désignée, dans ce cas 40 ° N 120 ° E. Comme vous pouvez le constater d'après le code, ce type de déclencheur peut être utilisé pour toute taille de coordonnée et / ou de région et peut également déclencher une notification lors de l'entrée et de la sortie de la région..

Ensuite, nous devons créer le contenu de la notification. Ceci est fait en créant une instance du UNMutableNotificationContent classe. Cette classe doit être utilisée comme le standard UNNotificationContent la classe a un accès en lecture seule pour les différentes propriétés du contenu de la notification.

Le code suivant montre comment le contenu d'une notification de base peut être créé:

let content = UNMutableNotificationContent () content.title = "Titre de la notification" content.subtitle = "Sous-titre de la notification" content.body = "Certaines informations du corps de la notification doivent être affichées." content.badge = 1 content.sound = UNNotificationSound.default ()

Si vous voulez une liste complète des propriétés disponibles, jetez un coup d’œil à la UNMutableNotificationContent référence de classe.

Enfin, il ne reste plus qu’à créer le UNNotificationRequest objet et le programmer. Cela peut être fait avec le code suivant:

let request = UNNotificationRequest (identifiant: "LocalNotification", contenu: contenu, déclencheur: timeTrigger) UNUserNotificationCenter.current (). add (request) erreur dans if let error = erreur // Faire quelque chose avec une erreur else // Request a été ajouté avec succès

Initialement avec ce code, nous créons l'objet de requête en transmettant un identifiant, un objet de contenu et un déclencheur à l'initialiseur. Nous appelons ensuite le add (_: completionHandler :) méthode sur le courant UNUserNotificationCenter object et utiliser le gestionnaire d'achèvement pour exécuter la logique selon que la notification a été programmée correctement ou non. 

3. Recevoir des notifications

Lorsque vous utilisez la structure UserNotifications, le traitement des notifications entrantes est géré par un objet que vous désignez conforme à la UNUserNotificationCenterDelegate protocole. Cet objet peut être ce que vous voulez et ne doit pas obligatoirement être le délégué de l'application comme dans les versions précédentes d'iOS.. 

Cependant, il est important de noter que vous devez définir votre délégué avant le lancement complet de votre application. Pour une application iOS, cela signifie que vous devez affecter votre délégué à l'intérieur du application (_: willFinishLaunchingWithOptions :) ou application (_: didFinishLaunchingWithOptions :) méthode de votre délégué d'application. La définition du délégué pour les notifications utilisateur se fait très facilement avec le code suivant:

UNUserNotificationCenter.current (). Delegate = delegateObject

Désormais, avec votre ensemble de délégués, lorsqu'une notification est reçue par l'application, vous ne devez vous soucier que de deux méthodes. Les deux méthodes sont passées un UNNotification objet, qui représente la notification en cours de réception. Cet objet contient un rendez-vous amoureux propriété, qui vous indique exactement quand la notification a été remise, et un demande propriété, qui est une instance de la UNNotificationRequest classe mentionnée plus tôt. À partir de cet objet de requête, vous pouvez accéder au contenu de la notification ainsi qu'au déclencheur (si nécessaire) de la notification. Cet objet déclencheur sera une instance de l'un des UNNotificationTrigger sous-classes mentionnées précédemment ou, dans le cas des notifications push, une instance de UNPushNotificationTrigger classe.

La première méthode définie par le UNUserNotificationCenterDelegate le protocole est le userNotificationCenter (_: willPresent: withCompletionHandler :) méthode. Ceci n'est appelé que lorsque votre application est en cours d'exécution au premier plan et reçoit une notification. À partir de là, vous pouvez accéder au contenu de la notification et afficher votre propre interface personnalisée dans votre application si nécessaire. Vous pouvez également demander au système de présenter la notification avec une variété d'options, comme cela serait normalement le cas si votre application n'était pas en cours d'exécution. Les options disponibles sont:

  • Alerte pour afficher l'interface générée par le système pour la notification
  • Son pour jouer le son associé à la notification
  • Badge pour modifier le badge de votre application sur l'écran d'accueil de l'utilisateur

 Le code suivant montre un exemple de mise en oeuvre de la userNotificationCenter (_: willPresent: withCompletionHandler :) méthode:

func userNotificationCenter (_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) let content = notification.request.content // Traitement du contenu de la notification, notification. / Affiche la notification comme alerte normale et joue le son

L’autre méthode définie par le UNUserNotificationCenterDelegate le protocole est le userNotificationCenter (_: didReceive: withCompletionHandler :) méthode. Cette méthode est appelée lorsque l'utilisateur interagit avec une notification pour votre application de quelque manière que ce soit, y compris en la rejetant ou en ouvrant votre application.. 

Au lieu d'une UNNotification objet, cette méthode a un UNNotificationResponse objet passé en paramètre. Cet objet contient le UNNotification objet représentant la notification livrée. Il comprend également un actionIdentifier propriété pour déterminer comment l'utilisateur a interagi avec la notification. Dans le cas où la notification est rejetée ou que votre application est ouverte, le cadre UserNotifications fournit des identificateurs d'action constants que vous pouvez comparer avec.

Le code suivant montre un exemple de mise en oeuvre de la userNotificationCenter (_: didReceive: withCompletionHandler :) méthode:

func userNotificationCenter (_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler achèvementHandler: @escaping () -> Void) (laissez actionIdentifier = response.actionIdentifier switch actionIdentifier case UNNotificationDismiss ) cas UNNotificationDefaultActionIdentifier: // L'application a été ouverte à partir de la notification // Effectuer quelque chose d'achèvementHandler () par défaut: completionHandler ()

Veuillez noter que pour les deux méthodes de délégation, il est essentiel d'appeler le gestionnaire d'achèvement dès que le traitement de la notification est terminé. Une fois que vous avez terminé, le système sait que vous en avez terminé avec la notification et peut exécuter tous les processus nécessaires, tels que l'insertion de la notification dans le Centre de notifications de l'utilisateur..

4. Gestion des notifications

Parfois, un utilisateur de votre application peut recevoir plusieurs notifications lorsque votre application n'est pas en cours d'exécution. Ils peuvent également ouvrir votre application directement à partir de l'écran d'accueil et non via une notification. Dans aucun de ces cas, aucun des deux UNUserNotificationCenterDelegate les méthodes de protocole seront appelées. Lorsque vous travaillez avec des notifications locales, vous pouvez également parfois vouloir supprimer une notification programmée avant qu'elle ne soit affichée à l'utilisateur..

De ce fait, la structure UserNotifications fournit les méthodes suivantes sur la version actuelle. UNUserNotificationCenter instance à utiliser avec les notifications locales en attente et les notifications livrées qui n’ont pas encore été traitées:

  • getPendingNotificationRequests (completionHandler :) vous fournit un tableau de UNNotificationRequest objets dans le gestionnaire d'achèvement. Ce tableau contiendra toutes les notifications locales que vous avez planifiées et qui n'ont pas encore été déclenchées..
  • removePendingNotificationRequests (withIdentifiers :) supprime toutes les notifications locales planifiées avec les identifiants contenus dans Chaîne tableau que vous passez en paramètre.
  • removeAllPendingNotificationRequests supprime toutes les notifications locales planifiées pour votre application.
  • getDeliveredNotifications (completionHandler :) vous fournit un tableau de UNNotification objets dans le gestionnaire d'achèvement. Ce tableau contiendra toutes les notifications délivrées pour votre application qui sont toujours visibles dans le centre de notifications de l'utilisateur..
  • removeDeliveredNotifications (withIdentifiers :) supprime toutes les notifications livrées avec les identifiants contenus dans Chaîne tableau que vous transmettez à partir du centre de notifications de l'utilisateur.
  • removeAllDeliveredNotifications supprime toutes les notifications livrées pour votre application.

5. Notifications d'actions personnalisées

La structure UserNotifications permet également à votre application de tirer facilement parti des catégories et des actions de notification personnalisées introduites dans iOS 8.. 

Tout d'abord, vous devez définir les actions personnalisées et les catégories que votre application prend en charge à l'aide du UNNotificationAction et UNNotificationCategory classes respectivement. Pour les actions pour lesquelles vous souhaitez que l'utilisateur puisse saisir du texte, vous pouvez utiliser le UNTextInputNotificationAction classe, qui est une sous-classe de UNNotificationAction. Une fois vos actions et catégories définies, il vous suffit alors d’appeler le setNotificationCategories (_ :) méthode sur le courant UNUserNotificationCenter exemple. Le code suivant montre comment vous pouvez facilement enregistrer une réponse et supprimer des actions pour une notification de catégorie de message dans votre propre application:

let replyAction = UNTextInputNotificationAction (identifiant: "com.usernotificationstutorial.reply", titre: "Réponse", options: [], textInputButtonTitle: "Envoyer", textInputPlaceholder: "Tapez votre message") let deleteAction = UNNotificationAction (identifiant: "com." usernotificationstutorial.delete ", titre:" Supprimer ", options: [.authenticationRequired, .destructive]) let category = UNNotificationCategory (identifiant:" com.usernotificationstutorial.message ", actions: [replyAction, deleteAction], intentIdentifiers: [], options : []) center.setNotificationCategories ([catégorie])

Ensuite, lorsqu'un utilisateur utilise l'une de vos actions de notification personnalisées, le même userNotificationCenter (_: didReceive: withCompletionHandler :) La méthode que nous avons abordée précédemment est appelée. Dans ce cas, l'identifiant d'action du UNNotificationResponse L'objet transmis sera le même que celui que vous avez défini pour votre action personnalisée. Il est également important de noter que, si l'utilisateur interagit avec une action de notification d'entrée de texte, l'objet de réponse transmis à cette méthode sera de type UNTextInputNotificationResponse.

Le code suivant montre un exemple d'implémentation de cette méthode, incluant la logique pour les actions créées précédemment:

func userNotificationCenter (_ center: UNUserNotificationCenter, réponse didReceive: UNNotificationResponse, withCompletionHandler achèvementHandler: @escaping () -> Nul: a été congédié par l'utilisateur // Cas quelque chose completionHandler () UNNotificationDefaultActionIdentifier: // L'application a été ouverte à partir de la notification // Motif d'achèvement de tâche ")" com.usernotificationstutorial.reply ": si laissez textResponse = response as? UNTextInputNotificationResponse let reply = textResponse.userText // Envoi du message de réponse d'achèvementHandler () cas "com.usernotificationstutorial.delete": // Suppression du message d'achèvementHandler () par défaut: achèvementHandler ()

En outre, si vous souhaitez tirer parti des actions personnalisées pour vos notifications locales, vous pouvez simplement définir la catégorieIdentifiant propriété sur votre UNMutableNotificationContent objet lors de la création de la notification.

Conclusion

Le nouveau framework UserNotifications fournit des API orientées objet entièrement fonctionnelles et faciles à utiliser pour travailler avec les notifications locales et distantes sur iOS, watchOS et tvOS. Il est très facile de planifier les notifications locales pour une variété de scénarios et de simplifier grandement le flux de traitement des notifications entrantes et des actions personnalisées..

Comme toujours, veillez à laisser vos commentaires dans les commentaires ci-dessous. Et consultez certains de nos autres articles et tutoriels sur les nouvelles fonctionnalités d'iOS 10 et watchOS 3.!