Seit 1938 werden Inhalte durch die neuesten ersetzt. Foto von Central Press für Getty Images.

So ersetzen Sie den Inhalt einer iOS-Benachrichtigung

Nutzen Sie die neuen Benachrichtigungsfunktionen von iOS 10 optimal.

iOS-Benachrichtigungen waren normalerweise relativ unantastbar. Sobald Sie eines gesendet haben, wird es auf dem Telefon des Benutzers gespeichert, bis der Benutzer es entfernt. Seit der Veröffentlichung von iOS 10 haben wir dank neuer APIs eine weitaus bessere Kontrolle über Benachrichtigungen nach deren Veröffentlichung, einschließlich der Möglichkeit, den Inhalt einer vorhandenen Benachrichtigung zu ersetzen. Wir haben sie verwendet, um unsere Live-Videonachrichten über die Eröffnung auf dem neuesten Stand zu halten. Dabei haben wir dasselbe Prinzip angewendet, das wir bei Webnachrichten angewendet haben, um Wahlergebnisse zu liefern. Die Implementierung unter iOS ist leider nicht so einfach wie sie sein könnte. Hier ein kurzer Überblick über die Vorgehensweise:

Der einfache Weg

Wenn Sie das Glück haben, einen eigenen Push-Dienst auszuführen, oder einen verwenden, der Apples relativ neue HTTP2-API zum Senden von Benachrichtigungen implementiert, haben Sie Glück. Es gibt ein neues Attribut, das Sie als Teil einer Push-Payload mit dem Namen "apns-collapse-id" senden können. Wenn ein iOS-Gerät diese Benachrichtigung erhält, wird jede vorhandene Benachrichtigung durch die Ausblend-ID ersetzt, die derzeit in der Benachrichtigungsleiste des Benutzers angezeigt wird (für diejenigen von Ihnen, die sich in der Web-Benachrichtigungs-API versucht haben, entspricht dies mehr oder weniger dem verwendeten Tag-Attribut Dort). Alles, was Sie tun müssen, ist, eine eindeutige ID für jede gesendete Warnung zu generieren. Wenn Sie diese ersetzen möchten, senden Sie eine weitere Benachrichtigung mit derselben ID, die an ihre Stelle tritt.

Hier gibt es jedoch ein großes Problem: Viele Push-Benachrichtigungsanbieter haben diese neue Funktionalität nicht implementiert. Wenn ich das letzte Mal nachgesehen habe, wird es weder von Amazon SNS noch von Google Firebase Cloud Messaging unterstützt. Wenn Sie also keine Thread-IDs implementieren können, müssen Sie Ihrer App zusätzlichen Code hinzufügen.

Update: Firebase Cloud Messaging unterstützt jetzt apns-collapse-id. Vielen Dank an Dan Trenz für den Hinweis.

Der harte Weg: Notification Service Extensions

Apple hat in iOS 10 eine neue Kategorie von App-Erweiterungen eingeführt, die als Notification Service Extension bezeichnet wird. Es handelt sich um einen kleinen Codeabschnitt, der ausgeführt wird, bevor das Telefon eine von Ihnen gesendete Benachrichtigung anzeigt, und mit dem Sie den Inhalt dieser Benachrichtigung anpassen können, bevor der Benutzer sie sieht. Es ist in erster Linie dazu gedacht, Fotos oder Videos an eine Benachrichtigung anzuhängen. Sie können jedoch auch die meisten Attribute einer Benachrichtigung ändern, bevor sie angezeigt wird. Leider können Sie die Thread-ID nicht anpassen, aber wir können dieses Verhalten emulieren.

Wenn wir eine Benachrichtigung senden, können wir unsere eigene benutzerdefinierte ID an die Nutzlast anhängen (etwas, das alle Push-Dienste * tun * unterstützen). Wenn unser Benachrichtigungsservice gestartet wird, holen Sie sich diese ID:

Klasse NotificationService: UNNotificationServiceExtension {
    
    überschreibe func didReceive (
        _ request: UNNotificationRequest,
        withContentHandler contentHandler:
            @escaping (UNNotificationContent) -> Void)
    {
        
        let userInfo = request.content.userInfo
        Lassen Sie customID = userInfo ["custom-payload-id"] als? String
        
    }
}

Dann können wir über die UNUserNotificationCenter-API eine Liste aller derzeit sichtbaren Benachrichtigungen auf dem Telefon eines Benutzers abrufen und eine finden, die unserer ID entspricht:

Lassen Sie customID = userInfo ["custom-payload-id"] als? String
UNUserNotificationCenter.current ()
.getDeliveredNotifications {Benachrichtigungen in
    let matching = notifications.first (wo: {benachrichtige in
        let existingUserInfo = notify.request.content.userInfo
        Lassen Sie id = existingUserInfo ["custom-payload-id"] als? String
        Rückgabe-ID == customID
    })
    
}

und, falls vorhanden, entfernen Sie es:

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

Die Collapse-ID-basierte Lösung wird sofort ersetzt, während unser Homebrewed-Hack deutlich zeigt, dass die Benachrichtigung verschwindet und dann wieder angezeigt wird:

Aber alles in allem funktioniert es in Ordnung.

Nächste Schritte

Im Idealfall müssten wir dies nicht tun. Ich vermute, dass Push-Dienstanbieter das Feld "apns-collapse-id" nicht implementiert haben, da Sie hierfür die HTTP2-API verwenden müssen. Dies würde bedeuten, dass sie ihre gesamten Push-Messaging-Stacks neu konstruieren müssen. Dies wird einige Zeit in Anspruch nehmen . So könnte Apple die Collapse-ID über die alte API verfügbar machen oder die Collapse-ID als Teil einer Notification Service Extension anpassen. Wir bräuchten immer noch zusätzlichen lokalen Code, aber zumindest würden wir die Dinge so machen, wie sie gemacht werden sollen.

Denken Sie auch an diese neuen APIs, wenn Sie an Benachrichtigungen arbeiten. Je mehr wir tun können, um sicherzustellen, dass ein Benutzer immer die neuesten Informationen erhält, wenn er auf seinen Sperrbildschirm schaut, desto besser!

Das Guardian Mobile Innovation Lab arbeitet mit der großzügigen Unterstützung der John S. und James L. Knight Foundation.