La conférence de la WWDC a eu lieu et il y a encore beaucoup de rapports qui valent la peine d'être vus. Il y avait des sujets clés auxquels Apple a accordé une attention particulière. Core ML, Siri Shortcuts et, bien sûr, les modifications apportées aux notifications.
Étant donné que tout le monde n'a pas suffisamment de temps libre pour se frayer un chemin dans la jungle de la documentation, ce qui, comme cela arrive généralement, laisse beaucoup à désirer au stade des tests bêta, j'ai préparé un examen des nouvelles fonctionnalités et étayé le matériel par une mise en œuvre pratique. Lisez, comprenez et intégrez dans vos applications.
Commençons par un aperçu des fonctionnalités ajoutées par Apple.
Regroupement de notifications
Pour l'implémenter, vous n'avez rien à faire. iOS 12 regroupera automatiquement les messages pour vous. Mais il existe des nuances liées à la personnalisation, à la localisation et au regroupement, mais pas basées sur l'identifiant de l'application, mais, par exemple, en fonction du nom de l'utilisateur qui a envoyé la notification.
De plus, si vous allez tester le regroupement de notifications, notez qu'elles ne commenceront à être groupées que si toutes les notifications ne peuvent pas tenir à l'écran en même temps. Par exemple, sur l'écran de l'iPhone 8, vous devez placer 5 notifications ou plus.
Afin de ne pas surcharger ce matériel, j'ai mis les informations dans un article séparé .
Modifications de l'API NSExtensionContext
L'élément suivant est de nouvelles opportunités pour les notifications, et en particulier la classe NSExtensionContext . Il est responsable de l'interaction avec les widgets, Siri, la lecture de contenu multimédia. Nous sommes plus intéressés par les notifications. Deux méthodes et une variable ont été ajoutées:
var notificationActions: [UNNotificationAction] { get set }
La variable permet de remplacer l'ensemble des actions disponibles lors de l'interaction avec la notification:
func dismissNotificationContentExtension() func performNotificationDefaultAction()
Les méthodes ouvrent l'application ou masquent la notification.
Pour démontrer les possibilités, nous écrirons une petite application.
Tout d'abord, ajoutez à l'application en envoyant des notifications locales:
let actions = [ UNNotificationAction(identifier: "like-action", title: "Like", options: []), UNNotificationAction(identifier: "open-app", title: "Open App", options: []), UNNotificationAction(identifier: "dismiss", title: "Dismiss", options: []), ] let simpleCategory = UNNotificationCategory(identifier: "category-simple", actions: actions, intentIdentifiers: [], options: []) UNUserNotificationCenter.current().setNotificationCategories([simpleCategory])
- Nous créons des actions. L'en-tête, un identifiant qui vous permet de faire la distinction entre les actions de traitement et les options, est transmis à l'initialiseur. Les options peuvent indiquer que l'authentification de l'utilisateur est requise pour terminer l'action.
- Nous définissons une catégorie avec un identifiant. L'identifiant de catégorie vous permet de traiter et d'afficher différents types de notifications de différentes manières.
- La dernière étape consiste à définir la catégorie du centre de notification.
La deuxième méthode enverra une notification locale après une période spécifiée afin que nous puissions minimiser l'application ou verrouiller le téléphone:
UNUserNotificationCenter.current().getNotificationSettings { (settings) in guard settings.authorizationStatus == .authorized else { return } let content = UNMutableNotificationContent() content.title = "Cat Title" content.subtitle = "Cat Subtitle" content.body = "Cat Body" content.sound = .default content.categoryIdentifier = "category-simple" let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 3, repeats: false) let uuid = UUID().uuidString let request = UNNotificationRequest(identifier: uuid, content: content, trigger: trigger) UNUserNotificationCenter.current().add(request, withCompletionHandler: { (error) in }) }
- Vérifiez si l'utilisateur nous a permis d'envoyer des notifications.
- Nous créons une notification avec un en-tête et un texte et indiquons la catégorie à laquelle elle appartiendra. Dans ce cas, "catégorie simple".
- Réglez la gâchette de déclenchement après 3 secondes.
- Remplissez la demande d'envoi d'une notification. Dans ce cas, nous utilisons l' UUID comme identifiant. Cet identifiant peut être nécessaire si nous voulons annuler la notification planifiée.
- Ajoutez notre demande au centre de notification.
Ensuite, vous devez ajouter une nouvelle cible d' extension de contenu de notification à l'application. Il vous permet de personnaliser l'affichage des notifications et le traitement des actions.
Un fichier plist, ViewController et Storyboard seront créés:
Dans le fichier plist, nous nous intéressons aux clés suivantes:
- UNNotificationExtensionCategory - le nom de la catégorie qui sera traitée. Comme précédemment, spécifiez "catégorie simple".
- UNNotificationExtensionInitialContentSizeRatio - le rapport entre la hauteur de la notification et sa largeur. Affecte la taille de la notification après un affichage complet.
- UNNotificationExtensionUserInteractionEnabled - active ou désactive l'interaction avec les contrôles personnalisés. Dans notre cas, ce sera un bouton avec un coeur.
- UNNotificationExtensionDefaultContentHidden - masque le contenu de la notification, qui est générée par défaut.
Dans le storyboard, créez UIImageView, UILabel pour afficher le titre de la notification et UIButton pour interagir avec l'application.
Dans le contrôleur de vue, nous créons des méthodes pour ouvrir l'application et masquer la notification:
func openApp() { extensionContext?.performNotificationDefaultAction() } func dismissNotification() { extensionContext?.dismissNotificationContentExtension() }
Nous implémentons les méthodes du protocole UNNotificationContentExtension .
Le premier vous permettra d'afficher le texte nécessaire:
func didReceive(_ notification: UNNotification) { self.notificationTitleLabel.text = notification.request.content.body }
Le second est nécessaire pour gérer les actions de UNNotificationAction . Dans la même méthode, les actions sont substituées à l'aide de l' affectation extensionContext? .NotificationActions :
func didReceive(_ response: UNNotificationResponse, completionHandler completion: @escaping (UNNotificationContentExtensionResponseOption) -> Void) { switch response.actionIdentifier { case "like-action": let actions = [ UNNotificationAction(identifier: "1-star", title: "★", options: []), UNNotificationAction(identifier: "2-star", title: "★ ★", options: []), UNNotificationAction(identifier: "3-star", title: "★ ★ ★", options: []), ] extensionContext?.notificationActions = actions case "open-app": openApp() default: dismissNotification() } }
Le traitement des battements cardiaques est effectué comme d'habitude via IBAction :
@IBAction func defaultButtonTapped(_ sender: UIButton) { openApp() }
Nous lançons l'application et voyons ce que nous obtenons:
- Les pressages de UIButton sont traités.
- L'utilisation de UNNotificationAction vous permet de remplacer les options disponibles pour l'interaction.
Interaction avec les paramètres de notification
L'innovation suivante vous permet d'ajouter un nouvel élément de menu aux paramètres de notification. Lorsque vous appuyez dessus, une méthode est appelée que vous pouvez implémenter dans l'application. Par exemple, un utilisateur peut accéder directement à votre application à partir des paramètres système et inclure uniquement les notifications qu'il souhaite vraiment recevoir. Que faut-il faire pour la mise en œuvre?
Tout d'abord, lors de l'autorisation des notifications, nous ajoutons un paramètre supplémentaire - providesAppNotificationSettings :
UNUserNotificationCenter.current().requestAuthorization(options: [.badge, .alert, .sound, .providesAppNotificationSettings])
Deuxièmement, nous implémentons la méthode userNotificationCenter (_: openSettingsFor :) du protocole UNUserNotificationCenterDelegate :
extension AppDelegate: UNUserNotificationCenterDelegate { func userNotificationCenter(_ center: UNUserNotificationCenter, openSettingsFor notification: UNNotification?) { openSettings() } func openSettings() { let storyboard = UIStoryboard(name: "Settings", bundle: nil) let settings = storyboard.instantiateViewController(withIdentifier: "Settings") window?.rootViewController = settings } }
Notifications provisoires
L'utilisateur ne comprend pas toujours s'il souhaite recevoir des notifications de votre application. Par conséquent, lorsque vous démarrez l'application pour la première fois, il lui est difficile de faire un tel choix. Avec une forte probabilité, il refusera votre offre. Dans de telles situations, Apple suggère d'utiliser une autorisation provisoire. Lors de la demande d'autorisation d'envoyer des notifications, un paramètre supplémentaire est ajouté - provisoire . autorisation Le statut de ces notifications est également inclus dans la demande avec un statut provisoire .
UNUserNotificationCenter.current().requestAuthorization(options: [.badge, .alert, .provisional])
L'utilisateur ne recevra pas de demande d'autorisation lors du démarrage de l'application. Cependant, afin de ne pas le déranger, la demande est placée dans la soi-disant prison . Pour les notifications, les sons, les badges sont désactivés; ils sont affichés uniquement dans le Centre de notifications. Ils n'apparaîtront pas sur l'écran verrouillé ou sous forme de bannières.
Lorsqu'un utilisateur reçoit une notification, deux boutons supplémentaires apparaissent. L'un bloquera complètement les notifications ou proposera d'accéder aux paramètres, et le second traduira vos notifications en statut autorisé:
Alertes critiques
La dernière modification ajoute un autre type de notification: les alertes critiques . Ces notifications ignorent complètement les paramètres de votre téléphone, le son coupé ou le mode Ne pas déranger. Apple recommande de les utiliser dans des applications médicales (par exemple, le niveau de sucre a fortement augmenté pour l'utilisateur de l'appareil), ainsi que pour assurer la sécurité des utilisateurs à la maison ou dans les lieux publics.
La demande d'autorisation contient un caractère spécial:
Un nouvel élément est ajouté dans les paramètres et une icône supplémentaire s'affiche sur l'écran de notification:
Pour envoyer des notifications critiques, vous devrez passer par le processus de validation de votre application sur le site Apple .
Pour utiliser les notifications, utilisez le paramètre criticalAlert :
UNUserNotificationCenter.current().requestAuthorization(options: [.badge, .alert, .criticalAlert])
Et nous formons le contenu de la notification:
let content = UNMutableNotificationContent() content.title = "WARNING" content.body = "Storm alert" content.categoryIdentifier = "storm-alert" content.sound = UNNotificationSound.defaultCriticalSound(withAudioVolume: 1.0)
Pour les alertes critiques, vous pouvez spécifier le volume avec lequel la notification sera déclenchée quels que soient les paramètres de l'utilisateur.
J'espère que ce matériel simplifiera le processus d'introduction de nouvelles notifications dans votre application. Si vous ne pouviez pas comprendre certaines étapes de l'implémentation, je vous suggère de vous familiariser avec le code sur github ou de poser une question dans les commentaires.
Vous pouvez également regarder un article e-Legion sur les notifications pour iOS 10 ou un enregistrement de rapport de WWDC - Quoi de neuf dans les notifications utilisateur. Nous serons en mesure de discuter des innovations au MBLT DEV 2018 à Moscou le 28 septembre.
Passez une bonne journée et des otaries à fourrure à tout le monde ^ _ ^
UPD: La deuxième partie de l' article sur le regroupement des notifications déjà sur Habré.