Chrome 50 中的网络通知功能改进 - 图标、关闭事件、重新通知偏好设置和时间戳

借助推送通知,您可以为用户提供类似应用的出色体验,及时提醒他们有重要更新(例如收到的聊天消息)。通知平台在浏览器中相对较新,随着越来越多的用例和要求得到完善,我们发现通知 API 中新增了许多内容。Chrome 50(2016 年 3 月的 Beta 版)也不例外,它提供了至少 4 项新功能,可让开发者更好地控制通知。您可以:

  • 为通知按钮添加图标
  • 修改时间戳以打造一致的体验,
  • 跟踪通知关闭事件,以帮助同步通知并提供分析数据,
  • 管理当某个通知替换当前显示的通知时重新通知的体验。

Chrome 50 还添加了推送通知的载荷。如需随时了解 Chrome 中实现的 Notifications API,请遵循规范规范问题跟踪器

使用自定义图标创建引人注目的操作按钮

在最近的关于 Chrome 49 中的通知操作按钮的帖子中,我提到您无法向通知按钮附加图片以使其看起来时尚且富有吸引力,但您可以使用 Unicode 字符来内嵌表情符号等。现在,您不必担心了:借助这项近期推出的功能,您现在可以在操作按钮上指定图片:

self.registration.showNotification('New message from Alice', {
  actions: [
    {action: 'like', title: 'Like', icon: 'https://example/like.png'},
    {action: 'reply', title: 'Reply', icon: 'https://example/reply.png'}]
});
桌面通知

操作图标的外观因平台而异。例如,在 Android 设备上,图标在 Lollipop 及更高版本中会应用深灰色滤镜,在 Lollipop 之前的版本中会应用白色滤镜,而在桌面设备上,图标将是全彩的。(注意:我们正在讨论桌面设备上此功能的未来发展。)某些平台可能甚至无法显示操作图标,因此请确保您使用图标来为操作提供上下文,而不是将其用作 intent 的唯一指示器。

最后,由于必须下载资源,因此最好将图标尽可能缩小,并在安装事件中预缓存这些图标。(在撰写本文时,Chrome 中的通知资源提取尚未通过 Service Worker 路由。)

通知关闭事件

用户何时关闭通知是一项常被要求的通知功能。在最近对通知规范所做的一系列更改中添加了 notificationclose 事件之前,我们无法做到这一点。

通过使用 notificationclick 和 notificationclose 事件,您可以了解用户如何与通知互动。用户是让通知长时间保持打开状态,然后主动关闭,还是立即采取行动?

一个常见的用例是能够在设备之间同步通知。如果用户在桌面设备上关闭通知,则移动设备上的同一通知也应随之关闭。我们目前还无法静默执行此操作(请注意,每条推送消息都必须显示通知),但通过使用 notificationclose,您可以在服务器上跟踪用户的通知状态,并在用户使用其他设备时将其与其他设备同步,从而能够处理此操作。

如需使用 notificationclose 事件,请在您的服务工件中注册该事件,并且该事件仅在用户主动关闭通知时触发,例如,当用户关闭特定通知或关闭通知栏中的所有通知(在 Android 上)时。

如果 requireInteraction 标志为 false 或未设置,并且通知不是由用户手动关闭,而是由系统自动关闭,则系统不会触发 notificationclose 事件。

下面展示了一个简单的实现。当用户关闭通知时,您可以访问通知对象,从中执行自定义逻辑。

self.addEventListener('notificationclose', e => console.log(e.notification));

您可以在通知生成器中进行测试;关闭通知后,您会收到一条提醒。

替换现有通知时,请勿让用户感到厌烦

我很确定,当 Ben 叔叔说“能力越大,责任越大”时,他指的是通知系统,而不是彼得·帕克的超能力。通知系统是一种强大的与用户互动媒介。如果您滥用他们的信任,他们会关闭所有通知,您可能会完全失去他们。

创建通知时,您可以将其设置为发出提示音或振动,以吸引用户的注意力。此外,您还可以通过在新的通知对象上重复使用其“tag”属性来替换现有通知。

在 Chrome 50 之前,每当您创建通知或替换现有通知时,系统都会运行振动模式或播放提示音,这可能会让用户感到沮丧。现在,在 Chrome 50 中,您可以通过一个名为“renotify”的简单布尔标志来控制重新通知期间发生的情况。在后续通知中使用相同“标记”时,新的默认行为是静默通知,因此作为开发者,您必须选择通过将标志设置为“true”来“重新通知”用户。

self.registration.showNotification('Oi!', {
  'renotify': true,
  'tag': 'tag-id-1'
});

您可以在通知生成器中试用此功能。

管理向用户显示的时间戳

在 Android 设备上,Chrome 的通知默认会在右上角显示创建时间。很抱歉,这可能不是系统实际生成通知的时间。例如,事件可能在设备离线时触发,或者系统可能会针对即将召开的会议显示通知。从 Chrome 50 开始,Chrome 添加了新的“时间戳”属性,以便开发者提供应在通知中显示的时间。

self.registration.showNotification('Best day evar!', {
  'timestamp': 360370800000
});

时间戳目前仅在 Android 版 Chrome 中显示。虽然此字段在桌面设备上不可见,但会影响移动设备和桌面设备上的通知顺序。