使用 Web 推送

在扩展程序中,您可以使用任何推送提供程序发送推送通知和 消息。来自 Push API 的推送将作为 并在收到请求后立即处理如果 Service Worker 已被挂起,则 Push 将 再唤醒它。在扩展程序中使用它的流程与 可以在开放网络中使用

获取使用 Push API 的权限

在普通网站上注册推送服务器时,用户会看到一个 授予或拒绝它的权限提示。如果使用扩展程序, 。要在您的扩展程序中使用 Push API,您需要将 manifest.json 中的 notifications 权限

  {
    "manifest_version": 3,
    ...
    "permissions": ["notifications"]

如果您缺少此权限,那么与 registration.pushManager 将导致立即发生错误,结果与 如果用户拒绝了该权限,则会发生此错误。另请注意, notifications 权限将导致权限警告 在安装时显示Chrome 还会停用 现有安装,直到用户批准新权限请求。您可以 请参阅 权限警告指南

推送提供程序和推送服务

将权限添加到 manifest.json 后,您需要 配置后端与扩展程序之间的连接。此连接 可以分为两部分:推送提供程序和推送服务。答 provider 是您用来向推送服务发送消息的 SDK。 有许多不同的选项,任何推送提供程序都可以用于推送 API(尽管它们可能不会提供可以轻松集成的 SDK)。您 需要对您的提供商的 SDK 进行实验,看看能否实现。推 服务是最终用户设备注册时使用的服务,因此系统可以 发送到推送提供程序发送的任何推送消息。您并不需要 因为它已硬编码到各个浏览器中。对于 Chrome,Firebase Cloud Messaging 是一项推送服务。推送到 Chrome 的任何消息 用户将通过它进行路由

自行托管推送提供商

任何推送提供程序都可以运行,但并非所有提供程序都提供有效的 SDK Service Worker 中的资源。如果您遇到问题,需要咨询您的提供商 确保它正常运行不过,您无需使用公共提供商。使用 web-push 等库,您可以托管自己的后端。

您可以使用 web-push-codelab.glitch.me.具体来说,您需要 复制推送服务器的 VAPID 公钥,以便生成推送 订阅。此公钥实际上是 base64 需要解码并转换为 Uint8Array,以便向浏览器的推送功能注册 管理员。有一些库可用于执行此逻辑 只需执行以下操作即可。

function urlB64ToUint8Array(base64String) {
  const padding = '='.repeat((4 - (base64String.length % 4)) % 4);
  const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/');

  const rawData = atob(base64);
  const outputArray = new Uint8Array(rawData.length);

  for (let i = 0; i < rawData.length; ++i) {
    outputArray[i] = rawData.charCodeAt(i);
  }
  return outputArray;
}

提供的值将传递到推送管理器中

const SERVER_PUBLIC_KEY = '_INSERT_VALUE_HERE_';
const applicationServerKey = urlB64ToUint8Array(SERVER_PUBLIC_KEY);

async function subscribe() {
  try {
    let subscription = await self.registration.pushManager.subscribe({
      userVisibleOnly: true,
      applicationServerKey
    });

    console.log(`Subscribed: ${JSON.stringify(subscription,0,2)}`);

    return subscription
  } catch (error) {
    console.error('Subscribe error: ', error);
  }
}

const subscription = await subscribe();

subscribe 函数会返回 PushSubscription, 对象,该对象包含推送服务器的元数据。由于您使用的是 web-push-codelab.glitch.me,则需要将此值复制到 页面的“推送订阅”部分

有了 PushSubscription 后,您就可以为 在我们的扩展程序的 Service Worker 中推送消息。

self.addEventListener('push', function (event) {
  console.log(`Push had this data/text: "${event.data.text()}"`);
});

安装好监听器后,您就可以通过 web-push-codelab.glitch.me,然后系统就会将消息记录到 Service Worker 的控制台。

由于它是一种开放式网络标准, 如何实现网络推送,包括在 Chrome 博客上。对于 该示例的完整版本, 扩展程序示例代码库

静默推送

您过去可以在 Manifest V3 扩展程序中收到推送通知 从 Chrome 88 中引入 Manifest V3。不过,过去一直有 要求通知显示某种用户可见提示, (如网络通知)。这就会大幅降低 希望将命令或数据更新推送到您的扩展程序,而不费心 提供不必要的信息自 Chrome 121 起,扩展程序 能够将 userVisibleOnly 设为 false。您现在可以发送 不向用户显示的静默推送通知。要使用这项功能 在调用 pushManager.subscribe 时,将 userVisibleOnly 设置为 false

let subscription = await self.registration.pushManager.subscribe({
  userVisibleOnly: false,
  applicationServerKey
});