我已经创建了用于使用Cloud Messaging的firebase项目。直到现在,当打开浏览器(chrome)时,我已经成功地从后端向客户端发送了一条消息,但是当我关闭浏览器的通知直到发送以下代码中的浏览器重新打开时才发送,您可以看到我的firebase-messaging-sw.js >
importScripts('https://www.gstatic.com/firebasejs/5.0.4/firebase-app.js');
importScripts('https://www.gstatic.com/firebasejs/5.0.4/firebase-messaging.js');
firebase.initializeApp({
messagingSenderId: "My-Sender-Id"
});
const messaging = firebase.messaging();
messaging.setBackgroundMessageHandler(function(payload) {
console.log('[firebase-messaging-sw.js] Received background message ', payload);
// Customize notification here
var notificationTitle = 'Background Message Title';
var notificationOptions = {
body: 'Background Message body.',
icon: '/firebase-logo.png'
};
return self.registration.showNotification(notificationTitle,
notificationOptions);
});
self.addEventListener('push', function(e) {
var data;
if (e.data) {
data = JSON.parse(e.data.text()).data;
} else {
data = {};
}
var title = data.title;
var options = {
body: data.body,
icon: 'assets/custom/img/logo.png',
vibrate: [100, 50, 100],
requireInteraction: true,
data: data.data ? data.data : null,
dir: "rtl",
actions: [{
action: data.action,
title: 'open',
icon: 'images/checkmark.png'
},
{
action: 'close',
title: 'close',
icon: 'images/xmark.png'
},
]
};
e.waitUntil(
self.registration.showNotification(title, options)
);
});
self.addEventListener('notificationclick', function(event) {
console.log('On notification click: ', event.notification.tag);
event.notification.close();
if (event.action != "" && event.action != "close") {
return clients.openWindow(event.action);
}
});
即使浏览器已关闭,我如何获得通知?
答案 0 :(得分:0)
我相信您正在为FCM使用service worker,并且该service worker仅在浏览器打开时才能工作,因为service worker负责处理推送通知,当浏览器关闭时,您将不会收到任何推送通知,实际上,只有在打开浏览器或在chrome标签上打开配置了FCM的应用程序但未将其聚焦时,推送通知才会出现,有一种解决方法,或者您说解决方案,即确保chrome浏览器即使关闭chrome浏览器后仍在后台处于活动状态。
Chrome设置中有选项
转到设置->高级->关闭Google Chrome浏览器后继续运行后台应用程序,确保已启用它
我已经测试了FCM的代码,启用该选项后,将弹出通知。
答案 1 :(得分:0)
您要实现的目标应该使用 firestore 之类的数据库来完成。当在浏览器关闭时收到通知时,在 Service Worker 中,您应该添加将通知消息保存在 firestore 中的代码,以便当用户再次打开网站时,您可以从 firestore 中检索消息并可以将它们显示给用户。浏览器一打开,Service Worker 就会将任何待处理的通知保存到数据库中。
我相信这应该是实现这一目标的首选方式。