Hallo ![]()
Wir sind auf ein seltsames Verhalten (oder wahrscheinlich einen Bug…) beim Einrichten von Push-Benachrichtigungen in der iOS-PWA gestoßen. Die Benutzeroberfläche verhält sich so, als ob das Abonnement für Push-Benachrichtigungen eingerichtet wurde, während im Hintergrund noch nichts passiert ist und der Benutzer niemals eine Push-Benachrichtigung erhalten wird.
(tl;dr: Ich glaube, ich weiß, wie man es beheben kann, und kann einen PR bereitstellen)
Schritte zur Reproduktion 
Das Problem betrifft das Aktivieren von Push-Benachrichtigungen unmittelbar nach der Installation der PWA auf iOS.
- Öffnen Sie Ihre Discourse-Instanz in Mobile Safari auf iOS.
- Öffnen Sie das Teilen-Menü und wählen Sie „Zum Startbildschirm hinzufügen“.
- Öffnen Sie die neue PWA auf Ihrem Startbildschirm.
- Sie sehen ein Banner, das Sie fragt, ob Sie Push-Benachrichtigungen aktivieren möchten.
- Klicken Sie auf den Link „Benachrichtigungen aktivieren“.
- Sie sehen einen Systemdialog: „xyz“ möchte Ihnen Benachrichtigungen senden – akzeptieren Sie ihn.
- Wenn Sie zu Ihren Benachrichtigungseinstellungen navigieren, sehen Sie, dass
live notificationsnicht aktiviert sind.- Bei einer Prüfung auf dem Server finden Sie auch keinen neuen
PushSubscription-Datensatz für den Benutzer.
- Bei einer Prüfung auf dem Server finden Sie auch keinen neuen
Erwartetes Verhalten 
Nach Schritt 5 sollten Sie bereits eine Push-Benachrichtigung erhalten, dass Benachrichtigungen aktiviert wurden. Es sollte auch ein neuer PushSubscription-Datensatz für Ihren aktuellen Benutzer in der Datenbank vorhanden sein, und ihre Einstellung zum Empfangen von live notifications in der PWA sollte aktiviert sein.
Problem 
Bei einer frisch gestarteten PWA wurde der Service Worker installiert und aktiviert, kontrolliert die Seite jedoch noch nicht. Dadurch gibt die Prüfung in lib/push-notifications.js, isPushNotificationsSupported(), immer noch false zurück, da navigator.serviceWorker.controller null zurückgibt. Das sind die beiden wichtigen Zeilen:
navigator.serviceWorker.controller &&
navigator.serviceWorker.controller.state === "activated"
Dadurch suggeriert die Benutzeroberfläche dem Benutzer, dass alles in Ordnung ist, aber er wird niemals eine Push-Benachrichtigung erhalten.
Beim ersten Laden ist die PWA unkontrolliert, und der Aufruf von subscribe() erfolgt nie, obwohl der Benutzer die Berechtigung erteilt hat… ![]()
Benutzer können das Problem selbst beheben, wenn sie wissen wie:
- Schließen Sie die PWA vollständig (wischen Sie sie weg…)
- Öffnen Sie die PWA erneut.
- Gehen Sie zu Ihren Benachrichtigungseinstellungen.
- Aktivieren Sie
live notificationserneut. - → Diesmal sollte ein neuer
PushSubscription-Datensatz vorhanden sein und die Benachrichtigungen sind eingerichtet.
Mögliche Lösung 
Ich habe dieses Problem umgangen, indem ich einen weiteren Service Worker registriert habe, der beim Installieren/Aktivieren skipWaiting() und clients.claim() aufruft. Dadurch übernimmt er sofort die Kontrolle über die PWA, das Abonnement wird durchgeführt und der entsprechende PushSubscription-Datensatz wird erstellt.
Ich habe dies als „Hotfix“ als Teil eines meiner benutzerdefinierten Plugins bereitgestellt, damit ich die Situation für meine Benutzer beheben kann, ohne in einen Fork von Discourse Core einzusteigen…
Es sind nur zwei Änderungen:
# 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());
});
Ich denke, diese Lösung gehört jedoch in den Discourse Core. Auf diese Weise übernimmt das Plugin unnötigerweise die Kontrolle über die PWA. Ich kann einen PR bereitstellen, der die Prüfungen im Discourse Core entsprechend anpasst, damit das Abonnieren tatsächlich funktioniert. Ich würde mich über Feedback freuen, aber Sie können Ihre Meinung zum Thema gerne schon jetzt äußern.