我在这个问题上苦苦挣扎了一个多星期……我们已经通过使用Firebase和Service Worker在Chrome中实现了推送消息。一切正常,使用有效负载正确发送和接收消息。在服务工作者上,我们处理推送消息以显示通知,并处理notifyclick事件以在单击时将用户发送到特定URL,然后关闭通知。
问题出在“旧”通知上:如果用户收到一条消息,但没有立即单击该消息,则该消息会保留一段时间,然后过一段时间(不确定多少),他会单击该通知-重定向到https://[domain]/firebase-messaging-sw.js 我们已经跟踪了整个过程:正确地接收了所有信息的通知(URL也正确,实际上,如果他在收到消息时单击右键,就可以正常工作)。但是,如果该通知在其中停留了一段时间,则会“清空”。
要发送的消息非常简单(仅用于显示没有TTL,也没有使用过期参数)。 curl命令如下所示:
curl -X POST
-H "Authorization: key=[SERVER API KEY]"
-H "Content-Type: application/json"
-d '{
"notification":{
"click_action":"[URL to be redirected]",
"icon":"[A custom image]",
"title":"[News title]"},
"to":"/topics/[A topic]"
}'
"https://fcm.googleapis.com/fcm/send"
这是用于处理服务人员上的推送消息的代码:
self.addEventListener('push', function(event) {
console.log('Push message received', event);
var data = {};
if (event.data) {
data = event.data.json();
}
event.stopImmediatePropagation();
showNotification(data.notification);
});
function showNotification(notification) {
var click_action = notification.click_action; //<-- This is correct!
var options = {
body: notification.body,
icon: notification.icon,
subtitle: notification.subtitle,
data: {
url: click_action
}
};
if (self.registration.showNotification) {
return self.registration.showNotification(notification.title, options);
}
}
用于管理notifyclick事件的代码非常简单:
self.addEventListener('notificationclick', function(event) {
var url = '';
try {
url = event.notification.data.url; // <-- event.notification is null randomly!!
} catch (err) {}
event.waitUntil(self.clients.openWindow(url));
});
在服务工作者上下文上经过一定时间后,是否有任何原因导致有效负载丢失?是否在任何地方的文档中指定了此时间? 预先感谢您的帮助!
答案 0 :(得分:-1)
//payload of push message
{
"notification": {
"title": data.title,
"body": data.text,
"click_action": url,
"tag": "",
"icon": ""
},
"to": token
}
//in service woker
self.addEventListener("notificationclick", (event) => {
event.waitUntil(async function () {
const allClients = await clients.matchAll({
includeUncontrolled: true
});
let chatClient;
for (const client of allClients) {
if (client['url'].indexOf(event.notification.data.FCM_MSG.notification.click_action) >= 0) {
client.focus();
chatClient = client;
break;
}
}
if (!chatClient) {
chatClient = await clients.openWindow(event.notification.data.FCM_MSG.notification.click_action);
}
}());
});
因此,基本上,在单击通知时,您将重定向到应用程序,如果未打开应用程序,则在新选项卡中打开该应用程序,因为您担心如果您无法获得click_action,您是否可以尝试使用event.notification.data.FCM_MSG.notification.click_action
来查看网址,并在服务工作者https://github.com/firebase/quickstart-js/issues/102的开头添加事件监听器