我们如何将 FCM Service Worker 与现有的 Service Worker 一起使用?

Pra*_*lan 2 service-worker firebase-cloud-messaging angular angular-service-worker

我们正在创建一个 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);
     });
}
Run Code Online (Sandbox Code Playgroud)

更新 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();
    }
  }

  //  ......

}
Run Code Online (Sandbox Code Playgroud)

控制台错误:

在此处输入图片说明

在此处输入图片说明

也尝试了以下答案,但没有成功:https : //stackoverflow.com/a/46171748/3037257


更新 2:最后添加useServiceWorker(registration)一个空firebase-messaging-sw.js文件,两个服务工作者都注册了,但缓存不起作用。

Tus*_*kar 6

为了全面控制 sw.js,推送通知useServiceWorker非常有用。

看这个文档useServiceWorker(registration)

   /------index.html------/
    var config = {
        apiKey: "xxxxxxxxxxxx",
        authDomain: "xxxxxxxxxxxx",
        databaseURL: "xxxxxxxxxxxx",
        projectId: "xxxxxxxxxxxx",
        storageBucket: "xxxxxxxxxxxx",
        messagingSenderId: "xxxxxxxxxxxx"
    };
    firebase.initializeApp(config);
    var messaging = firebase.messaging();

navigator.serviceWorker.register('service-worker.js')
.then((registration) => {
  messaging.useServiceWorker(registration);


});
Run Code Online (Sandbox Code Playgroud)