Een inleiding tot het UserNotifications Framework

Invoering

Met iOS 10, tvOS 10 en watchOS 3 introduceert Apple een nieuw framework genaamd de UserNotifications kader. Deze gloednieuwe set API's biedt een uniforme, objectgerichte manier van werken met zowel lokale als externe meldingen op deze platforms. Dit is met name handig omdat, in vergelijking met de bestaande API's, lokale en externe meldingen nu op dezelfde manier worden afgehandeld en toegang tot notificatie-inhoud niet langer alleen via woordenboeken wordt gedaan.

In deze zelfstudie zal ik de basisprincipes van dit nieuwe framework bespreken en laten zien hoe u er gemakkelijk gebruik van kunt maken om meldingen voor uw toepassingen te ondersteunen..

Deze tutorial vereist dat je Xcode 8 gebruikt met de nieuwste iOS, tvOS en watchOS SDK's.

1. Registreren voor meldingen

De eerste stap voor elke app die meldingen ondersteunt, is toestemming vragen aan de gebruiker. Net als bij eerdere iOS-versies, is het bij het gebruik van het UserNotifications-framework gebruikelijk om dit te doen zodra de app klaar is met het starten. 

Voordat u een van de UserNotifications-API's gebruikt, moet u de volgende importinstructie toevoegen aan alle Swift-codebestanden die toegang hebben tot het framework:

gebruikersnota's importeren

Vervolgens moet je, om je app voor meldingen te registreren, de volgende code aan je toevoegen AppDelegate's  applicatie (_: didFinishLaunchingWithOptions :) methode:

let center = UNUserNotificationCenter.current () laat opties: UNAuthorizationOptions = [.alert, .badge, .sound] center.requestAuthorization (opties: opties) (verleend, fout) in indien verleend application.registerForRemoteNotifications ()

Aanvankelijk krijgen we met deze code een verwijzing naar de huidige UNUserNotificationCenter voorwerp. Vervolgens configureren we onze UNAuthorizationOptions met de meldingsmogelijkheden die we onze app willen hebben. Houd er rekening mee dat u hier elke combinatie van opties kunt hebben, bijvoorbeeld gewoon alarm of allebei insigne en geluid

Met behulp van beide objecten vragen we vervolgens toestemming voor onze app om meldingen weer te geven door de requestAuthorization (opties: completionHandler :) methode op onze UNUserNotificationCenter aanleg. In het voltooiingshandlerblok met code zijn twee parameters ingevoerd:

  • EEN Bool waarde die aangeeft of de gebruiker toestemming heeft gegeven of niet.
  • Een optionele Fout object dat informatie bevat als het systeem om de een of andere reden geen machtigingsaanvraag voor uw app kon aanvragen.

U ziet dat in de bovenstaande code, als autorisatie wordt verleend door de gebruiker, we ons vervolgens registreren voor externe meldingen. Als u pushmeldingen wilt implementeren, is deze coderegel vereist. Je zult ook een beetje extra setup voor je project moeten doen, zoals beschreven in deze tutorial:

  • Pushmeldingen instellen op iOS

    Apple heeft oorspronkelijk pushmeldingen geïntroduceerd om applicaties in staat te stellen te reageren op evenementen als de applicatie niet op de voorgrond draait. Echter, de…
    Bart Jacobs
    Push-meldingen

Houd er rekening mee dat het registreren voor externe meldingen hetzelfde doet UiApplication callback-methoden zoals in eerdere iOS-versies. Over succes, applicatie (_: didRegisterForRemoteNotificationsWithDeviceToken :) wordt gebeld, en applicatie (_: didFailToRegisterForRemoteNotificationsWithError :) zal bij falen worden aangeroepen.

2. Meldingen plannen

Voor dit gedeelte van de zelfstudie richten we ons volledig op het plannen van lokale meldingen met behulp van het UserNotifications-framework. Het verzenden van push-notificaties op afstand is niet veranderd als gevolg van de introductie van dit nieuwe framework.

Een lokale melding, voordat deze wordt gepland, wordt weergegeven door een instantie van de UNNotificationRequest klasse. Objecten van dit type bestaan ​​uit de volgende componenten:

  • Identifier: een uniek Draad waarmee u individuele meldingen van elkaar kunt onderscheiden.
  • Inhoud: een UNNotificationContent object dat alle informatie bevat die nodig is voor de weergave van uw melding, inclusief titel, ondertiteling en app-badgenummer.
  • Op gang brengen: een UNNotificationTrigger object dat door het systeem wordt gebruikt om te bepalen wanneer uw melding naar uw app moet worden 'verzonden'. 

