iOS 12: Neu in Benachrichtigungen

Die WWDC-Konferenz wurde abgehalten, und es gibt immer noch viele sehenswerte Berichte. Es gab Schlüsselthemen, denen Apple besondere Aufmerksamkeit schenkte. Core ML, Siri Shortcuts und natürlich Änderungen an Benachrichtigungen.



Da nicht jeder genug Freizeit hat, um sich durch den Dschungel der Dokumentation zu bewegen, was, wie es normalerweise der Fall ist, in der Beta-Testphase zu wünschen übrig lässt, habe ich eine Überprüfung der neuen Funktionen vorbereitet und das Material mit praktischer Implementierung untermauert. Lesen, verstehen und integrieren Sie Ihre Anwendungen.


Beginnen wir mit einem Überblick über die Funktionen, die Apple hinzugefügt hat.


Benachrichtigungsgruppierung


Zur Implementierung müssen Sie nichts tun. iOS 12 gruppiert Nachrichten automatisch für Sie. Es gibt jedoch Nuancen, die sich auf die Anpassung, Lokalisierung und Gruppierung beziehen, jedoch nicht auf der Anwendungskennung basieren, sondern beispielsweise auf dem Namen des Benutzers, der die Benachrichtigung gesendet hat.


Wenn Sie die Gruppierung von Benachrichtigungen testen möchten, achten Sie außerdem darauf, dass diese nur dann in einem Paket gesammelt werden, wenn nicht alle Benachrichtigungen gleichzeitig auf den Bildschirm passen. Auf dem Bildschirm des iPhone 8 müssen Sie beispielsweise 5 oder mehr Benachrichtigungen platzieren.



Um dieses Material nicht zu überladen, habe ich die Informationen in einen separaten Artikel gestellt .


Änderungen an der NSExtensionContext-API


Das nächste Element sind neue Möglichkeiten für Benachrichtigungen, insbesondere die NSExtensionContext- Klasse. Er ist verantwortlich für die Interaktion mit Widgets, Siri, und spielt Medieninhalte ab. Wir sind mehr an Benachrichtigungen interessiert. Zwei Methoden und eine Variable wurden hinzugefügt:


var notificationActions: [UNNotificationAction] { get set } 

Die Variable ermöglicht das Ersetzen der verfügbaren Aktionen während der Interaktion mit der Benachrichtigung:


 func dismissNotificationContentExtension() func performNotificationDefaultAction() 

Methoden öffnen die Anwendung oder verbergen die Benachrichtigung.


Um die Möglichkeiten zu demonstrieren, werden wir eine kleine Anwendung schreiben.


Fügen Sie zunächst der Anwendung hinzu, die lokale Benachrichtigungen sendet:


 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]) 

  • Wir erstellen einige Aktionen. Der Header, eine Kennung, mit der Sie zwischen Verarbeitungsaktionen und Optionen unterscheiden können, wird an den Initialisierer übergeben. Die Optionen können darauf hinweisen, dass eine Benutzerauthentifizierung erforderlich ist, um die Aktion abzuschließen.
  • Wir definieren eine Kategorie mit einem Bezeichner. Mit der Kategorie-ID können Sie verschiedene Arten von Benachrichtigungen auf unterschiedliche Weise verarbeiten und anzeigen.
  • Der letzte Schritt besteht darin, die Kategorie für das Benachrichtigungscenter festzulegen.

Die zweite Methode sendet nach einem bestimmten Zeitraum eine lokale Benachrichtigung, damit wir die Anwendung minimieren oder das Telefon sperren können:


 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 }) } 

  • Überprüfen Sie, ob der Benutzer uns das Senden von Benachrichtigungen gestattet hat.
  • Wir erstellen eine Benachrichtigung mit einer Überschrift und einem Text und geben die Kategorie an, zu der sie gehören wird. In diesem Fall "Kategorie-einfach".
  • Stellen Sie den Trigger nach 3 Sekunden ein.
  • Füllen Sie die Anfrage zum Senden einer Benachrichtigung aus. In diesem Fall verwenden wir die UUID als Kennung. Diese Kennung wird möglicherweise benötigt, wenn die geplante Benachrichtigung abgebrochen werden soll.
  • Fügen Sie unsere Anfrage dem Benachrichtigungscenter hinzu.

