如何正确注销由Firebase消息安装的Service Worker

frb*_*oud 5 javascript firebase firebase-cloud-messaging

我正在尝试实现一个触发器,以使用Firebase消息传递在Web应用程序中打开/关闭通知。我的通知工作正常,但是当用户尝试关闭通知时出现问题。如果我只是通过以下方式取消注册服务人员:

navigator.serviceWorker.getRegistrations().then((r) => {
  return Promise.all(r.map(reg => reg.unregister()));
});
Run Code Online (Sandbox Code Playgroud)

那么工作人员确实确实会取消注册,但是如果用户尝试重新打开通知,Firebase将抛出此错误:

messaging/no-sw-in-reg
Run Code Online (Sandbox Code Playgroud)

该错误是有道理的,但似乎没有任何内置方法可以为不再需要它的用户注销Firebase。您是否应该在用户再次询问通知时删除firebase应用并重新初始化?

我意识到我可以删除firebase令牌,而忘记数据库中的用户,但是我不想留下一个永远不会再被调用的无用的服务工作者。

让用户在您的Web应用程序中完全禁用Firebase通知的正确方法是什么?

mon*_*nge 5

我遇到了完全相同的问题。因此,我使用您的代码摆脱了 Service Worker,然后我重新启动了消息传递对象,这样您就可以在不重新加载页面的情况下取消订阅并再次安装 Service Worker。

我发现这个问题发生了(至少在我的代码中),因为消息对象缓存了设备令牌,所以它不会触发在获取设备令牌时应该触发的事件。因此,当您不想重新加载页面时,重新启动消息传递对象是一个可行的选择。清理消息对象缓存将是一个更好的解决方案。

示例代码:

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

愿源头与你同在。