我正在尝试将我们的网站设置为使用Firebase FCM发送网络和移动通知。
{
"data":{
"url":"https://www.google.com"
},
"webpush":{
"data":{
"title":"yey"
},
"notification":{
"title":"Web Title",
"body":"Web Body",
"icon":"https://upload.wikimedia.org/wikipedia/commons/thumb/0/02/Stack_Overflow_logo.svg/250px-Stack_Overflow_logo.svg.png"
}
},
"notification":{
"title":"Some Title",
"body":"Test Message 1"
},
"token":"a_token_here"
}
当向指定了“通知”的网站令牌发送消息时,浏览器会输出该消息,但是,“数据”对象没有做任何暗示我的服务工作者(sw)没有接收到的消息,处理网址。
如果我删除“通知”对象,它会到达我的sw,但是,sw不会从webpush.notification
对象输出任何内容(即不是标题或正文或图标)。但是,它会使用我在sw中指定的图标和标题。它还接收基础级“数据”对象,但不接收webpush.data
对象。
对我来说,文档建议放在“webpush”中的信息应该覆盖基础级别的对象,但是,这种情况不会发生。
https://firebase.google.com/docs/reference/fcm/rest/v1/projects.messages#WebpushNotification
当前的解决方法是将所有内容都粘贴到基本级别的“数据”对象中,该对象可以通过sw有效负载访问并用于输出信息,但这似乎不是API的目的。
服务人员:
messaging.setBackgroundMessageHandler(function(payload) {
const title = 'A Title';
const options = {
body: payload.data.body,
icon: 'https://example.com/images/company_logo.png'
};
const url = payload.data.url;
self.addEventListener('notificationclick', function(event) {
event.notification.close();
event.waitUntil(self.clients.openWindow(url));
});
console.log(payload);
return self.registration.showNotification(title, options);
});
如上所述,如果我没有指定基级“通知”对象,则sw会接收消息并将它们输出到控制台。但是,我没有收到“webpush”的通知或数据。
答案 0 :(得分:0)
如果您查看FCM文档的this页面,他们会概述不同类型的消息以及FCM处理和显示消息的方式的差异。
您的解决方法建议在数据对象中传递所有参数是完全可以接受的,并且是协议中包含的概念,作为使用预定义字段的公认替代方法。
我将此方法用于涉及推送的所有项目。它允许您动态地进行所有通知自定义,并且由于通知的字段仍未完全确定,因此未来会对您的服务工作人员进行一些证明,因为您的字段都没有硬编码。