通知触发器:已停止开发的 showTrigger / TimestampTrigger 提案
一句话: 通知触发器曾是 Chrome 的一项提案,本可让网站通过携带 TimestampTrigger 的
showTrigger 选项,将通知安排在未来某个时间点触发;但 Chrome 自己的文档现在写明该 API
的开发「已经结束」,而 showTrigger/TimestampTrigger 也没有出现在 MDN 记录的
showNotification() 选项中。
它原本想解决什么
Section titled “它原本想解决什么”Chrome 的文档指出,Periodic Background Sync 的刷新节奏「不够充分」,无法在没有标签页 打开的情况下及时清理一条已过期或已失效的预定通知;文档还另外提到「Push API 也不是一个 好的解决方案」——因为网络连接性或类似 doze 模式的省电特性,都可能延迟基于推送的通知送 达。Notification Triggers 试图让浏览器自身持有一条预定的通知,并在合适的时刻将其触发。
它原本是如何工作的
Section titled “它原本是如何工作的”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.', }); }}现状:开发已结束
Section titled “现状:开发已结束”Chrome 开发者文档中有一条提示,说明 Notification Triggers API 的开发「已经结束」,并给
出了原因:「无法确定我们能否在各平台上提供一致且可靠的体验。」MDN 当前关于
ServiceWorkerRegistration.showNotification() 的参考文档列出了其 options 对象
(actions、badge、body、data、dir、icon、image、lang、navigate、
renotify、requireInteraction、silent、tag、timestamp、vibrate),其中并未
包含 showTrigger 或 TimestampTrigger。
可能出错的地方
Section titled “可能出错的地方”- 把 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 的状态提示;「开发已结束」的提示未来可能 会被更新为其他状态。