【问题标题】:Firebase: change the location of the service workerFirebase:更改服务人员的位置
【发布时间】:2017-05-30 07:44:15
【问题描述】:

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

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

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

那么,如何更改用于 Firebase 消息传递的 Service Worker 的位置?

【问题讨论】:

    标签: javascript firebase firebase-cloud-messaging service-worker


    【解决方案1】:

    我认为是:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

        Messaging 类是您调用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

        【讨论】:

        • 它不再起作用了。请参阅@Hamid Mayeli 的回答。
        【解决方案4】:

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

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

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

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

        【讨论】:

        • 这是对问题的回答还是您自己提出问题(要点)?
        • 要点是我的疑问,我不知道在使用 Firebase Messaging 和 service worker 时的安全性和性能。由于这个问题与这个主题有关,我不会创建单独的问题。
        • 我已经编辑了您答案中的措辞,因此您的要点现在是其他用户的考虑因素(而不是问题)。您的回答是对这个问题的一个很好的补充,谢谢!
        【解决方案5】:

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

        【讨论】:

        • 是的,当然。但尝试这个我得到method doesn't exist
        • 这对我有用——你确定你是firebase.messaging().useServiceWorker()而不是firebase.messaging.useServiceWorker()
        • 另请注意,此 API 是在库的 3.5.0 版本中添加的,因此请确保您已至少更新到该版本。
        • @MichaelBleigh,我在快速启动应用程序中按照上述说明进行操作,但我仍然收到 TypeError: Failed to register a ServiceWorker for scope ('xxxxxx.net/') with script ('dmsxxxx.net/firebase-messaging-sw.js') ): 获取脚本时收到错误的 HTTP 响应代码 (404) 错误。仍然 firebsace 只在这个 dmsxxxx.net/firebase-messaging-sw.js 位置寻找。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-14
        • 1970-01-01
        • 2018-05-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多