Push notification 删除Web推送通知
有没有一种方法可以在显示Web推送通知后将其删除?要将其从设备上的通知列表中删除,或将其标记为“已读” 我假设这不能从服务器上完成,我一直在寻找Javascript API,但我没有找到任何东西Push notification 删除Web推送通知,push-notification,web-push,Push Notification,Web Push,有没有一种方法可以在显示Web推送通知后将其删除?要将其从设备上的通知列表中删除,或将其标记为“已读” 我假设这不能从服务器上完成,我一直在寻找Javascript API,但我没有找到任何东西 (我试图解决的更广泛的问题是如何在多个屏幕/浏览器/设备上同步通知。)我认为这可能是不可能的。因为您可以显示和隐藏通知。这可以作为默认浏览器操作的变通方法,如所述 Chrome只会在收到推送消息时显示“此站点已在后台更新。”通知,并且在传递给event.waitUntil()的承诺完成后,服务工作者中的
(我试图解决的更广泛的问题是如何在多个屏幕/浏览器/设备上同步通知。)我认为这可能是不可能的。因为您可以显示和隐藏通知。这可以作为默认浏览器操作的变通方法,如所述 Chrome只会在收到推送消息时显示“此站点已在后台更新。”通知,并且在传递给event.waitUntil()的承诺完成后,服务工作者中的推送事件不会显示通知
我找到的closes解决方案是在显示通知后关闭通知。下面是我的代码解决方案
event.waitUntil(
self.registration.showNotification(title, options)
.then(function (data) {
self.registration.getNotifications()
.then(function (notifications) {
setTimeout(function () {
//console.log(notifications);
notifications.forEach(notification => notification.close())
}, 10);
})
})
);
即使无法撤销推送消息,也可以使用以下方法关闭推送消息:
//app.js
navigator.serviceWorker.ready.then(reg=>{
reg.getNotifications().then(通知=>{
for(设i=0;i<0.length;i+=1){
通知[i].close();
}
});
});
您甚至可以通过负载中的特殊操作从后端发送新的WebPush消息,例如data:{action:'close',id:123}
,以触发要关闭的消息。“推送”eventListener可以将“消息”事件中继到所有客户端,以关闭给定(或所有)打开的通知
//sw.js
self.addEventListener('push',事件=>{
让opts=event.data.json();
if(opts.data&&opts.data.action){
event.waitUntil(clients.matchAll().then(windowClients=>{
for(设i=0;i{
if(event.data&&event.data.action&&event.data.action==='close'){
关闭通知(event.data.id);
}
});
函数关闭通知(id){
navigator.serviceWorker.ready.then(reg=>{
reg.getNotifications().then(n=>{
对于(设i=0;i
最大的缺点是这种方法只适用于活动/开放客户机。我还没有找到解决方法
使用的来源:
setTimeout(函数{},持续时间);
定义的持续时间以毫秒为单位。这不是一个可行的解决方案,因为不允许静默推送:也就是说,当您发送推送消息时,必须显示一个通知,而只关闭其他通知而不显示任何内容的消息将被视为静默推送。@collimarco什么让您认为静默推送不是允许并且必须始终显示通知?我的理解是,通知负载由应用程序处理,如果您不想,您不会被迫对其执行任何操作。只要您使用event.waitUntil()
etc适当吗?@GaryGreen查看标准:PushManager.subscribe
将userVisibleOnly
选项设置为true,这是必需的