Javascript Firebase消息传递错误:在获取令牌之前使用服务工作者
我尝试将FCM与angularjs一起使用,因此在初始化firebase后,我编写了以下代码:Javascript Firebase消息传递错误:在获取令牌之前使用服务工作者,javascript,firebase,firebase-cloud-messaging,Javascript,Firebase,Firebase Cloud Messaging,我尝试将FCM与angularjs一起使用,因此在初始化firebase后,我编写了以下代码: messaging = firebase.messaging(); $window.navigator.serviceWorker.register($rootScope.app.base_url + '/app/lib/firebaseCustomWorker.js') .then(function(registration) { messaging.useServiceWorker(reg
messaging = firebase.messaging();
$window.navigator.serviceWorker.register($rootScope.app.base_url + '/app/lib/firebaseCustomWorker.js')
.then(function(registration) {
messaging.useServiceWorker(registration);
messaging.requestPermission().then(function(){
messaging.getToken()
.then(function(currentToken) {
console.log(currentToken);
})
.catch(function(err) {
console.log('An error occurred while retrieving token. ', err);
});
}).catch(function(err){console.log(err)});
问题在于,最后一行有时会捕获控制台中出现的错误,代码为“消息传递/在获取令牌之前使用sw”,消息中显示:
FirebaseError:消息传递:在调用getToken()之前,必须调用useServiceWorker(),以确保使用您的服务工作者。(在获取令牌之前发送消息/使用软件)
正如您在上面的代码中所看到的,我只在调用useServiceWorker()
和requestPermission()之后调用getToken()
我深入查看了第35行的原始firebase messaging.js
文件,但不幸的是,我不知道为什么会发生这种情况我知道这可能很疯狂,而且会适得其反,但它是有效的
.
.
.
if('undefined' !== typeof messaging.b )
delete(messaging.b);
messaging.useServiceWorker(registration);
.
.
.
受阅读firebase-messaging.js的启发,我对你的答案有一个类似的疯狂想法:
if (!firebase.apps[0]) {
firebase.initializeApp(config);
}
我发现使用firebase.initializeApp(config)
比使用navigator.serviceWorker.register
更好。可以多次调用它,而不必担心是否加载了服务工作者。只需在应用程序的每个页面上都添加此内容:
var config = {
apiKey: "...",
authDomain: "...",
databaseURL: "...",
projectId: "...",
storageBucket: "...",
messagingSenderId: "..."
}
firebase.initializeApp(config);
尝试使用新版本的firebase
嘿,是的,那太可怕了。但是找到一个解决办法很好。请看我的答案。
messaging.getToken({
serviceWorkerRegistration: registration,
vapidKey: keyPair
}).then((currentToken) => {
if (currentToken) {
console.log(currentToken)
} else {
// Show permission request UI
console.log('No registration token available. Request permission to generate one.');
}
}).catch((err) => {
console.log('An error occurred while retrieving token. ', err);
});