Alt, hvad du altid har ønsket at vide om meddelelser i iOS

Smukke små alarmer ..?

Underretninger er en måde at informere brugerne om, når nye data bliver tilgængelige for deres apps, selv når appen ikke kører i forgrunden.

For eksempel kan en messaging-app muligvis lade brugeren vide, hvornår en ny besked er ankommet, og en kalender-app muligvis informere brugeren om en kommende aftale.

Med frigivelsen af iOS-10 introducerede Apple helt nye rammer til understøttelse af underretninger, det være sig lokale eller fjerntliggende.Denne udgivelse var fokuseret på tilpassede meddelelser .

Uden at spilde noget tid, lad os bare hurtigt springe ind i detaljerne.

Typer af meddelelser

Vi kan bredt klassificere meddelelser i to kategorier:

  • Lokale underretninger - appen konfigurerer underretningsoplysningerne lokalt og sender disse oplysninger til systemet. Systemet håndterer derefter levering af meddelelsen, når appen ikke er i forgrunden.
  • Fjernmeddelelser - du bruger en af ​​din virksomheds servere til at skubbe data til brugerenheder via Apple Push Notification-tjenesten (APN'er).

Længere nede i artiklen ser vi, hvordan vi kan få fat i begge meddelelsestyper. Lad os først starte med en introduktion til denne nye meddelelsesramme, som vi kan bruge til vores sag.

Hvad er nyt i iOS-10 til meddelelser?

Med udgivelsen af iOS-10 introducerede Apple to nye rammer til håndtering af underretninger:

  • Brugerunderretningsramme - administrerer både lokale og eksterne underretninger.
  • User Notifice UI Framework - tilpasser udseendet af systemets notifikationsgrænseflade.

Vi bruger disse to rammer og nogle platformsspecifikke API'er til at konfigurere vores meddelelser.

Sammen med rammerne, udvidelsen Notification service-appblev også introduceret, der giver dig mulighed for at ændre indholdet af fjernmeddelelser, før de leveres.

Apple tillader også at tilpasse din notifikations brugergrænseflade gennem meddelelsesindholdsudvidelsen .

Er det for meget at huske? Yup ... det er det bestemt. Men rolig. Vi ser alt trin for trin sammen med den relevante kode. Bare tag det let. ?

Første ting først - konfigurer det!

Anmod om tilladelse

For at få vores app til at underrette brugeren om noget, skal vi vide, om den person, der bruger den, faktisk ønsker det. Mayby kan de ikke lide, at deres telefon ringer og viser alarmer hele tiden? eller måske vil de faktisk have opdateringerne, men ikke den irriterende lyd ... naahhh! ☠️

Så først og fremmest skal vi få tilladelse fra den bruger, vi skal give besked om. Og det er ret simpelt - kun to linjer kode, og vi er færdige:

Du skal skrive denne kode i AppDelegate’smetode - application:didFinishLaunchingWithOptions:inden du vender tilbage fra den.

Bemærk: Da systemet gemmer brugerens svar, beder opkald til requestAuthorization(options:completionHandler:)metode under efterfølgende lanceringer ikke brugeren igen.

Tilføjelse af kategorier og handlinger - Underretninger, der kan handles

Brugerunderretningsrammen understøtter tilføjelse af kategorier og handlinger til underretningerne.

Kategorier - Definer de typer meddelelser, som appen understøtter, og kommunikere til systemet, hvordan vi ønsker, at en meddelelse skal præsenteres.

Handlinger - Hver kategori kan have op til fire handlinger tilknyttet. Handlinger er dybest set brugerdefinerede knapper, der på tryk afviser meddelelsesgrænsefladen og videresender den valgte handling til appen til øjeblikkelig håndtering.

Okayyy! Og hvad betyder det .. ??? Noget kode kan hjælpe dig med at forstå bedre:

I ovenstående kode oprettede vi simpelthen en kategori ved navn INVITATIONmed fire forskellige handlinger - remindLater , acceptere , tilbagegang , ogkommentere .

Kategorierne og handlingerne identificeres entydigt ved deres identifikatorer. Hver gang der leveres en meddelelse med en kategori, præsenterer systemet meddelelsen sammen med alle de handlinger, der er knyttet til den kategori, når brugeren udvider den. Sådan ser det ud:?

Definer alle kategorier og handlinger lige nedenfor, hvor du konfigurerede meddelelser i application:didFinishLaunchingWithOptions:metoden.

Inkluder kategori-id'en (f.eks. INVITATION), når du planlægger din underretning, hvad enten det er lokalt eller eksternt. Vi får se, hvordan du gør det i næste afsnit.

Planlægning af lokale underretninger

Nu hvor vi er færdige med at konfigurere vores meddelelser, lad os se, hvordan man rent faktisk planlægger en fra appen .

Planlægning af en lokal underretning kræver kun tre enkle trin:

  1. Forbered indholdet
  2. Tilføj en trigger - når meddelelsen skal affyres
  3. Planlæg den til levering

Lad os fortsætte med koden hurtigt, så vi ikke bliver forvirrede med alt, hvad der sker her. LOL?

I ovenstående kode har vi sammen med det andet indhold også leveret en categoryIdentifiertil at understøtte handlinger, der kan handles. Hvis vi ikke gør det, vil systemet anvende dets standardadfærd.

Det er det. Det er alt, hvad der er brug for. Og ja det fungerer helt sikkert ... hehehe.? Prøv det, inden du går videre. Du kan downloade prøven herfra.

Bemærk : Apps opfører sig forskelligt i baggrunds- og forgrundsstatus, når en meddelelse leveres.

  1. App kører ikke / App i baggrund - systemet viser lokale underretninger direkte til brugeren. Vi får ikke noget tilbagekald i appen for det.
  2. App i forgrunden - systemet giver appen mulighed for at håndtere underretningen internt. Systemet tavler underretninger til forgrundsapps som standard .

Når appen er i forgrunden, mens underretningen er leveret, får vi tilbagekaldelsen i UNUserNotificationCenterDelegate'smetode - userNotificationCenter(_:willPresent:withCompletionHandler:)hvor du kan beslutte, om meddelelsen skal håndteres stille eller advares om brugeren.

Glem ikke at være i overensstemmelse AppDelegatemed UNUserNotificationCenterDelegateprotokol og indstille det som repræsentant for UNUserNotificationCenterdelt objekt i application:didFinishLaunchingWithOptions:.

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

Vi er færdige med lokale underretninger for nu. Lad os gå videre til, hvordan vi kan planlægge en underretning uden for vores app. Før det, lad os se på, hvordan man reagerer på de brugerdefinerede handlinger.

Svar på brugerhandlinger

Konfigurerer underretninger? ✔ Planlægning af meddelelser? ✔

Hvad med at trykke på en underretning eller en brugerdefineret handling i underretningen? Hvor vil det føre? I begge tilfælde underretter systemet appen om brugerens valg.

Hver gang brugeren udfører en handling i underretningen, sendes svaret til UNUserNotificationCenterDelegate'smetode - userNotificationCenter(_:didReceive:withCompletionHandler:), hvor vi kan levere håndtering specifikt for hver handling.

Bemærk: hvis appen ikke kører, når et svar modtages, starter systemet appen i baggrunden for at behandle svaret.

Fjernmeddelelser

Push-underretning eller fjernmeddelelser, uanset hvad vi kalder dem, er en af ​​de mest anvendte med mange og mange brugssager.

Uanset om det er sociale medier eller kalendere eller nogen af ​​hjælpeprogrammerne, kan vi se dem næsten overalt. Fra nyhedsapps, der underretter os om det nyeste indhold, til Medium selv, der advarer os om de senest offentliggjorte artikler.

Har du nogensinde spekuleret på, hvordan gør de det endda? Lokale meddelelser ?? Det kunne være ... det gør det samme - ikke? Måske kan vi lave mere konfiguration i den lokale selv og få det til at fungere?

Men Medium har for eksempel ikke adgang til appen på vores personlige enhed, så hvordan kunne det planlægge meddelelser? Nemlig! Det kan det ikke. Dette er noget andet og mere end bare de lokale.

Okay, hvad med at vi sender underretningen fra et eller andet tidspunkt og viser det på et andet tidspunkt - vil dette besvare vores spørgsmål? Yup, det vil det sikkert. Men hvordan gør man det? Fjernunderretninger er det.

Dette er præcis, hvad de gør. Dette er den funktion, der har løst DET STORE PROBLEM ved "Holde ajour".

Terminologi

  • APNs - midtpunktet for fjernmeddelelsesfunktionen. Det er en skytjeneste, der giver godkendte tredjepartsapps installeret på Apple-enheder mulighed for at sende push-meddelelser fra en fjernserver til brugerne via en sikker forbindelse.
  • Enhedstoken - Et app-specifikt token, der er globalt unikt og identificerer en app-enhedskombination. Det muliggør kommunikation mellem udbyderen, APN'erne og enheden.
  • Udbyder - Server, der faktisk sender fjernmeddelelsen inklusive enhedstoken og anden information til APN'er.

Vigtig note : Cache aldrig enhedstokener i din app. I stedet skal du hente dem fra systemet, når du har brug for dem.

APN'er udsteder et nyt enhedstoken til din app, når visse begivenheder sker. Enhedstokenet er garanteret anderledes, for eksempel når en bruger gendanner en enhed fra en sikkerhedskopi, når brugeren installerer din app på en ny enhed, og når brugeren geninstallerer operativsystemet.

Når du forsøger at hente et enhedstoken, men det ikke er ændret, vender hentningsmetoden hurtigt tilbage.

Bemærk: APN'ers evne til at levere fjernunderretninger til en app, der ikke kører, kræver, at appen er blevet lanceret mindst én gang.

Hvordan det faktisk fungerer

Nedenfor er en lille og hurtig forklaring på, hvordan alle ovennævnte teknologier fungerer sammen synkroniseret for at fuldføre arbejdsgangen med fjernunderretninger.

  1. Appregistrerer sig med APN'er
  2. APN'er sender enhedstoken til Enhed med derefter sender det til App
  3. App sender dette enhedstoken til udbyder
  4. Udbyderen sender meddelelser med det enhedstoken til APN'er, som derefter sender det til Enhed, som derefter sender det til appen .

Hvis en meddelelse til din app kommer med enheden tændt, men når appen ikke kører, kan systemet stadig vise underretningen. Hvis enheden er slukket, når APN'er sender en underretning, holder APN'erne på meddelelsen og prøver igen senere.

Håndter det i appen

Nu hvor vi er opmærksomme på, hvad fjernmeddelelser er, og hvilke ting der er nødvendige for at få dem til at fungere, lad os nu gå videre til, hvordan vi kan få vores app til at støtte dem. Fordi intet sker alene?. Vi er nødt til at lave nogle konfigurationer, så de kan fungere.

For at være i stand til at håndtere fjernunderretninger skal vores app:

  1. Aktivér fjernunderretninger i funktioner - kun et klik, og du er færdig med dette trin. På fanen Kapaciteter i vores Xcode-projekt skal du aktivere indstillingen Push Notifications . Sørg for, at push-meddelelser føjes til det app-id, som vi bruger til projektet.

2. Registrer dig hos Apple Push Notification-tjenesten (APN'er) og modtag et app-specifikt enhedstoken

Det er hurtigt og nemt at anmode om at tilmelde sig APN'er. Bare tilføj nedenstående kode i UIApplicationDelegate’smetode - application:didFinishLaunchingWithOptions:inden du vender tilbage fra den.

UIApplication.shared.registerForRemoteNotifications()

Nu er der to muligheder: enten bliver vi registreret med succes, eller så mislykkes processen.

Ved vellykket registrering sender APN'er et app-specifikt enhedstoken til enheden i UIApplicationDelegate’smetode— application:didRegisterForRemoteNotificationsWithDeviceToken:.

I tilfælde af faliure modtager vi et tilbagekald i UIApplicationDelegate’smetode— application:didFailToRegisterForRemoteNotificationsWithError:.

3. Send enhedstoken til underretningsudbyderens server

Fra nu af har vi modtaget enhedstoken fra APN'er . Nu skal vi sende dette token til vores udbyder, som bruger det, mens vi skubber eventuelle meddelelser til vores enhed.

Da vi ikke har en udbyder, kan vi indtil videre bruge Easy APNs-udbyderen til at teste vores push-underretninger. Længere nede ser vi, hvordan vi nøjagtigt kan bruge dette værktøj.

For nu er det bare at downloade og installere det på din Mac.

4. Implementere support til håndtering af indgående fjernmeddelelser

Vi har vores enhedstoken, og vores udbyder ved også om det. Derefter sender udbyderen underretningen inklusive dette token og andre oplysninger i det, og vi får det på vores enhed.

Hvad nu? Hvad vil der ske, når det ankommer? Hvordan vises det på enheden? Hvad sker der, når vi trykker på det? Hvad med alle de handlinger, som vi konfigurerede tidligere? Kan vi få dem her?

For mange spørgsmål ❓❓❓ Nå, så fortvivl ikke. Vi får svar på dem alle en efter en.

Hvad sker der, når det ankommer? Vi får et tilbagekald i UIApplicationDelegate’smetode - application(_:didReceiveRemoteNotification:fetchCompletionHandler:). Det fortæller appen, at der er ankommet en fjernmeddelelse, der indikerer, at der er data, der skal hentes.

Hvordan vises det på enheden? Det vises med standardmeddelelsesgrænsefladen. Hvis notifikationens nyttelast er konfigureret med kategori , vises den som den handlingsmæssige meddelelse med alle de handlinger, der er knyttet til den kategori. Vi diskuterer nyttelasten i næste afsnit.

Hvad sker der, når vi trykker på det? Samme som lokale underretninger. UNUserNotificationCenterDelegate'smetode - userNotificationCenter(_:didReceive:withCompletionHandler:)kaldes med responsobjektet.

Håndter det på udbyderen

Vi har dækket de fleste af de ting, vi har brug for for at integrere push-underretninger i vores app. Selvom vi ved, hvordan vi skal håndtere dem i appen, mangler vi stadig ikke dem hos udbyderen.

Vi har udbyderen. Det ved, hvilken enhedstoken der skal bruges, men det alene popper ikke en meddelelse på vores enhed med nogle titler og andre detaljer. Det vil heller ikke få nogen af ​​handlingerne til at vises.

Så at skubbe meddelelser fra udbyderen kræver følgende punkter:

  1. En enhedstoken
  2. APNs-certifikat - vi kan få det fra udviklerkontoen
  3. Nyttelast - eventuelle brugerdefinerede data, som du vil sende til din app, og inkluderer oplysninger om, hvordan systemet skal underrette brugeren. Det er simpelthen en JSON-ordbog med nogle nøgleværdipar. Illustrationen nedenfor kan hjælpe dig med at forstå det bedre.

Lad os se, hvad der er alt sammen i den JSON-ordbog :

  1. apsordbog- den vigtigste. Indeholder Apple-definerede nøgler og bruges til at bestemme, hvordan det system, der modtager underretningen, skal advare brugeren.
  2. alertordbog- det er mere en selvforklarende vare. Giver indholdet af meddelelsen.
  3. kategori - for handlingsmæssige meddelelser. Alle handlinger knyttet til denne kategori vil være tilgængelige i meddelelserne.
  4. indhold-tilgængeligt- For at understøtte en baggrundsopdateringsmeddelelse skal du indstille denne nøgle til 1.
  5. mutable-content- For at aktivere en meddelelses ændring gennem Notification Service App Extension skal du indstille den til 1.

Her kan du læse mere om tilpasning af nyttelasten efter dine behov. Dette er en henvisning til de nøgler, som vi kan tilføje i aps-ordbogen

Meddelelsestjeneste App-udvidelse

På dette tidspunkt ved vi, hvilke fjernmeddelelserer, hvordan de fungerer, hvad alt hvad vi har brug for for at få dem til at arbejde - stort set alt! Da vi lige fik dem til at fungere perfekt✌️.

Nu er spørgsmålet, hvad hvis vi vil ændre noget indhold i meddelelsen modtaget fra udbyderen, inden vi præsenterer det på enheden? Hvad hvis meddelelsen indeholder et billedlink, som vi skal downloade, inden vi leverer det til brugeren? Kan vi gøre det med det, vi allerede ved? Vi har ikke adgang til udbyderen ... så hvordan gør vi det?

Det kan vi faktisk ikke. Vi kan ikke ændre det, vi får, men vi kan helt sikkert ændre det, vi præsenterer.

Det er det, Notification Service App Extension handler om - at ændre indholdet af fjernmeddelelser inden levering. Det er så simpelt som det ser ud. Ingen fancy kode, intet. Det er virkelig meget simpelt.

Tilføjelse af Notification Service Extension til projektet

Udvidelser i et xcode-projekt tilføjes som et mål. Vælg fil - ny - mål - underretningstjenesteudvidelse.

Forudsætninger

Før vi begynder at ændre indholdet, er der nogle begrænsninger for, hvornår indholdet må ændres.

Indholdet kan kun ændres, hvis:

  • Fjernmeddelelsen er konfigureret til at vise en alarm.
  • Fjernbetjeningen meddelelse s aps ordbog inkluderer foranderlig-indhold nøgle med værdien sat til 1.

Vi kan ikke ændre lydløse meddelelser eller dem, der kun afspiller en lyd eller mærker appens ikon.

Så for at understøtte ændringer i meddelelsernes indhold skal disse betingelser være opfyldt.

Ændring af indholdet

Standardudvidelsesmålet for underretningstjeneste leveret af Xcode indeholder en underklasse af UNNotificationServiceExtensionklassen, som vi kan ændre.

Den indeholder to metoder:

  1. didReceive(_:withContentHandler:)- foretag de nødvendige ændringer i underretningen og underret systemet, når du er færdig. Denne metode har en begrænset tid (ca. 30 sekunder) til at udføre sin opgave og udføre den medfølgende færdiggørelsesblok.
  2. serviceExtensionTimeWillExpire()- Fortæller os, at udvidelsen er ved at blive afsluttet. Giv os en sidste chance for at indsende vores ændringer. Hvis vi ikke opdaterer meddelelsesindholdet, inden tiden udløber, viser systemet det originale indhold.

Lad os se på et eksempel. Vi ændrer kroppen i nyttelast i kodestykke 7 til " Adresse: Sea Shells Apartments, Mumbai ".

Al standardimplementeringen af ​​begge metoder leveres af selve udvidelsen. Vi skal bare foretage de ændringer, vi ønsker, som i linje 8 i ovenstående kodestykke. Bare en enkelt kode kode for nu. På samme måde kan du ændre andre felter i henhold til dine krav.

Udvidelse af meddelelsesindhold

At have en iøjnefaldende brugergrænseflade er altid bedre end en simpel standardgrænseflade. Tilføjelse af nogle farver og nogle smukke skrifttyper er aldrig en dårlig idé. Vi vil gøre det samme med vores meddelelser for at få dem til at se Wow !?

Og og og ... Apple er her for at redde os igen. Meddelelsesindholdsudvidelse er det. Dette præsenterer en brugerdefineret grænseflade til en leveret lokalellerekstern underretning.

Tilføjelse af udvidelse af meddelelsesindhold til projektet

Jeg tror, ​​vi ved allerede, hvordan vi gør det. Gør vi ikke? Vi vil det samme, hvad vi gjorde for at tilføje Notification Service Extension . Vælg File - New - Target - Notification Content Extension.

Tilføjelse af nogle nøgler til udvidelsens Info.plist

For at understøtte brugerdefineret brugergrænseflade til lokale og fjernmeddelelser er vi nødt til at foretage nogle ændringer i Info.plist- filen med indholdsudvidelse.

  1. UNNotificationExtensionCategory (reqd.) - En streng eller en række strenge. Hver streng indeholder identifikatoren for en kategori, der er erklæret af appen. Kategori , jeg må sige, er virkelig virkelig vigtigt for underretninger. Brugerdefineret brugergrænseflade vises kun for meddelelser, der ligger i de angivne kategorier.
  2. UNNotificationExtensionInitialContentSizeRatio (reqd.) - Et flydende nummer, der repræsenterer den indledende størrelse af visningskontrollens visning udtrykt som et forhold mellem dens højde og bredden . Det er den visningscontroller, som vi bruger til at lave brugerdefineret brugergrænseflade. Vi diskuterer det i det kommende afsnit.
  3. UNNotificationExtensionDefaultContentHidden - hvis det er sandt : vis kun tilpasset indhold. Hvis falsk : vis tilpasset + standardindhold.
  4. UNNotificationExtensionOverridesDefaultTitle — if true : indstil underretningens titel til visningen controllerens titel. Hvis falsk : meddelelsens titel er indstillet til appens navn.

Her er en illustration, der kan hjælpe os med at forstå ovenstående taster bedre.

I ovenstående illustration er tasterne i Info.plist konfigureret som:

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

Oprettelse af brugerdefineret brugergrænseflade

Udvidelse af meddelelsesindhold giver os en, UIViewControllerder overholder UNNotificationContentExtensionprotokollen. Denne controller præsenterer grænsefladen for meddelelsen. Den Storyboardfil i forlængelse indeholder en enkelt viewcontroller at vi kan bruge til at lave hvad UI vi ønsker, at anmeldelsen til stede.

Når vi opretter brugergrænsefladen, er vi nødt til at forbinde elementerne NotificationViewControlleri for at udfylde detaljerne. Hver gang en meddelelse ankommer med en forventet kategori , modtager vi et tilbagekald i UNNotificationContentExtension’smetode - didReceive(_:). Dette er stedet, hvor vi kan tilføje detaljer til vores tilpassede brugergrænseflade.

Vi er næsten færdige med vores meddelelses brugerdefinerede brugergrænseflade. Bare en ting mere. Da den brugerdefinerede brugergrænseflade er knyttet til underretningskategorien ,der kan have nogle handlinger knyttet til det. Og ... du har det rigtigt! ? Vi får vores handlinger automatisk uden brugerdefineret håndtering. Strålende!?

Indhold + Smuk brugergrænseflade + Brugerdefinerede handlinger - Alt gjort. Hvad mere kan vi bede om? Apple, du er fantastisk !?

Et sidste punkt: vi kan også tilføje håndtering til de brugerdefinerede handlinger i udvidelsen. Systemet kalder didReceive(_:completionHandler:)metode til at reagere på eventuelle valgte handlinger. Hvis vores view-controller ikke implementerer denne metode, leverer systemet den valgte handling til din app til håndtering.

Hvis implementeret, er vi nødt til at håndtere alle mulige handlinger i denne metode. En ting, der er vigtig her, er completionlukningen.

completion: Blokken, der skal udføres, når du er færdig med at udføre handlingen. Du skal kalde denne blok på et eller andet tidspunkt under din implementering. Blokken har ingen returværdi.

Lukningen accepterer en enkelt parameter dismissaf typen UNNotificationContentExtensionResponseOption. Vi tilbyder følgende muligheder:

  1. doNotDismiss - Afvis ikke meddelelsesgrænsefladen.
  2. dismiss - Afvis notifikationsgrænsefladen.
  3. dismissAndForwardAction--Afvis notifikationsgrænsefladen, og send meddelelsen videre til appen.

Det opsummerer vores meddelelser. For meget at huske? Øvelse gør fremskridt ?. Prøv at lave dine egne underretninger nu!

Eksempel på projekt

Du kan downloade eksemplet på projektet herfra.

Og eksempelprojektet til udvidelse af meddelelsesindhold kan findes her.

Yderligere læsning

Glem ikke at læse mine andre artikler:

  1. Alt om Codable i Swift 4
  2. Farvelæg det med GRADIENTS - iOS
  3. Kodning til iOS 11: Sådan trækkes og droppes i samlinger og tabeller
  4. Alt hvad du behøver at vide om Today Extensions (Widget) i iOS 10
  5. UICollectionViewCell-valg gjort let .. !!

Du er velkommen til at efterlade kommentarer, hvis du har spørgsmål.