关于 javascript:Firebase: 更改 service worker 的位置

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 的位置?


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

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

Messaging 类是您调用firebase.message().

时返回的内容

所以样本将是:

1
2
3
4
5
6
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


您应该能够执行 firebase.messaging().useServiceWorker(registration) 并传入现有的服务工作者注册。请注意,您应该尽早执行此操作,然后再调用例如getToken()onMessage().


我知道这是一个老问题,但由于 useServiceWorker 现在已弃用,值得一提的是,您可以将服务工作者直接传递给 getToken。当前文档

1
2
3
4
5
6
7
8
const registration = await navigator.serviceWorker.ready;

const messaging = firebase.messaging();

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

我认为是:

1
2
3
4
5
6
7
8
9
const vapidKey = 'foo123...';
const serviceWorkerRegistration = await navigator
    .serviceWorker
    .register('/build/firebase-messaging-service-worker.js');

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

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


通过使用 useServiceWorker(registration),您可以通过退出服务工作者在 Firebase 推送消息中使用 notificationonclick 事件。

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

  • 这是一种从服务器获取有效负载的安全方式。

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