2017-03-23 4 views
3

Ich versuche, eine Option zum Aktivieren/Deaktivieren von Benachrichtigungen in einer Webanwendung mithilfe von Firebase Messaging zu implementieren. Meine Benachrichtigungen funktionieren einwandfrei, aber es gibt ein Problem, wenn ein Benutzer versucht, Benachrichtigungen zu deaktivieren. Wenn ich einfach die Servicemitarbeiter über deregistrieren:So heben Sie die Registrierung von Service Worker auf, die von Firebase Messaging installiert wurden

navigator.serviceWorker.getRegistrations().then((r) => { 
    return Promise.all(r.map(reg => reg.unregister())); 
}); 

dann ist der Arbeiter in der Tat nicht registriert, aber wenn der Benutzer Benachrichtigungen wieder zu aktivieren versucht, wird Firebase diese Fehler werfen:

messaging/no-sw-in-reg 

Die Fehler machen Sinn, aber es scheint keine integrierten Methoden zur Aufhebung der Registrierung von Firebase für Benutzer, die es nicht mehr wollen. Soll die Firebase-App gelöscht und neu initialisiert werden, wenn der Benutzer erneut nach Benachrichtigungen fragt?

Ich weiß, dass ich nur das Firebase-Token löschen und den Benutzer in meiner Datenbank vergessen konnte, aber ich möchte keinen nutzlosen Service-Mitarbeiter hinterlassen, der nie wieder aufgerufen wird.

Wie kann ein Benutzer Firebase-Benachrichtigungen in Ihrer Webanwendung vollständig deaktivieren?

+0

Hey, hast du es geschafft, dein Problem zu lösen? Ich habe genau das gleiche ... –

Antwort

0

Ich hatte genau das gleiche Problem. Also verwende ich Ihren Code, um den Service-Mitarbeiter loszuwerden, und anschließend initialisiere ich das Messaging-Objekt neu, damit Sie den Service-Mitarbeiter wieder abbestellen und installieren können, ohne die Seite neu zu laden.

Ich habe herausgefunden, dass dieses Problem auftritt (zumindest in meinem Code), weil das Messaging-Objekt den Geräte-Token zwischenspeichert, so dass keine Ereignisse ausgelöst werden, die ausgelöst werden sollen, wenn ein Geräte-Token erworben wird. Die erneute Initialisierung des Messenger-Objekts ist eine praktikable Option, wenn Sie die Seite nicht erneut laden möchten. Wenn jemand herausfinden könnte, wie der Cache für Nachrichtenobjekte bereinigt werden soll, wäre das eine noch bessere Lösung. Bis dahin ist hier mein ...

Beispielcode:

navigator.serviceWorker.getRegistrations().then((r) => { 
    return Promise.all(r.map(reg => reg.unregister())); 
}); 
this.messaging = firebase.messaging(); 

die Quelle mit Ihnen sein kann.

+0

Lustig: Das funktioniert für eine Runde aktivieren -> Erfolg, deaktivieren -> Erfolg, aktivieren -> Erfolg, deaktivieren -> Erfolg, aktivieren -> Messaging/no-sw-in-reg, aktiviere -> Erfolg. – mondjunge

0

Falls es für jemand anderen nützlich ist, anstatt den gesamten ServiceWorker zu deaktivieren, ist es möglich, nur die PushNotifications abzumelden.

Indem Sie nur die PushSubscription abbestellen, vermeiden Sie auch die Neuzuweisung der Messaging-Eigenschaft.

Dies ist, wie ich abzumelden:

/* 
Returns a Promise that resolves on the PushSubscription object that controls the push notification subscription, after it finds the coresponding ServiceWorker 
*/ 
getSubscription() : Promise<any>{ 
    if(!navigator) return; 

    const subscriptions = navigator.serviceWorker.getRegistrations().then((r) => { 
     return r.map((sw) =>{ 
     if(!(sw.active && sw.active.scriptURL.includes("firebase-messaging"))) 
      return Promise.resolve(); 
     return sw.pushManager.getSubscription(); 

     }); 
    }); 

    return subscriptions.then(arr => arr ? arr[0] : Promise.resolve(null)); 
    } 

=============================== ========================

Das mache ich für meine App und alles scheint gut zu funktionieren.

Verwandte Themen