Als Nächstes müssen Sie der Anwendung ein neues Ziel für die Erweiterung des Benachrichtigungsinhalts hinzufügen. Hier können Sie die Anzeige von Benachrichtigungen und die Verarbeitung von Aktionen anpassen.



Eine Plist-Datei, ViewController und Storyboard werden erstellt:



In der plist-Datei interessieren uns folgende Schlüssel:


  • UNNotificationExtensionCategory - Der Name der Kategorie, die verarbeitet wird. Geben Sie wie zuvor "Kategorie-einfach" an.
  • UNNotificationExtensionInitialContentSizeRatio - das Verhältnis der Höhe der Benachrichtigung zu ihrer Breite. Beeinflusst die Größe der Benachrichtigung nach vollständiger Anzeige.
  • UNNotificationExtensionUserInteractionEnabled - Aktiviert oder deaktiviert die Interaktion mit benutzerdefinierten Steuerelementen. In unserem Fall wird es ein Knopf mit einem Herzen sein.
  • UNNotificationExtensionDefaultContentHidden - Blendet den Inhalt der Benachrichtigung aus, die standardmäßig generiert wird.

Erstellen Sie im Storyboard UIImageView, UILabel, um den Benachrichtigungstitel anzuzeigen, und UIButton, um mit der Anwendung zu interagieren.



Im View Controller erstellen wir Methoden, um die Anwendung zu öffnen und die Benachrichtigung auszublenden:


 func openApp() { extensionContext?.performNotificationDefaultAction() } func dismissNotification() { extensionContext?.dismissNotificationContentExtension() } 

Wir implementieren die Methoden des UNNotificationContentExtension- Protokolls.


Mit dem ersten können Sie den erforderlichen Text anzeigen:


 func didReceive(_ notification: UNNotification) { self.notificationTitleLabel.text = notification.request.content.body } 

Die zweite wird benötigt, um Aktionen von UNNotificationAction zu verarbeiten . Bei derselben Methode werden Aktionen mithilfe der Zuweisung extensionContext? .NotificationActions ersetzt :


 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() } } 

Die Verarbeitung von Herzklopfen erfolgt wie gewohnt über IBAction :


 @IBAction func defaultButtonTapped(_ sender: UIButton) { openApp() } 


Wir starten die Anwendung und sehen, was wir bekommen:


  • Pressungen von UIButton werden verarbeitet.
  • Mit UNNotificationAction können Sie die für die Interaktion verfügbaren Optionen ersetzen.

Interaktion mit Benachrichtigungseinstellungen


Mit der folgenden Neuerung können Sie den Benachrichtigungseinstellungen einen neuen Menüpunkt hinzufügen. Wenn Sie darauf tippen, wird eine Methode aufgerufen, die Sie in der Anwendung implementieren können. Beispielsweise kann ein Benutzer über die Systemeinstellungen direkt in Ihre Anwendung gelangen und nur die Benachrichtigungen einschließen, die er wirklich erhalten möchte. Was ist für die Implementierung zu tun?


Wenn Sie Benachrichtigungen autorisieren, fügen wir zunächst einen weiteren Parameter hinzu: Bereitstellung von AppNotificationSettings :


 UNUserNotificationCenter.current().requestAuthorization(options: [.badge, .alert, .sound, .providesAppNotificationSettings]) 

Zweitens implementieren wir die userNotificationCenter (_: openSettingsFor :) -Methode des UNUserNotificationCenterDelegate- Protokolls:


 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 } } 


Vorläufige Benachrichtigungen


