【问题标题】:Firebase getToken not working after changed Service Worker更改 Service Worker 后 Firebase getToken 无法正常工作
【发布时间】:2022-01-10 18:16:09
【问题描述】:

对于 Firebase 9.5.0 推送通知,我们有一个接收 Firebase 推送的服务工作人员,服务工作人员都工作正常。

但是,我们正在从旧的 Service Worker 注册(从第 3 方)迁移到我们自己的,全新的用户在注册和获取令牌时都可以正常工作,但是当我们想要使用新服务时出现错误现有注册用户的工作人员(与来自第 3 方的旧服务人员)。

错误发生在getToken 导致错误


FirebaseError: Messaging: A problem occurred while subscribing the user to FCM: 
Request is missing required authentication credential. 
Expected OAuth 2 access token, login cookie or other valid authentication credential.

我希望我们可以在catch 中添加一些代码来执行诸如重新注册用户之类的操作,但是通过查看 firebase 文档,我找不到任何我们如何在没有错误?

import { initializeApp } from "https://www.gstatic.com/firebasejs/9.5.0/firebase-app.js";
import { deleteToken, getMessaging, getToken, isSupported, onMessage  } from "https://www.gstatic.com/firebasejs/9.5.0/firebase-messaging.js";


const firebaseConfig = { 
   apiKey: ...
   authDomain: ...
   projectId: ...
   storageBucket: ...
   messageSenderId: ...
   appId: ...
   measurementId: ...
};

const firebaseApp = initializeApp(firebaseConfig);
const messaging = getMessaging(firebaseApp);

const registerServiceWorker = () => {
   if ('serviceWorker' in navigator) {

     navigator.serviceWorker.register('serviceworkerfilename.js')
      .then( function( registration) {
        console.log('reg successful', registration); // gets here ok
        
        getToken( messaging, { serviceWorkerRegistration: registration } )
         .then(function(currentToken) {
           // do stuff, this normally works for a new user, but not on old service worker
         })
        .catch( function(err) {

           // always gets here for old user from old service worker
           Notification.requestPermission().then(function(permission) {
             console.log(permission); // gets here, and shows 'granted', but stuck from here what we can do to reset the user
           });

         });

      })
   }
}

【问题讨论】:

    标签: javascript firebase push-notification firebase-cloud-messaging service-worker


    【解决方案1】:

    所以我首先通过检查服务人员的文件名来解决这个问题

    navigator.serviceWorker.controller.scriptURL.match(<someregex>)
    

    然后,如果需要,取消注册现有的 service worker...

    navigator.serviceWorker.getRegistrations()
      .then( function(registrations) { 
        for(let registration of registrations) { 
          registration.unregister(); 
        } 
      });
    

    然后如果有必要,调用一个函数再次注册。

    【讨论】:

      猜你喜欢
      • 2020-05-26
      • 1970-01-01
      • 2023-03-16
      • 2020-06-10
      • 1970-01-01
      • 1970-01-01
      • 2019-01-08
      • 1970-01-01
      相关资源
      最近更新 更多