Lidé nahrazují obsah nejnovějšími od roku 1938. Fotografie od Central Press pro Getty Images.

Jak nahradit obsah oznámení pro iOS

Využijte nové funkce oznámení iOS 10 co nejlépe.

Oznámení pro iOS byla obvykle nedotknutelná. Jakmile některý z nich odešlete, bude aktivní v telefonu uživatele, dokud jej neodtáhnou. Od vydání systému iOS 10 nám však nová rozhraní API dávají mnohem větší kontrolu nad oznámeními po jejich zveřejnění, včetně možnosti nahradit obsah stávajícího oznámení. Použili jsme je, abychom průběžně aktualizovali naše inaugurační oznámení s živým videem. Stejný princip, jaký jsme používali s webovými oznámeními, abychom dosáhli volebních výsledků. Implementace na iOS bohužel není tak snadná, jak by mohla být, takže zde je rychlý přehled, jak to udělat:

Snadný způsob

Pokud máte to štěstí, že provozujete vlastní službu push, nebo používáte službu, která implementuje relativně nové rozhraní HTTP2 API společnosti Apple pro zasílání oznámení, máte štěstí. Je zde nový atribut, který můžete odeslat jako součást push payload s názvem „apns-collapse-id“. Když zařízení iOS obdrží toto oznámení, nahradí stávající oznámení tímto ID sbalením, které se aktuálně zobrazuje v oznamovací liště uživatele (pro ty z vás, kteří dabbledovali ve webovém rozhraní API pro oznámení, je to víceméně rovnocenné použitému atributu značky tam). Vše, co musíte udělat, je vygenerovat jedinečné ID pro každé odeslané upozornění, pak, pokud jej chcete nahradit, poslat další oznámení s použitím stejného ID, které bude nahrazeno.

Je tu však jeden velký problém: mnoho poskytovatelů oznámení push tuto novou funkci neimplementovalo. Když jsem to naposledy zkontroloval, nepodporují to ani Amazonské SNS ani Google Firebase Cloud Messaging. Pokud tedy nemůžete implementovat ID podprocesů, musíte do aplikace přidat nějaký další kód.

Aktualizace: Firebase Cloud Messaging nyní podporuje apns-collapse-id. Děkuji Danovi Trenzovi, že to na to poukázal.

Tvrdě: Rozšíření služeb oznámení

Apple zavedl novou kategorii rozšíření o aplikaci v systému iOS 10 nazvanou rozšíření o notifikační službu. Je to malá část kódu, která se spouští těsně předtím, než telefon zobrazí oznámení, které jste odeslali, a umožňuje vám přizpůsobit obsah tohoto oznámení dříve, než ho uživatel uvidí. Je určen především k připojení fotografií nebo videa k oznámení, ale také vám umožňuje změnit většinu atributů oznámení dříve, než se zobrazí. Bohužel to * neumožňuje * přizpůsobit ID vlákna, ale můžeme toto chování napodobit.

Když pošleme oznámení, můžeme k užitečnému zatížení připojit vlastní vlastní identifikátor (něco, co všechny služby push * do * podporují). Poté, co se spustí naše oznamovací služba, vezměte toto ID:

třída NotificationService: UNNotificationServiceExtension {
    
    přepsat func didReceive (
        _ požadavek: UNNotificationRequest,
        withContentHandler contentHandler:
            @escaping (UNNotificationContent) -> Void)
    {
        
        nechat userInfo = request.content.userInfo
        nechat customID = userInfo ["custom-payload-id"] jako? Řetězec
        
    }
}

Poté pomocí rozhraní UNUserNotificationCenter API můžeme získat seznam všech aktuálně viditelných oznámení, která máme na telefonu uživatele, a najít oznámení, které odpovídá našemu ID:

nechat customID = userInfo ["custom-payload-id"] jako? Řetězec
UNUserNotificationCenter.current ()
.getDeliveredNotifications {oznámení v
    nechat shodu = oznámení.prvé (kde: {oznámit v
        nechat existujícíUserInfo = notify.request.content.userInfo
        nech id = existujícíUserInfo ["custom-payload-id"] jako? Řetězec
        návrat id == customID
    })
    
}

a pokud existuje, odeberte jej:

pokud nechat matchExists = odpovídající {
    UNUserNotificationCenter.current (). RemoveDeliveredNotifications (
        withIdentifiers: [matchExists.request.identifier]
    )
}

Řešení založené na kolapsu ID se okamžitě nahrazuje, zatímco náš homebrewed hack jasně ukazuje, že oznámení mizí a pak se znovu objeví:

Ale všechny uvažované věci fungují dobře.

Další kroky

V ideálním případě bychom nic z toho nemuseli dělat. Mám podezření, že poskytovatelé push služeb neimplementovali pole apns-collapse-id, protože to vyžaduje, abyste používali API HTTP2, což by znamenalo, že budou muset přepracovat celé své hromady zpráv push, a to bude nějakou dobu trvat . Společnost Apple by tedy mohla zpřístupnit ID sbalení prostřednictvím svého starého API, nebo nám umožnit přizpůsobit ID sbalení v rámci rozšíření Notification Service Extension. Stále potřebujeme zvláštní místní kód, ale alespoň bychom dělali věci tak, jak mají.

Nezapomeňte také na tato nová rozhraní API, když pracujete na něčem co se týká oznámení. Čím více můžeme udělat pro to, abychom zajistili, že uživatel získává nejnovější informace, kdykoli se podívá na obrazovku zámku, tím lépe!

The Guardian Mobile Innovation Lab funguje s velkorysou podporou nadace John S. a James L. Knight Foundation.