Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Push notification 删除Web推送通知_Push Notification_Web Push - Fatal编程技术网

Push notification 删除Web推送通知

Push notification 删除Web推送通知,push-notification,web-push,Push Notification,Web Push,有没有一种方法可以在显示Web推送通知后将其删除?要将其从设备上的通知列表中删除,或将其标记为“已读” 我假设这不能从服务器上完成,我一直在寻找Javascript API,但我没有找到任何东西 (我试图解决的更广泛的问题是如何在多个屏幕/浏览器/设备上同步通知。)我认为这可能是不可能的。因为您可以显示和隐藏通知。这可以作为默认浏览器操作的变通方法,如所述 Chrome只会在收到推送消息时显示“此站点已在后台更新。”通知,并且在传递给event.waitUntil()的承诺完成后,服务工作者中的

有没有一种方法可以在显示Web推送通知后将其删除?要将其从设备上的通知列表中删除,或将其标记为“已读”

我假设这不能从服务器上完成,我一直在寻找Javascript API,但我没有找到任何东西


(我试图解决的更广泛的问题是如何在多个屏幕/浏览器/设备上同步通知。)

我认为这可能是不可能的。因为您可以显示和隐藏通知。这可以作为默认浏览器操作的变通方法,如所述

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
最大的缺点是这种方法只适用于活动/开放客户机。我还没有找到解决方法

使用的来源:


服务人员无法可靠地使用超时或间隔,因为浏览器会关闭服务人员以节省系统资源。一个小的超时可能会起作用,但我不会依赖它,尤其是更长的时间。@Gavril为什么要等待?我们可以立即关闭通知吗?
setTimeout(函数{},持续时间);
定义的持续时间以毫秒为单位。这不是一个可行的解决方案,因为不允许静默推送:也就是说,当您发送推送消息时,必须显示一个通知,而只关闭其他通知而不显示任何内容的消息将被视为静默推送。@collimarco什么让您认为静默推送不是允许并且必须始终显示通知?我的理解是,通知负载由应用程序处理,如果您不想,您不会被迫对其执行任何操作。只要您使用
event.waitUntil()
etc适当吗?@GaryGreen查看标准:
PushManager.subscribe
userVisibleOnly
选项设置为true,这是必需的