iOS-Benachrichtigungen können die Berechtigung zum Pushen verlieren, wenn die Benachrichtigung unterdrückt wird. Der Code von Discourse ist so konfiguriert, dass Benachrichtigungen optional unterdrückt werden, und verliert dadurch bei dreimaligem Auftreten die Berechtigung zum Pushen.
Hier ist der Code für den Push-Benachrichtigungs-Dienstmitarbeiter.
Dieser Code enthält einen kritischen Fehler in Zeile 178. Dort prüft der Dienstmitarbeiter, ob der Benutzer aktiv ist (d. h. nicht im Leerlauf). In diesem Fall gibt das Push-Ereignis false zurück, ohne eine Benachrichtigung anzuzeigen.
(Es prüft auch payload.hide_when_active, aber es stellt sich heraus, dass hide_when_active immer true ist, und so gibt dieser Code immer false zurück, wenn der Benutzer aktiv ist.)
Apple verbietet stille Pushes und widerruft die Push-Berechtigung nach drei Ereignissen ohne Benachrichtigungen
Dies ist nach den Regeln von Apple für Push-Benachrichtigungen nicht akzeptabel.
https://webkit.org/blog/12945/meet-web-push/
Stromversorgung und Datenschutz
Sowohl das Open-Source-Projekt WebKit als auch Apple behandeln den Datenschutz als grundlegendes Menschenrecht. Wie bei anderen privilegierten Funktionen der Webplattform erfordert die Anforderung eines Push-Abonnements eine explizite Benutzergeste. Sie erfordert auch, dass Sie das Flag
userVisibleOnlyauf true setzen und dieses Versprechen einhalten, indem Sie immer eine Benachrichtigung als Reaktion auf eine Push-Nachricht anzeigen.Die Web Push API ist keine Einladung für stille Hintergrundausführung, da dies sowohl das Vertrauen des Benutzers verletzen als auch die Akkulaufzeit des Benutzers beeinträchtigen würde.
Verstöße gegen das
userVisibleOnly-Versprechen führen zum Widerruf des Push-Abonnements.
(Hervorhebung von mir)
Dies wird im WWDC-Video von Apple über Web Pushes ab 9:57 näher erläutert.
https://developer.apple.com/videos/play/wwdc2022/10098/?time=596
Beachten Sie, dass wir ausdrücklich angeben, dass wir versprechen, Pushes immer für den Benutzer sichtbar zu machen. Während der Standard für die JavaScript Push API optional stille Hintergrundausführung als Reaktion auf einen Push zulässt, unterstützen die meisten Browser dies nicht. Safari unterstützt dies nicht.
… und dann ab 13:35:
https://developer.apple.com/videos/play/wwdc2022/10098/?time=814
Wie ich bereits erwähnt habe, als ich Ihnen den Code zur Anforderung eines Push-Abonnements gezeigt habe, müssen Sie versprechen, dass Pushes für den Benutzer sichtbar sind. Die Verarbeitung eines Push-Ereignisses ist keine Einladung für Ihren JavaScript-Code, eine stille Hintergrundausführung zu erhalten. Dies würde sowohl das Vertrauen des Benutzers als auch die Akkulaufzeit des Benutzers verletzen. Bei der Verarbeitung eines Push-Ereignisses müssen Sie tatsächlich eine Benachrichtigung im Notification Center posten. Andere Browser haben Gegenmaßnahmen gegen die Verletzung des Versprechens, Pushes für den Benutzer sichtbar zu machen, und Safari ebenfalls. In der Beta-Version von macOS Ventura wird nach drei Push-Ereignissen, bei denen Sie es versäumen, eine Benachrichtigung rechtzeitig zu posten, das Push-Abonnement Ihrer Website widerrufen. Sie müssen den Berechtigungsworkflow erneut durchlaufen.
(Hervorhebung von mir)
Apple empfiehlt, Benachrichtigungen sofort anzuzeigen, nicht nach dem Schließen von Benachrichtigungen
Der empfohlene Code von Apple sieht ab 11:39 wie folgt aus:
https://developer.apple.com/videos/play/wwdc2022/10098/?time=699
self.addEventListener('push', (event) => {
let pushMessageJSON = event.data.json();
// Unser Server legt alles Notwendige zur Anzeige der Benachrichtigung
// in unseren JSON-Daten ab.
event.waitUntil(self.registration.showNotification(pushMessageJSON.title, {
body: pushMessageJSON.body,
tag: pushMessageJSON.tag,
actions: [{
action: pushMessageJSON.actionURL,
title: pushMessageJSON.actionTitle,
}]
}));
}
Erinnern Sie sich, wie unser JavaScript beim Abonnieren von Push versprochen hat, dass diese immer für den Benutzer sichtbar sein werden? Das bedeutet, dass wir als Reaktion auf jeden Push immer eine plattformnative Benachrichtigung anzeigen müssen. Dies geschieht am besten so früh wie möglich in Ihrem Push-Ereignis-Handler.
Der Code von Discourse folgt nicht der empfohlenen Vorgehensweise. Der Code von Discourse schließt zuerst alle Benachrichtigungen und zeigt dann eine Benachrichtigung an.
Discourse sollte immer showNotification als Reaktion auf ein Push-Ereignis aufrufen, und zwar so schnell wie möglich.