Firebase:更改服务工作者的位置

Firebase: change the location of the service worker

我正在尝试使用 Firebase 消息传递(网络)。 Firebase 默认搜索包含 service worker 的文件 "firebase-messaging-sw.js"。

Service Worker 脚本应该在应用程序的绝对路径上!例如:http://localhost/firebase-messaging-sw.js

如何更改此默认位置?!搜索官方文档我发现了这个方法:useServiceWorker 它接受服务工作者注册,但是尝试使用它我得到一个错误,该方法甚至不存在!

那么,如何更改用于 firebase 消息传递的 service worker 的位置?

您应该能够 firebase.messaging().useServiceWorker(registration) 并传入现有的 service worker 注册。请注意,您应该在任何调用之前尽早执行此操作,例如getToken()onMessage().

正如迈克尔所说,使用的方法是useServiceWorker(<registration>)

https://firebase.google.com/docs/reference/js/firebase.messaging.Messaging#useServiceWorker

消息 class 是您调用 firebase.message() 时返回的内容。

因此示例将是:

navigator.serviceWorker.register('./example/sw.js')
.then((registration) => {
  messaging.useServiceWorker(registration);

  // Request permission and get token.....
});

我刚刚在 Github 上的演示应用程序上试过这个没有问题:https://github.com/firebase/quickstart-js/tree/master/messaging

通过使用 useServiceWorker(registration),您可以通过退出 service worker 在 Firebase 推送消息上使用 notificationonclick 事件。

firebase.messaging().useServiceWorker(registration) 正在工作并解决了我的问题,但请记住,我不知道是否:

  • 这是从服务器获取负载的安全方式

  • 这是处理推送通知的最佳方式。

我知道这是一个老问题,但由于 useServiceWorker 现在已被弃用,所以值得一提的是,您可以将 service worker 直接传递给 getToken。当前 document

const registration = await navigator.serviceWorker.ready;

const messaging = firebase.messaging();

const token = await messaging.getToken({
            serviceWorkerRegistration: registration,
            vapidKey: "",
        });

我认为是:

const vapidKey = 'foo123...';
const serviceWorkerRegistration = await navigator
    .serviceWorker
    .register('/build/firebase-messaging-service-worker.js');

await getToken(messaging, {
    vapidKey,
    serviceWorkerRegistration,
})...

但请注意,如果您复制此代码,我认为范围会出错(因为路径,在我的示例中:/build/...)。