我一直致力于在我的Vue PWA应用中集成FCM。到目前为止,我已经设法让后台通知工作,但当应用在前台时处理通知不起作用。这是我的代码。
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
型
我做错了什么?
4条答案
按热度按时间ruoxqz4g1#
我在StackOverflow的另一个QA中找到了一个解决方案(由于某种原因,我再也找不到了)。
原来你必须使用Firebase API v7.8.0,而不是像文档中所说的5.5.6。所以
public/firebase-messaging-sw.js
中的前两行应该读成这样:字符串
hwamh0ep2#
同样的问题我也遇到过。在我的情况下,**“package.json”和“firebase-messaging-sw.js”导入的firebase版本是不同的。在“firebase-messaging-sw.js”导入的版本与“package.json”**中的版本相同后,我的问题得到了解决。
变更前
字符串
变更后
型
wljmcqd83#
在我的例子中,
package.json
(8.2.1)上的版本与实际的SDK_VERSION(8.0.1)不同。改变后的服务工人与相同版本的工作..
krugob8w4#
我在为Vue 3(使用Vite)设置firebase推送通知时遇到了一堆问题,并且我在
vite-plugin-pwa
中启用了PWA支持,所以有一半的时间我感觉像是在盲目飞行。我终于能够设置对PWA的支持,但后来我遇到了以下问题:这是我的完整设置。我有最新的firebase作为这篇文章(
9.12.1
)字符串
我在网上看到一些帖子在service worker中提供了
onBackgroundMessage
,但我尝试将其注解掉,它似乎解决了通知出现两次的问题。接下来是一个
firebase.js
文件,我使用它检索令牌并随后侦听前台通知。型
然后在
main.js
中,型
最后,在
App.vue
中(或者任何你想获取令牌并发送到服务器端的地方).型
当然不要忘了
vapidKey
。花了一分钟,但它工作得很好。现在,我不提供任何关于前台通知应该是什么样子的意见,所以我只是记录有效负载。但请随意显示它,无论你认为合适。