javascript - Firebase 云消息传递前台通知在 Vue 中不起作用

标签 javascript firebase vue.js firebase-cloud-messaging

我一直致力于将 FCM 集成到我的 Vue PWA 应用程序中。到目前为止,我已经设法让后台通知正常工作,但是当应用程序在前台不起作用时处理通知。这是我的代码。
src/App.vue

import firebase from './plugins/firebase'

export default {
  // Other stuff here...

  methods: {
    prepareFcm () {
      var messaging = firebase.messaging()
      messaging.usePublicVapidKey(this.$store.state.fcm.vapidKey)
      messaging.getToken().then(async fcmToken => {
        this.$store.commit('fcm/setToken', fcmToken)
        messaging.onMessage(payload => {
          window.alert(payload)
        })
      }).catch(e => {
        this.$store.commit('toast/setError', 'An error occured to push notification.')
      })
    }
  },

  mounted () {
    this.prepareFcm()
  }
}
public/firebase-messaging-sw.js
importScripts('https://www.gstatic.com/firebasejs/5.5.6/firebase-app.js')
importScripts('https://www.gstatic.com/firebasejs/5.5.6/firebase-messaging.js')

firebase.initializeApp({
  messagingSenderId: '123456789'
})

const messaging = firebase.messaging()

messaging.setBackgroundMessageHandler(function (payload) {
  return self.registration.showNotification(payload)
})
src/plugins/firebase.js
import firebase from '@firebase/app'
import '@firebase/messaging'
// import other firebase stuff...

const firebaseConfig = {
  apiKey: '...',
  authDomain: '...',
  databaseURL: '...',
  projectId: '...',
  storageBucket: '...',
  messagingSenderId: '123456789',
  appId: '...'
}

firebase.initializeApp(firebaseConfig)

export default firebase

我做错了什么?

最佳答案

我在 StackOverflow 的另一个 QA 中找到了解决方案(由于某种原因我再也找不到了)。
事实证明,您必须使用 Firebase API v7.8.0 而不是 5.5.6,就像文档当时所说的那样。所以 public/firebase-messaging-sw.js 中的前两行应该改为这样:

importScripts('https://www.gstatic.com/firebasejs/7.8.0/firebase-app.js')
importScripts('https://www.gstatic.com/firebasejs/7.8.0/firebase-messaging.js')

关于javascript - Firebase 云消息传递前台通知在 Vue 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61824118/

相关文章:

JavaScript 正则表达式 for Money 非 JQuery

javascript window.open 应该在 Internet Explorer 中打开一些网址

firebase - 从 Firebase 函数调用 Google Play Developer API

android - 将字符串附加到 firebase URL

binding - 使用计算属性和 VueX 的样式绑定(bind)

javascript - 使用 Cheerio 对象制作 For 循环的正确方法是什么?

javascript - 如何更改警告框的样式?

ios - 当我尝试在 App Store 上上传新版本时,applink 出现 iTunes 错误 90046

javascript - 将 vuex 状态的值指定为另一个参数的初始值

vue.js - 如何为图像制作预加载器?