Folk har udskiftet indhold med det seneste siden 1938. Foto af Central Press for Getty Images.

Sådan udskiftes indholdet af en iOS-anmeldelse

Få mest muligt ud af iOS 10s nye underretningsfunktioner.

iOS-underretninger har typisk været relativt uberørelige. Når du har sendt en, lever den på brugerens telefon, indtil de stryger den væk. Men siden frigivelsen af ​​iOS 10 har nye API'er givet os meget mere kontrol over underretninger, efter at de er blevet sendt, herunder muligheden for at erstatte indholdet af en eksisterende anmeldelse. Vi brugte dem til at holde vores indvielses live video-underretninger ajour med det samme princip, som vi har brugt med web-meddelelser til at levere valgresultater. Desværre er implementering på iOS ikke så let som det kunne være, så her er en hurtig oversigt over, hvordan man gør det:

Den lette måde

Hvis du er heldig nok til at køre din egen push-tjeneste, eller du bruger en, der implementerer Apples relativt nye HTTP2 API til at sende meddelelser, er du heldig. Der er en ny attribut, som du kan sende som en del af en push-nyttelast kaldet "apns-kollaps-id". Når en iOS-enhed modtager denne meddelelse, erstatter den enhver eksisterende meddelelse med det sammenbrud-id, der i øjeblikket vises i brugerens meddelelsesbakke (for dem af jer, der har tablet i web-meddelelses-API, svarer dette mere eller mindre til den attribut, der bruges der). Så alt hvad du behøver at gøre er at generere en unik ID for hver alarm, du sender, og send en anden meddelelse ved hjælp af den samme ID, som vil finde sted, hvis du vil erstatte den.

Der er dog et stort problem her: Mange udbydere af push-meddelelser har ikke implementeret denne nye funktionalitet. Når jeg sidst kontrollerede, understøtter hverken Amazons SNS eller Google Firebase Cloud Messaging det. Så hvis du ikke kan implementere tråd-id'er, skal du tilføje nogle ekstra kode til din app.

Opdatering: Firebase Cloud Messaging understøtter nu apns-kollaps-id. Tak til Dan Trenz for at have påpeget det.

Den hårde måde: Notification Service Extensions

Apple introducerede en ny kategori appforlængelse i iOS 10 kaldet en meddelelsestjenesteudvidelse. Det er et lille stykke kode, der køres lige før telefonen viser en meddelelse, du har sendt, og det giver dig mulighed for at tilpasse indholdet af denne meddelelse, før brugeren nogensinde ser den. Det er primært beregnet til at blive brugt til at knytte fotos eller video til en anmeldelse, men det giver dig også mulighed for at ændre de fleste attributter for en anmeldelse, før den vises. Desværre lader det * ikke * dig tilpasse tråd-ID, men vi kan efterligne denne opførsel.

Når vi sender en anmeldelse, kan vi knytte vores egen brugerdefinerede identifikator til nyttelasten (noget alle push-tjenester * gør * support). Derefter, når vores meddelelsestjeneste starter, skal du hente den ID:

class NotificationService: UNNotificationServiceExtension {
    
    tilsidesætte func modtog (
        _ anmodning: UNNotificationRequest,
        withContentHandler contentHandler:
            @escaping (UNNotificationContent) -> Intet)
    {
        
        lad userInfo = request.content.userInfo
        lad customID = userInfo ["custom-nyttelast-id"] som? Snor
        
    }
}

Derefter kan vi gennem UNUserNotificationCenter API få en liste over alle de aktuelt synlige underretninger, vi har på en brugers telefon, og finde en, der matcher vores ID:

lad customID = userInfo ["custom-nyttelast-id"] som? Snor
UNUserNotificationCenter.current ()
.getDeliveredNotifications {underretninger i
    lad matching = notifications.first (hvor: {underret
        lad eksisterendeUserInfo = notify.request.content.userInfo
        lad id = existentUserInfo ["custom-nyttelast-id"] som? Snor
        return id == customID
    })
    
}

og hvis det findes, skal du fjerne det:

hvis lad matchExists = matching {
    UNUserNotificationCenter.current (). RemoveDeliveredNotifications (
        withIdentifiers: [matchExists.request.identifier]
    )
}

Den sammenbrud-ID-baserede løsning erstattes øjeblikkeligt, mens vores hjemmebryggede hack tydeligt viser meddelelsen forsvinder og derefter dukker op igen:

Men alt i betragtning fungerer det okay.

Næste skridt

Ideelt set behøver vi ikke at gøre noget af dette. Jeg formoder, at push-tjenesteudbydere ikke har implementeret feltet apns-kollaps-id, fordi det kræver, at du bruger HTTP2 API, hvilket ville betyde, at de bliver nødt til at omstrukturere hele deres push-messaging-stakke, og det vil tage nogen tid . Så Apple kunne gøre sammenbrud-ID tilgængeligt via deres gamle API, eller de kunne lade os tilpasse sammenbrud-ID'et som en del af en meddelelsestjenesteudvidelse. Vi har stadig brug for ekstra lokal kode, men i det mindste ville vi gøre tingene, som de skulle.

Husk også disse nye API'er, når du arbejder på noget at gøre med underretninger. Jo mere vi kan gøre for at sikre, at en bruger får de nyeste oplysninger, hver gang de ser på deres låseskærm, jo ​​bedre!

The Guardian Mobile Innovation Lab fungerer med den generøse støtte fra John S. og James L. Knight Foundation.