Bonjour ![]()
Nous avons rencontré un comportement étrange (ou probablement un bug…) lors de la configuration des notifications push dans la PWA iOS. L’interface utilisateur agit comme si l’abonnement aux notifications push était configuré, alors qu’en arrière-plan, rien ne s’est encore produit et l’utilisateur ne recevra jamais de notification push.
(tl;dr : je pense savoir comment le corriger et je peux fournir une PR)
Étapes pour reproduire le problème 
Le problème concerne l’activation des notifications push immédiatement après l’installation de la PWA sur iOS.
- Ouvrez votre instance Discourse dans Safari mobile sur iOS
- Ouvrez le menu de partage et choisissez « Ajouter à l’écran d’accueil »
- Ouvrez la nouvelle PWA depuis votre écran d’accueil
- Vous voyez une bannière vous demandant si vous souhaitez activer les notifications push
- Cliquez sur le lien « activer les notifications »
- Une boîte de dialogue système apparaît : « xyz souhaite vous envoyer des notifications » — acceptez-la.
- En naviguant vers vos préférences de notification, vous verrez que les
notifications en directne sont pas activées.- En vérifiant côté serveur, vous ne trouverez pas non plus de nouvel enregistrement
PushSubscriptionpour l’utilisateur.
- En vérifiant côté serveur, vous ne trouverez pas non plus de nouvel enregistrement
Comportement attendu 
Après l’étape 5, vous devriez déjà recevoir une notification indiquant que les notifications sont activées. Il devrait également y avoir un nouvel enregistrement PushSubscription pour votre utilisateur actuel dans la base de données, et son paramètre pour recevoir des notifications en direct dans la PWA devrait être activé.
Problème 
Sur une PWA fraîchement lancée, le service worker est installé et activé, mais ne contrôle pas encore la page. Par conséquent, la vérification dans lib/push-notifications.js, isPushNotificationsSupported(), retournera toujours false, car navigator.serviceWorker.controller renvoie null. Voici les deux lignes importantes :
navigator.serviceWorker.controller &&
navigator.serviceWorker.controller.state === "activated"
Ainsi, l’interface utilisateur suggère à l’utilisateur que tout est en ordre avec sa configuration, mais il ne recevra jamais de notification push.
Au premier chargement, la PWA n’est pas contrôlée et l’appel à subscribe() n’est jamais effectué, même si l’utilisateur a accordé l’autorisation… ![]()
Les utilisateurs peuvent résoudre le problème eux-mêmes s’ils savent comment faire :
- Fermer complètement la PWA (glissez-la vers le haut pour la quitter…)
- Rouvrez la PWA
- Accédez à vos préférences de notification
- Réactivez les
notifications en direct - → Cette fois, un nouvel enregistrement
PushSubscriptiondevrait être créé et les notifications seront configurées.
Correction potentielle 
J’ai contourné ce problème en enregistrant un autre service worker qui appelle skipWaiting() et clients.claim() lors de l’installation/activation. Cela lui permet de prendre immédiatement le contrôle de la PWA, l’abonnement se déroule correctement et l’enregistrement PushSubscription correspondant est créé.
J’ai déployé cela en tant que « correctif urgent » dans l’un de mes plugins personnalisés, afin de pouvoir résoudre la situation pour mes utilisateurs sans avoir à forker le cœur de Discourse…
Il ne s’agit que de deux modifications :
# plugin.rb
register_service_worker "push-notification-setup.js"
// assets/push-notification-setup.js
self.addEventListener("install", function () {
self.skipWaiting();
});
self.addEventListener("activate", function (event) {
event.waitUntil(self.clients.claim());
});
Je pense que cette correction devrait être intégrée dans le cœur de Discourse. Avec la solution actuelle, le plugin prend un contrôle inutile sur la PWA. Je peux fournir une PR qui ajuste les vérifications dans le cœur de Discourse afin que l’abonnement fonctionne réellement. J’aimerais bien voir cela intégré, mais n’hésitez pas à exprimer vos opinions sur le sujet dès maintenant.