TLDR:如果您没有在应用程序的前台运行FCM代码,是否有问题?将所有内容都放在网络工作者中是否会引起任何问题?
我有以下服务人员:
importScripts('https://www.gstatic.com/firebasejs/7.12.0/firebase-app.js');
importScripts('https://www.gstatic.com/firebasejs/7.12.0/firebase-messaging.js');
firebase.initializeApp({ ... });
const messaging = firebase.messaging();
self.addEventListener('activate', event => {
console.log('Service worker activating...');
// Add the public key generated from the console here.
messaging.usePublicVapidKey();
// Get Instance ID token. Initially this makes a network call, once retrieved
// subsequent calls to getToken will return from cache.
messaging.getToken().then((currentToken) => {
console.log("currentToken", currentToken);
if (currentToken) {
// sendTokenToServer(currentToken);
} else {
console.error('No Instance ID token available. Request permission to generate one.');
}
}).catch((err) => {
console.error('An error occurred while retrieving token. ', err);
});
messaging.setBackgroundMessageHandler(function(payload) {
console.log('[firebase-messaging-sw.js] Received background message ', payload);
});
});
如果此服务启动程序是这样启动的:
if ('serviceWorker' in navigator) {
window.addEventListener('load', () => {
navigator.serviceWorker.register('js/service-worker.js')
.then(registration => {
console.log('Service Worker is registered', registration);
})
.catch(err => {
console.error('Registration failed:', err);
});
});
}
如果从未处理过onTokenRefresh
回调,这是一个问题,因为这只能在前台处理。
FCM的这种设置看起来正确吗?
您是否想使用指定一个已命名为js/service-worker.js
的现有服务人员?
Firebase消息传递默认服务工作者文件名是firebase-messaging-sw.js
。
如果要使用,请指定一个现有的服务程序,然后应该使用useServiceWorker指定一个现有的服务程序。
参见:
您的应用程序必须在firebase-messaging-sw.js中定义Firebase消息传递服务工作程序。另外,您可以使用useServiceWorker指定现有的服务工作者。