对于Firebase 9.5.0推送通知,我们有一个服务工作者接收Firebase推送,服务工作者都工作得很好。
然而,我们正在从旧的服务工作者注册(从第三方(迁移到我们自己的注册,全新的用户都可以很好地注册和获得令牌,但当我们想为现有的注册用户(使用来自第三方的旧服务工作者(使用新的服务工作者时,我们会遇到错误。
错误发生在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
});
});
})
}
}
所以我首先绕过了这个问题,用文件名检查服务人员是否有
navigator.serviceWorker.controller.scriptURL.match(<someregex>)
然后,如果需要,请注销现有的服务工作者。。。
navigator.serviceWorker.getRegistrations()
.then( function(registrations) {
for(let registration of registrations) {
registration.unregister();
}
});
然后,如果需要,调用一个函数重新注册。