0

在显示我的网络推送通知时,我在我的选项中添加了一个操作,以便用户可以要求在 30 分钟内再次收到通知。

  const options = {
    ...,
    actions: [
        {
          action: 'remind-action',
          title: 'Remind again in 30',
          icon: '/remind.png'
        }
    ],
    ....
  }

然后我在服务人员中处理操作:

self.addEventListener('notificationclick', function(event) {
  if (!event.action) return

  switch (event.action) {
    ...
    case 'remind-action':
            event.notification.close()
            event.waitUntil(
                new Promise((resolve, reject) => {

                    setTimeout(() => {

                        const options = {
                                ...
                                actions: [
                                    {
                                        action: 'remind-action',
                                        title: 'Remind again in 30',
                                        icon: '/remind.png'
                                    }
                                ],
                                ...
                        }

                        self.registration.showNotification('Reminder', options)
                        resolve(true)

                    }, 30 * 60 * 1000)

                })
            )

      break
  }
})

如果只有一种方法可以重新发出推送事件。

上面代码的问题是它不会在 30 分钟后显示通知,但是如果我将超时设置为 1 分钟,它就可以正常工作。

我认为 Chrome 忽略event.waitUntill并杀死了setTimeout.

是什么原因造成的,我该如何解决?

4

1 回答 1

1

浏览器将自动并故意限制您的 setTimeouts 以防止滥用,例如。跟踪用户。换句话说,你不能仅仅在客户端实现你想要的。

要再次(可靠地)显示通知,您需要从服务器再次发送它。您将通知服务器用户希望在 x 分钟左右得到提醒。

于 2019-09-14T09:12:19.267 回答