Om te beginnen gaan we kijken naar de verschillende soorten triggers die u kunt instellen voor lokale meldingen. De UNNotificationTrigger class is een abstracte klasse, wat betekent dat je nooit rechtstreeks instanties hiervan moet maken. In plaats daarvan gebruikt u de beschikbare subklassen. Momenteel biedt het UserNotifications-framework drie voor u:

  • UNTimeIntervalNotificationTrigger, waarmee een melding een bepaalde tijd na het plannen kan worden verzonden.
  • UNCalendarNotificationTrigger, waarmee een melding op een specifieke datum en tijd kan worden verzonden, ongeacht wanneer deze is gepland.
  • UNLocationNotificationTrigger, waarmee een melding kan worden verzonden wanneer de gebruiker een aangewezen geografische regio binnengaat of verlaat.

De volgende code laat zien hoe je van elk type een trigger kunt maken:

laat timeTrigger = UNTimeIntervalNotificationTrigger (timeInterval: 60.0 * 60.0, repeats: false) var date = DateComponents () date.hour = 22 let calendarTrigger = UNCalendarNotificationTrigger (dateMatching: date, herhalingen: true) let center = CLLocationCoordinate2D (latitude: 40.0, longitude: 120.0) laat region = CLCircularRegion (center: center, radius: 500.0, identifier: "Location") region.notifyOnEntry = true; region.notifyOnExit = false; let locationTrigger = UNLocationNotificationTrigger (regio: regio, herhalingen: false)

Met de bovenstaande code zijn de volgende triggervoorwaarden gemaakt:

  • De timeTrigger wordt een uur nadat de melding is gepland, geactiveerd. De tijdsinterval parameter doorgegeven aan de UNTimeIntervalNotificationTrigger initializer wordt gemeten in seconden.
  • De calendarTrigger zal herhaaldelijk elke dag om 10:00 uur ontbranden. De exacte datum en tijd van het activeren van de trigger kan eenvoudig worden gewijzigd door andere eigenschappen van de trigger te wijzigen DateComponents object passeer je in de UNCalendarNotificationTrigger initialiser.
  • De locationTrigger wordt geactiveerd wanneer de gebruiker binnen 500 meter van de aangegeven coördinaat komt, in dit geval 40 ° N 120 ° OL. Zoals u kunt zien aan de hand van de code, kan dit triggertype worden gebruikt voor elke coördinaat en / of regiogrootte en kan ook een melding worden geactiveerd bij zowel het binnenkomen als het verlaten van de regio..

Vervolgens moeten we de inhoud voor de melding maken. Dit wordt gedaan door een exemplaar van de. Te maken UNMutableNotificationContent klasse. Deze klasse moet als normaal worden gebruikt UNNotificationContent klasse heeft alleen-lezen toegang voor de verschillende eigenschappen van de notificatie-inhoud.

De volgende code laat zien hoe de inhoud voor een basiskennisgeving kan worden gemaakt:

let content = UNMutableNotificationContent () content.title = "Meldingstitel" content.subtitle = "Melding Subtitle" content.body = "Een aantal meldingsinformatie die moet worden weergegeven." content.badge = 1 content.sound = UNNotificationSound.default ()

Als u een volledige lijst wilt met de eigenschappen die voor u beschikbaar zijn, bekijk dan de UNMutableNotificationContent klasseverwijzing.

Ten slotte moeten we nu alleen nog het UNNotificationRequest object en plan het. Dit kan gedaan worden met de volgende code:

let request = UNNotificationRequest (identifier: "LocalNotification", content: content, trigger: timeTrigger) UNUserNotificationCenter.current (). add (request) error in if let error = error // Do something with error else // Verzoek is succesvol toegevoegd

In eerste instantie met deze code maken we het aanvraagobject door een ID, inhoudsobject en trigger door te geven aan de initialisatie. We noemen dan de toe te voegen (_: completionHandler :) methode op de huidige UNUserNotificationCenter object en gebruik de voltooiingshandler om logica uit te voeren op basis van het feit of de melding al dan niet correct is gepland. 

3. Ontvangstmeldingen

Bij het gebruik van het UserNotifications-framework wordt de verwerking van inkomende meldingen afgehandeld door een object dat u aanwijst conform de UNUserNotificationCenterDelegate protocol. Dit object kan alles zijn wat u wilt en hoeft niet de app-deelnemer te zijn zoals in eerdere iOS-versies. 

Een belangrijk ding om op te merken is echter dat u uw gemachtigde moet instellen voordat uw app volledig is gelanceerd. Voor een iOS-app betekent dit dat u uw gemachtigde moet toewijzen binnen de applicatie (_: willFinishLaunchingWithOptions :) of applicatie (_: didFinishLaunchingWithOptions :) methode van uw app afgevaardigde. De gedelegeerde voor gebruikersmeldingen instellen gebeurt heel gemakkelijk met de volgende code:

