【发布时间】:2018-06-25 22:50:26
【问题描述】:
我们正在创建一个 PWA Web 应用程序,目前,我们正在使用 sw-precache 库来生成服务工作者文件,该文件按预期工作。现在我们添加了 FCM 服务工作者,用于在离线时监听传入的消息,但它会覆盖我们现有的服务工作者。
那么我们如何将 firebase service worker 与使用 sw-precache 生成的现有 service worker 集成呢?
我尝试了几种方法,当前代码:
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/service-worker.js').then((registration) => {
console.log('Service Worker registered');
}).catch(function (err) {
console.log('Service Worker registration failed: ', err);
});
navigator.serviceWorker.register('/firebase-messaging-sw.js', { scope: '/firebase-cloud-messaging-push-scope' }).then(function (registration) {
console.log('f Service Worker registered');
}).catch(function (err) {
console.log('f Service Worker registration failed: ', err);
});
}
更新 1: 我也试过 useServiceWorker(registration),它注册了主要的服务工作者,但是当我在我的服务中初始化 firebase 时,它期望 firebase-messaging-sw.js 加载所以它正在抛出控制台出现一些错误。
服务代码:
import * as firebase from 'firebase';
import { isPlatformBrowser } from '@angular/common';
@Injectable()
export class MessagingService {
messaging;
constructor(
@Inject(PLATFORM_ID) private _platformId: Object, ) {
if (isPlatformBrowser(this._platformId)) {
var config = {
messagingSenderId: "XXXXXXXX"
};
firebase.initializeApp(config);
this.messaging = firebase.messaging();
}
}
// ......
}
控制台错误:
也尝试了以下答案,但没有成功:https://stackoverflow.com/a/46171748/3037257
更新 2: 最后添加
useServiceWorker(registration) 和一个空的 firebase-messaging-sw.js 文件,两个服务工作者都已注册但缓存不起作用。
【问题讨论】:
-
/service-worker.js 提供的路径不正确。我在创建反应应用程序的公共文件夹中提供了路径为
${process.env.PUBLIC_URL}/firebase-messaging-sw.js和 firebase-messaging-sw.js。
标签: angular firebase-cloud-messaging service-worker angular-service-worker