我正在尝试在我的Web应用程序(AngularJS)中实现Firebase Cloud Messaging (FCM),以便将推送通知。为此,我在根应用程序文件夹中创建了一个火碱消息.js。
// firebase-messaging-sw.js
'use strict';
console.log('Starting service worker');
if ('function' === typeof importScripts) {
importScripts('https://www.gstatic.com/firebasejs/3.5.0/firebase-app.js');
importScripts('https://www.gstatic.com/firebasejs/3.5.0/firebase-messaging.js');
// importScripts('core/decoder.js');
// Initialize the Firebase app in the service worker by passing in the
// messagingSenderId.
firebase.initializeApp({
'messagingSenderId': '1043000236721'
});
// Retrieve an instance of Firebase Messaging so that it can handle background
// messages.
var messaging = firebase.messaging();
messaging.setBackgroundMessageHandler(function (payload) {
var shinyData = payload || {};
var title = 'New Notification';
console.log('[firebase-messaging-sw.js] Received background message ', payload, shinyData);
return self.registration.showNotification(title, {
body: shinyData.body,
icon: '/resources/images/web-logo.png',
data: { url: '/#!/home' }
});
});
self.addEventListener("notificationclick", function (event) {
var urlToRedirect = event.notification.data.url;
event.notification.close();
event.waitUntil(self.clients.openWindow(urlToRedirect));
});
}
以及一个包含 gcm-sender-id 的 manifest.json 文件,如下所示:
{
"manifest_version": 2,
"name": "My Extension",
"version": "versionString",
"default_locale": "en",
"description": "A plain text description",
"gcm_sender_id": "103953800517"
}
在索引中.html我按如下方式初始化了Firebase:
<script>
var config = {
apiKey: "API-key",
authDomain: "some-authdomain",
databaseURL: "firebase-databaseUrl",
storageBucket: "storage-bucketUrl",
messagingSenderId: "senderId"
};
firebase.initializeApp(config);
</script>
通过所有这些配置,FCM 推送通知工作正常。但是当我们注销时,问题就来了。在注销时,我正在取消注册服务工作者,如下所示:
navigator.serviceWorker.getRegistrations().then(function (registrations) {
angular.forEach(registrations, function (registration) {
registration.unregister();
});
});
现在,当我尝试再次登录时,推送通知不起作用 取消注册所有服务工作者后,我无法 重新初始化 Firebase 应用。 如果我在注销后重新加载页面,那么 FCM 在重新加载火力基地消息传递时工作得很好.js 再次加载并再次设置服务工作进程。
请帮助我提供正确注销和登录的解决方案,以实现FCM的平稳运行。
我还没有真正尝试过这个解决方案,但我相信这应该有效。 在函数中将此代码编写为:
async function init() {
const registration = await navigator.serviceWorker.register('/firebase-messaging-sw.js');
await navigator.serviceWorker.ready;
var config = {
apiKey: "API-key",
authDomain: "some-authdomain",
databaseURL: "firebase-databaseUrl",
storageBucket: "storage-bucketUrl",
messagingSenderId: "senderId"
};
firebase.initializeApp(config);
// getToken and all stuffs
}
并在用户登录后立即调用函数init()
。
此外,每当用户注销时,都应使用
navigator.serviceWorker.getRegistrations().then(function (registrations) {
angular.forEach(registrations, function (registration) {
registration.unregister();
});
});
希望这对你有用。