我正在尝试实施切换,以使用Firebase消息传递在Web应用中打开/关闭通知。我的通知工作正常,但是当用户尝试关闭通知时出现问题。如果我只是通过以下方式取消注册服务工作者:
navigator.serviceWorker.getRegistrations().then((r) => {
return Promise.all(r.map(reg => reg.unregister()));
});
然后该工作人员确实未注册,但如果用户尝试重新打开通知,Firebase将抛出此错误:
messaging/no-sw-in-reg
错误很有意义,但似乎没有任何内置方法可以为不再需要Firebase的用户取消注册Firebase。如果用户再次请求通知,您是否应该删除firebase应用并重新初始化?
我意识到我可以删除firebase令牌并忘记我的数据库中的用户,但我不想留下永远不会再被调用的无用服务工作者。
让用户在您的网络应用中完全停用firebase通知的正确方法是什么?
答案 0 :(得分:3)
我遇到了完全相同的问题。所以我使用你的代码来摆脱服务工作者,然后我重新启动消息传递对象,这样你就可以在不重新加载页面的情况下再次取消订阅并安装服务工作者。
我发现这个问题发生了(至少在我的代码中),因为消息传递对象缓存了设备令牌,因此它不会触发在获取设备令牌时应该触发的事件。 因此,当您不想重新加载页面时,重新启动消息传递对象是一个可行的选项。清理消息传递对象缓存,将是一个更好的解决方案。
示例代码:
navigator.serviceWorker.getRegistrations().then((r) => {
return Promise.all(r.map(reg => reg.unregister()));
});
this.messaging = firebase.messaging();
愿来源与您同在。
答案 1 :(得分:0)
如果对其他人有用,而不是停用整个ServiceWorker,则只能取消订阅PushNotifications。
仅通过取消订阅PushSubscription,您还可以避免重新分配消息传递属性。
这就是我取消订阅的方式:
/*
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));
}
=============================================== ============================
// Unsubscribes PushNotifications
rejectPermission() : Promise<boolean>{
return this.getSubscription().then((pushSubscription : PushSubscription) =>{
return pushSubscription.unsubscribe();
});
}
这就是我正在为我的应用做的事情,一切似乎都运转良好。