我尝试过使用FCM(Firebase Cloud Messaging)进行网络推送通知。 当网络应用程序选项卡处于焦点时,我成功收到了一条消息。
但是当我关闭标签时,应该调用服务工作者(在FCM示例中为firebase-messaging-sw.js
)。但它根本没有打电话给setBackgroundMessageHandler
。
const messaging = firebase.messaging();
messaging.setBackgroundMessageHandler(function(payload) {
console.log('[firebase-messaging-sw.js] Received background message ', payload);
const notificationTitle = 'Background Message Title';
const notificationOptions = {
body: 'Background Message body.',
icon: 'firebase-logo.png'
};
return self.registration.showNotification(notificationTitle,
notificationOptions);
});
答案 0 :(得分:0)
在manifest.json
文件中包含以下内容:
{"gcm_sender_id": "103953800507"}
此gcm_sender_id
对于所有fcm用户都是唯一的,并非特定于您的项目。
在您的服务工作者代码中添加您的项目特定发件人ID。 服务工作者代码的工作示例是here。
当您的网站标签未处于焦点/关闭状态且浏览器处于打开状态时,它应显示背景通知。
答案 1 :(得分:0)
我遇到了这个问题,并在以下链接中找到了解决方案:https://github.com/firebase/quickstart-js/issues/71
基本上,问题在于您发送的有效负载。您需要使用“数据”对象来调用setBackgroundMessageHandler(payload)函数。
示例:
{
"to": "cyn88sDUyZs:APA91bE...",
"notification":
{
"title": "Title",
"body": "Body",
"icon": "https://abs.twimg.com/emoji/v2/72x72/2b50.png",
"click_action": "https://www.test.com/"
}
}
这将不会调用setBackgroundMessageHandler(payload)函数,因为它不使用“数据”对象,因此通知对象将使用,其属性将在推送消息上。但是,如果使用“数据”对象,则会调用setBackgroundMessageHandler(payload)函数:
{
"to": "cyn88sDUyZs:APA91bE...",
"data":
{
"notification":
{
"title": "Title",
"body": "Body",
"icon": "https://abs.twimg.com/emoji/v2/72x72/2b50.png",
"click_action": "https://www.test.com/"
}
}
}
因此,在这种情况下,Service Worker将执行函数内部的内容。该函数将有效负载作为参数接收,然后您可以将有效负载属性设置为推送消息,设置另一条消息或调用API来执行某些操作。