javascript - 我可以完全在 Web Service Worker 中运行 Firebase 云消息传递吗?
问题描述
TLDR:如果您没有在应用程序的前台运行 FCM 代码,会不会有问题?将所有内容都放在 Web Worker 中是否会出现任何问题?
我有以下服务人员:
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);
});
});
如果这个 service worker 是这样启动的:
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 指定现有的服务工作者。
看:
- https://firebase.google.com/docs/cloud-messaging/js/receive#handle_messages_when_your_web_app_is_in_the_foreground
- https://firebase.google.com/docs/reference/js/firebase.messaging.Messaging#useserviceworker
您的应用必须在 firebase-messaging-sw.js 中定义 Firebase 消息传递服务工作者。或者,您可以使用 useServiceWorker 指定现有的服务工作者。
推荐阅读
- vb.net - Datagridview 单元格索引正在更改或不正确 VB.net
- python - AttributeError when using the find() method
- c# - .NET Core 如何指定运行应用程序的环境
- c++ - 将 c++ 的 Eigen 线性代数库添加到编译器
- c# - 从 GridView 中的 INPUT 获取值
- android - Android Toolbar/ActionBar 设置查看初始状态
- haskell - 如何使函数参数接受类型类实例化?
- python - 将整个 Dropbox 驱动器复制到本地计算机
- bash - bash 测试 - 匹配正斜杠
- python-3.x - 在 Pycharm (Windows 10) 中将库添加到 PYTHONPATH