如何在注销时注销 FCM 设备令牌和服务工作者,以及如何重新初始化 Firebase 应用?



我正在尝试在我的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();
});
});

希望这对你有用。

相关内容

  • 没有找到相关文章

最新更新