跳转到内容

通知触发器:已停止开发的 showTrigger / TimestampTrigger 提案

一句话: 通知触发器曾是 Chrome 的一项提案,本可让网站通过携带 TimestampTriggershowTrigger 选项,将通知安排在未来某个时间点触发;但 Chrome 自己的文档现在写明该 API 的开发「已经结束」,而 showTrigger/TimestampTrigger 也没有出现在 MDN 记录的 showNotification() 选项中。

Chrome 的文档指出,Periodic Background Sync 的刷新节奏「不够充分」,无法在没有标签页 打开的情况下及时清理一条已过期或已失效的预定通知;文档还另外提到「Push API 也不是一个 好的解决方案」——因为网络连接性或类似 doze 模式的省电特性,都可能延迟基于推送的通知送 达。Notification Triggers 试图让浏览器自身持有一条预定的通知,并在合适的时刻将其触发。

async function scheduleNotification(registration, delayMs) {
await registration.showNotification('Scheduled notification', {
showTrigger: new TimestampTrigger(Date.now() + delayMs),
});
}

配套的 includeTriggered 标志本用于在 getNotifications() 中取回尚未触发的预定通知, 例如让用户能在通知出现之前将其取消。

Chrome 自己的文档展示了如下检测方式;下面的 else 分支并非来自 Chrome 文档——不能假定 showTrigger 可用,依据是 Chrome 自己「开发已结束」的提示,以及它未出现在 MDN 当前 showNotification() 选项列表中这一事实。下面的回退做法是立即通知,并如实说明:

async function scheduleNotification(registration, delayMs) {
if ('showTrigger' in Notification.prototype) {
await registration.showNotification('Scheduled notification', {
showTrigger: new TimestampTrigger(Date.now() + delayMs),
});
} else {
// 不能假定 showTrigger 存在。若要真正实现未来送达,网站需要服务器驱动的
// 机制(例如 Web Push,见下方「相关参考」)。这里选择立即通知并如实说
// 明,而不是暗示这个回退能提供它做不到的调度能力。
await registration.showNotification('Scheduled notification', {
body: 'This notification could not be scheduled for later; showing it now instead.',
});
}
}

Chrome 开发者文档中有一条提示,说明 Notification Triggers API 的开发「已经结束」,并给 出了原因:「无法确定我们能否在各平台上提供一致且可靠的体验。」MDN 当前关于 ServiceWorkerRegistration.showNotification() 的参考文档列出了其 options 对象 (actionsbadgebodydatadiriconimagelangnavigaterenotifyrequireInteractionsilenttagtimestampvibrate),其中并未 包含 showTriggerTimestampTrigger

  • 把 Chrome 的页面当作实时 API 参考。 页面上的代码示例仍在描述那个曾以功能标志开启、 处于源码试用阶段的版本是如何工作的,但 Chrome 自己的提示已说明底层开发工作已经结束。
  • 假设它可以与 Push 或 Periodic Background Sync 互相替代。 Chrome 的文档分别指出了 二者各自具体、独立的局限——Periodic Background Sync 在清理过期预定通知方面的节奏问题, 以及 Push 受网络连接性和 doze 模式延迟的影响——而不是把这项提案当作二者中任何一个的 直接替代品。
  • 不要在生产功能中依赖 showTrigger / TimestampTrigger——Chrome 自己的文档已说明 开发已经结束。
  • 仅在有意针对那个已停止的、需要功能标志的历史实验时,才使用 'showTrigger' in Notification.prototype 做特性检测。
  • 在假设某个通知调度选项可用之前,先查阅 MDN 当前的 showNotification() 选项参 考——showTrigger 并不在其中。
  • 在新内容中引用此 API 之前重新阅读 Chrome 的状态提示;「开发已结束」的提示未来可能 会被更新为其他状态。