UNUserNotificationCenter.current (). Delegate = delegateObject

Nu met uw delegatieset, wanneer een melding wordt ontvangen door de app, zijn er slechts twee methoden waarover u zich zorgen moet maken. Beide methoden worden doorgegeven a UNNotification object, dat de melding vertegenwoordigt die wordt ontvangen. Dit object bevat een datum eigenschap, die u precies vertelt wanneer de kennisgeving is afgeleverd, en een verzoek eigenschap, een instantie van de UNNotificationRequest klas eerder genoemd. Vanuit dit aanvraagobject hebt u toegang tot de inhoud van de melding en (indien nodig) de trigger voor de melding. Dit trigger-object is een instantie van een van de UNNotificationTrigger de eerder genoemde subklassen of, in het geval van pushmeldingen, een exemplaar van de UNPushNotificationTrigger klasse.

De eerste methode gedefinieerd door de UNUserNotificationCenterDelegate protocol is het userNotificationCenter (_: willPresent: withCompletionHandler :) methode. Dit wordt alleen aangeroepen wanneer uw app op de voorgrond wordt uitgevoerd en een melding ontvangt. Vanaf hier hebt u toegang tot de inhoud van de melding en kunt u indien nodig uw eigen aangepaste interface binnen uw app weergeven. U kunt ook aangeven dat het systeem de melding met verschillende opties moet presenteren, zoals u normaal zou doen als uw app niet actief was. De beschikbare opties zijn:

  • Waarschuwing om de door het systeem gegenereerde interface voor de melding weer te geven
  • Geluid om het geluid te spelen dat aan de melding is gekoppeld
  • Badge om de badge van uw app op het startscherm van de gebruiker te bewerken

 De volgende code toont een voorbeeldimplementatie van de userNotificationCenter (_: willPresent: withCompletionHandler :) methode:

func userNotificationCenter (_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) let content = notification.request.content // Process notification content completionHandler ([. alert, .sound]) / / Melding weergeven als normale waarschuwing en geluid afspelen

De andere methode gedefinieerd door de UNUserNotificationCenterDelegate protocol is het userNotificationCenter (_: didReceive: withCompletionHandler :) methode. Deze methode wordt gebruikt wanneer de gebruiker op enigerlei wijze communiceert met een melding voor uw app, waaronder het verwijderen of openen van uw app. 

Inplaats van een UNNotification object, deze methode heeft een UNNotificationResponse object doorgegeven als een parameter. Dit object bevat de UNNotification object dat de geleverde kennisgeving vertegenwoordigt. Het bevat ook een actionIdentifier property om te bepalen hoe de gebruiker heeft gereageerd op de melding. In het geval dat de melding wordt afgewezen of uw app wordt geopend, biedt het UserNotifications-framework constante actie-ID's waarmee u kunt vergelijken met.

De volgende code toont een voorbeeldimplementatie van de userNotificationCenter (_: didReceive: withCompletionHandler :) methode:

func userNotificationCenter (_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) let actionIdentifier = response.actionIdentifier switch actionIdentifier case UNNotificationDismissActionIdentifier: // Kennisgeving is door gebruiker afgedaan // Doe iets completionHandler ( ) case UNNotificationDefaultActionIdentifier: // App is geopend vanaf melding // Doe iets completionHandler () default: completionHandler ()

Houd er rekening mee dat het voor beide gedelegeerde methoden essentieel is dat u de voltooiingshandler belt zodra u klaar bent met het verwerken van de melding. Zodra u dat doet, weet het systeem dat u klaar bent met de melding en kan het alle benodigde processen uitvoeren, zoals het plaatsen van de melding in het Berichtencentrum van de gebruiker..

4. Beheer van meldingen

Soms ontvangt een gebruiker van uw app meerdere meldingen terwijl uw app niet actief is. Ze kunnen uw app ook rechtstreeks vanuit het startscherm openen en niet via een melding. In beide gevallen is geen van beide UNUserNotificationCenterDelegate protocolmethoden worden aangeroepen. Wanneer u met lokale meldingen werkt, wilt u soms ook een geplande melding verwijderen voordat deze aan de gebruiker wordt weergegeven.

