Service Worker 安装过程中的 Firebase 消息传递警告消息

Rob*_*rto 5 javascript firebase service-worker firebase-cloud-messaging

我使用 firebase 来推送网络通知,我的文件firebase-messaging-ws.js是这样的:


importScripts('https://www.gstatic.com/firebasejs/7.19.0/firebase-app.js');
importScripts('https://www.gstatic.com/firebasejs/7.19.0/firebase-messaging.js');

    
fetch('./firebase-data.json')
.then(r => r.json())
.then(fbData => {
    let app = firebase.initializeApp(fbData);    
    firebase.messaging(app);
    console.log('Firebase Service Worker loaded for projectId:', fbData.projectId);
}).catch(err => {
    console.error('Error configuring firebase messaging: ', err)
});
Run Code Online (Sandbox Code Playgroud)

我正在使用 json 文件firebase-data.json来加载 firebase 配置数据,它可以工作,我可以接收推送通知,但是当我调用 时,控制台中会出现几个日志警告,firebase.messaging()如果我使用本地对象(没有 fetch() 命令)然后一切正常并且没有警告消息。

日志消息如下Event handler of 'XXX' event must be added on the initial evaluation of worker script.在此输入图像描述

当我使用外部文件加载 firebase 配置数据时,我可以避免出现警告消息吗?

Bri*_*ton 4

基本上,服务工作脚本需要同步执行,这意味着您无法在承诺内初始化 Firebase Messaging。

在这里吐槽,这是未经测试的,但试试这个:

importScripts('https://www.gstatic.com/firebasejs/7.19.0/firebase-app.js');
importScripts('https://www.gstatic.com/firebasejs/7.19.0/firebase-messaging.js');

const response = await fetch('./firebase-data.json');
const fbData = await response.json();

let app = firebase.initializeApp(fbData);    
firebase.messaging(app);
console.log('Firebase Service Worker loaded for projectId:', fbData.projectId);
Run Code Online (Sandbox Code Playgroud)

或者,如果它不喜欢在异步函数之外等待,请使用 JavaScript 导出您的配置数据并使用 importScripts 将其公开给您的服务工作人员:

firebase-data.js

const fbData = {...};
Run Code Online (Sandbox Code Playgroud)

firebase-messaging-ws.js

importScripts('https://www.gstatic.com/firebasejs/7.19.0/firebase-app.js');
importScripts('https://www.gstatic.com/firebasejs/7.19.0/firebase-messaging.js');
importScripts('./firebase-data.js');

let app = firebase.initializeApp(fbData);    
firebase.messaging(app);
console.log('Firebase Service Worker loaded for projectId:', fbData.projectId);
Run Code Online (Sandbox Code Playgroud)