Der Benutzer versteht nicht immer, ob er Benachrichtigungen von Ihrer Anwendung erhalten möchte. Wenn Sie die Anwendung zum ersten Mal starten, fällt es ihm daher schwer, eine solche Entscheidung zu treffen. Mit hoher Wahrscheinlichkeit wird er Ihr Angebot ablehnen. In solchen Situationen empfiehlt Apple die Verwendung der vorläufigen Autorisierung. Wenn Sie die Berechtigung zum Senden von Benachrichtigungen anfordern, wird ein weiterer Parameter hinzugefügt - vorläufig . Der Autorisierungsstatus für solche Benachrichtigungen wird ebenfalls mit vorläufigem Status in die Anwendung aufgenommen.


 UNUserNotificationCenter.current().requestAuthorization(options: [.badge, .alert, .provisional]) 

Der Benutzer erhält beim Starten der Anwendung keine Autorisierungsanforderung. Um ihn jedoch nicht zu stören, wird der Antrag in das sogenannte Gefängnis gestellt . Für Benachrichtigungen, Sounds und Abzeichen sind deaktiviert. Sie werden nur im Benachrichtigungscenter angezeigt. Sie werden nicht auf dem gesperrten Bildschirm oder in Form von Bannern angezeigt.


Wenn ein Benutzer eine Benachrichtigung erhält, werden zwei zusätzliche Schaltflächen angezeigt. Einer blockiert Benachrichtigungen vollständig oder bietet an, zu den Einstellungen zu wechseln, und der zweite übersetzt Ihre Benachrichtigungen in den autorisierten Status:



Kritische Warnungen


Die letzte Änderung fügt eine andere Art von Benachrichtigung hinzu - Kritische Warnungen . Diese Benachrichtigungen ignorieren die Einstellungen Ihres Telefons, den gedämpften Ton vollständig oder stören den Modus nicht. Apple empfiehlt, sie in medizinischen Anwendungen zu verwenden (z. B. stieg der Zuckergehalt beim Gerätebenutzer stark an) sowie um die Sicherheit der Benutzer zu Hause oder an öffentlichen Orten zu gewährleisten.


Die Autorisierungsanfrage enthält ein Sonderzeichen:



In den Einstellungen wird ein neues Element hinzugefügt und auf dem Benachrichtigungsbildschirm ein zusätzliches Symbol angezeigt:



Um wichtige Benachrichtigungen zu senden, müssen Sie den Validierungsprozess Ihrer Anwendung auf der Apple-Website durchlaufen.


Verwenden Sie den Parameter CriticalAlert, um Benachrichtigungen zu verwenden:


 UNUserNotificationCenter.current().requestAuthorization(options: [.badge, .alert, .criticalAlert]) 

Und wir bilden den Inhalt der Benachrichtigung:


 let content = UNMutableNotificationContent() content.title = "WARNING" content.body = "Storm alert" content.categoryIdentifier = "storm-alert" content.sound = UNNotificationSound.defaultCriticalSound(withAudioVolume: 1.0) 

Für kritische Warnungen können Sie unabhängig von den Einstellungen des Benutzers die Lautstärke angeben, mit der die Benachrichtigung ausgelöst wird.


Ich hoffe, dass dieses Material den Prozess der Einführung neuer Benachrichtigungen in Ihre Bewerbung vereinfacht. Wenn Sie einige Phasen der Implementierung nicht herausfinden konnten, empfehle ich Ihnen, sich mit dem Code auf Github vertraut zu machen oder eine Frage in den Kommentaren zu stellen.


Sie können auch einen Artikel von e-Legion über Benachrichtigungen für iOS 10 oder eine Berichtsaufzeichnung von WWDC - Was ist neu in Benutzerbenachrichtigungen? Wir werden die Innovationen auf der MBLT DEV 2018 am 28. September in Moskau diskutieren können.


Ich wünsche allen einen schönen Tag und Pelzrobben ^ _ ^


UPD: Der zweite Teil des Artikels über das Gruppieren von Benachrichtigungen, die bereits auf Habré vorhanden sind.

Source: https://habr.com/ru/post/de416307/


All Articles