Les notifications iOS peuvent perdre la permission de pousser si la notification est supprimée. Le code de Discourse est configuré pour supprimer éventuellement les notifications, et perdra ainsi la permission de pousser lorsque cela se produira trois fois.
Voici le code du service worker de notification push.
Ce code contient un bug critique à la ligne 178. Le service worker vérifie si l’utilisateur est actif (c’est-à-dire non inactif). Dans ce cas, l’événement push renvoie false sans afficher de notification.
(Il vérifie également payload.hide_when_active, mais il s’avère que hide_when_active est toujours vrai, et donc ce code renvoie toujours false lorsque l’utilisateur est actif.)
Apple interdit les notifications silencieuses, révoquant la permission de notification après trois événements qui n’affichent pas de notifications
Ceci n’est pas acceptable selon les règles d’Apple pour les notifications push.
https://webkit.org/blog/12945/meet-web-push/
Puissance et confidentialité
Le projet open source WebKit et Apple traitent la confidentialité comme un droit humain fondamental. Comme pour d’autres fonctionnalités privilégiées de la plateforme web, la demande d’un abonnement push nécessite un geste explicite de l’utilisateur. Elle exige également que vous définissiez le drapeau
userVisibleOnlysur true, et que vous remplissiez cette promesse en affichant toujours une notification en réponse à un message push.L’API Web Push n’est pas une invitation à une exécution silencieuse en arrière-plan, car cela violerait la confiance d’un utilisateur et affecterait la durée de vie de la batterie de l’utilisateur.
Les violations de la promesse
userVisibleOnlyentraîneront la révocation d’un abonnement push.
(emphase ajoutée)
Ceci est expliqué plus en détail dans la vidéo WWDC d’Apple sur les Web Pushes, à 9:57
https://developer.apple.com/videos/play/wwdc2022/10098/?time=596
Notez que nous indiquons explicitement que nous promettons de toujours rendre les notifications visibles par l’utilisateur. Bien que la norme pour l’API JavaScript Push autorise éventuellement une exécution JavaScript silencieuse en réponse à une notification push, la plupart des navigateurs ne le prennent pas en charge. Safari ne le prend pas en charge.
… et ensuite à 13:35 :
https://developer.apple.com/videos/play/wwdc2022/10098/?time=814
Comme mentionné lorsque je vous ai montré le code pour demander un abonnement push, vous devez promettre que les notifications seront toujours visibles par l’utilisateur. La gestion d’un événement push n’est pas une invitation pour votre JavaScript à obtenir une exécution silencieuse en arrière-plan. Le faire violerait à la fois la confiance de l’utilisateur et la durée de vie de la batterie de l’utilisateur. Lors de la gestion d’un événement push, vous êtes en fait tenu d’afficher une notification dans le Centre de notifications. D’autres navigateurs ont des contre-mesures contre la violation de la promesse de rendre les notifications visibles par l’utilisateur, tout comme Safari. Dans la version bêta de macOS Ventura, après trois événements push où vous ne parvenez pas à afficher une notification en temps voulu, l’abonnement push de votre site sera révoqué. Vous devrez à nouveau passer par le flux de permission.
(emphase ajoutée)
Apple recommande d’afficher les notifications immédiatement, pas après la fermeture des notifications
Le code recommandé par Apple ressemble à ceci, à 11:39 :
https://developer.apple.com/videos/play/wwdc2022/10098/?time=699
self.addEventListener('push', (event) => {
let pushMessageJSON = event.data.json();
// Notre serveur met tout ce qui est nécessaire pour afficher la notification
// dans nos données JSON.
event.waitUntil(self.registration.showNotification(pushMessageJSON.title, {
body: pushMessageJSON.body,
tag: pushMessageJSON.tag,
actions: [{
action: pushMessageJSON.actionURL,
title: pushMessageJSON.actionTitle,
}]
}));
}
Rappelez-vous comment, lorsque nous nous sommes abonnés aux notifications push, notre JavaScript a promis qu’elles seraient toujours visibles par l’utilisateur ? Cela signifie que nous devons toujours afficher une notification native de la plateforme en réponse à chaque notification push. Il est préférable de le faire le plus tôt possible dans votre gestionnaire d’événements push.
Le code de Discourse ne suit pas la meilleure pratique recommandée. Le code de Discourse ferme d’abord toutes les notifications, puis affiche une notification.
Discourse devrait toujours appeler showNotification en réponse à un événement push, et il devrait toujours le faire dès que possible.