Push-Benachrichtigungs-Abonnement in iOS PWA schlägt stillschweigend fehl, da SW die App nicht steuert

Hallo :waving_hand:

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 :footprints:

Das Problem betrifft das Aktivieren von Push-Benachrichtigungen unmittelbar nach der Installation der PWA auf iOS.

  1. Öffnen Sie Ihre Discourse-Instanz in Mobile Safari auf iOS.
  2. Öffnen Sie das Teilen-Menü und wählen Sie „Zum Startbildschirm hinzufügen“.
  3. Öffnen Sie die neue PWA auf Ihrem Startbildschirm.
  4. Sie sehen ein Banner, das Sie fragt, ob Sie Push-Benachrichtigungen aktivieren möchten.
  5. Klicken Sie auf den Link „Benachrichtigungen aktivieren“.
    1. Sie sehen einen Systemdialog: „xyz“ möchte Ihnen Benachrichtigungen senden – akzeptieren Sie ihn.
  6. Wenn Sie zu Ihren Benachrichtigungseinstellungen navigieren, sehen Sie, dass live notifications nicht aktiviert sind.
    1. Bei einer Prüfung auf dem Server finden Sie auch keinen neuen PushSubscription-Datensatz für den Benutzer.

Erwartetes Verhalten :books:

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 :bug:

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… :bug:

Benutzer können das Problem selbst beheben, wenn sie wissen wie:

  1. Schließen Sie die PWA vollständig (wischen Sie sie weg…)
  2. Öffnen Sie die PWA erneut.
  3. Gehen Sie zu Ihren Benachrichtigungseinstellungen.
  4. Aktivieren Sie live notifications erneut.
  5. → Diesmal sollte ein neuer PushSubscription-Datensatz vorhanden sein und die Benachrichtigungen sind eingerichtet.

Mögliche Lösung :adhesive_bandage:

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.

1 „Gefällt mir“

Dies ist der PR mit einer Korrektur für Discourse Core - FIX: Allow push notification subscriptions on first launch of iOS PWA · Pull Request #39885 · discourse/discourse

Er behebt das hier beschriebene Problem, bei dem das Abonnement stillschweigend fehlschlägt und die Serververbindung nicht erreicht. Was jedoch weiterhin fehlt, um absolut sicher zu sein, ist, dass die erste empfangene Push-Benachrichtigung innerhalb der App nicht weitergeleitet werden kann, ohne dass der Service Worker die App steuert – also ohne dass der Nutzer die App neu startet.

Das könnte ich auch zusätzlich zu meinem PR einfügen. Ich bin mir jedoch nicht zu 100 % sicher, ob diese Korrektur das Gewünschte ist.

1 „Gefällt mir“