Daarom biedt het UserNotifications-framework de volgende methoden voor de huidige UNUserNotificationCenter bijvoorbeeld om te werken met lopende lokale meldingen en afgeleverde meldingen die nog niet zijn verwerkt:

  • getPendingNotificationRequests (completionHandler :) biedt u een reeks van UNNotificationRequest objecten in de voltooiingsmanager. Deze array bevat alle lokale meldingen die u hebt gepland en die nog niet zijn geactiveerd.
  • removePendingNotificationRequests (withIdentifiers :) verwijdert alle geplande lokale meldingen met ID's in de Draad array die u als parameter doorgeeft.
  • removeAllPendingNotificationRequests verwijdert alle geplande lokale meldingen voor uw app.
  • getDeliveredNotifications (completionHandler :) biedt u een reeks van UNNotification objecten in de voltooiingsmanager. Deze array bevat alle meldingen voor uw app die nog steeds zichtbaar zijn in het Berichtencentrum van de gebruiker.
  • removeDeliveredNotifications (withIdentifiers :) verwijdert alle geleverde meldingen met ID's in de Draad array die u invoert vanuit het Berichtencentrum van de gebruiker.
  • removeAllDeliveredNotifications verwijdert alle bezorgde meldingen voor uw app.

5. Aangepaste actiemeldingen

Het UserNotifications-framework maakt het ook gemakkelijk voor uw app om te profiteren van de aangepaste meldingencategorieën en acties geïntroduceerd in iOS 8. 

Allereerst moet u de aangepaste acties en categorieën definiëren die uw app ondersteunt met behulp van de UNNotificationAction en UNNotificationCategory klassen respectievelijk. Voor acties waar u wilt dat de gebruiker tekst kan invoeren, kunt u de UNTextInputNotificationAction klasse, die een subklasse is van UNNotificationAction. Zodra uw acties en categorieën zijn gedefinieerd, hoeft u alleen maar het te bellen setNotificationCategories (_ :) methode op de huidige UNUserNotificationCenter aanleg. De volgende code laat zien hoe u eenvoudig acties voor het beantwoorden en verwijderen van een berichtcategorie in uw eigen app kunt registreren:

laat replyAction = UNTextInputNotificationAction (identifier: "com.usernotificationstutorial.reply", titel: "Reply", options: [], textInputButtonTitle: "Send", textInputPlaceholder: "Type uw bericht") laat deleteAction = UNNotificationAction (identifier: "com. usernotificationstutorial.delete ", titel:" Verwijderen ", opties: [.authenticationRequired, .destructive]) let category = UNNotificationCategory (identifier:" com.usernotificationstutorial.message ", actions: [replyAction, deleteAction], intentIdentifiers: [], opties : []) center.setNotificationCategories ([categorie])

Vervolgens, wanneer een gebruiker een van uw aangepaste meldingsacties gebruikt, hetzelfde userNotificationCenter (_: didReceive: withCompletionHandler :) methode die we eerder hebben besproken, wordt genoemd. In dit geval is de actie-identifier van de UNNotificationResponse het ingeleverde object is hetzelfde als het object dat u hebt gedefinieerd voor uw aangepaste actie. Het is ook belangrijk op te merken dat, als de gebruiker een actie voor het melden van tekstinvoer heeft uitgevoerd, het antwoordobject dat aan deze methode wordt doorgegeven, van het type is UNTextInputNotificationResponse.

De volgende code toont een voorbeeldimplementatie van deze methode, inclusief logica voor de acties die eerder zijn gemaakt:

func userNotificationCenter (_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) let actionIdentifier = response.actionIdentifier laat content = response.notification.request.content overschakelen actionIdentifier case UNNotificationDismissActionIdentifier: // Notification werd afgedaan door gebruiker // Doe iets completionHandler () case UNNotificationDefaultActionIdentifier: // App is geopend vanaf melding // Doe iets completionHandler () case "com.usernotificationstutorial.reply": als textResponse = response as? UNTextInputNotificationResponse laat reply = textResponse.userText // Antwoordbericht verzenden completionHandler () case "com.usernotificationstutorial.delete": // Bericht verwijderen completionHandler () default: completionHandler ()

Als u bovendien wilt profiteren van aangepaste acties voor uw lokale meldingen, kunt u eenvoudig het categoryIdentifier eigendom op uw UNMutableNotificationContent object bij het maken van de melding.

Conclusie

Het nieuwe UserNotifications-raamwerk biedt volledig functionele en gebruiksvriendelijke objectgeoriënteerde API's voor het werken met lokale en externe meldingen op iOS, WatchOS en tvOS. Het maakt het zeer eenvoudig om lokale meldingen voor verschillende scenario's in te plannen en om de hele verwerking van inkomende meldingen en aangepaste acties aanzienlijk te vereenvoudigen.

Laat zoals altijd uw opmerkingen en feedback achter in de opmerkingen hieronder. En bekijk enkele van onze andere artikelen en tutorials over nieuwe functies in iOS 10 en watchOS 3!