Budget API 简介

利用 Push Messaging API,我们可以向用户发送通知,即使 浏览器已关闭。许多开发者都希望能够使用这种消息 可在不打开浏览器的情况下更新和同步内容, 有一个重要的限制是,对于每个 Google 发布商 收到单条推送消息

能够发送推送消息以同步用户设备上的数据或隐藏 您之前看到过的通知可能非常实用, 让 Web 应用无需用户即可在后台运行 可能会遭到滥用。

Budget API 是一种新 API,旨在让开发者能够 而不通知用户,例如静默推送或在后台执行 提取。在 Chrome 60 及更高版本中,您将能开始使用此 API 和 Chrome 团队热切希望获得开发者的反馈。

为了让开发者能够在后台消耗用户的资源, 平台引入采用新的预算 API 的预算概念。每个 网站会获得一定数量的资源 具体取决于其在自己网站上 可用于后台操作、 例如静默推送,即每次操作都会耗尽预算。当 预算已用尽,没有用户就无法执行后台操作 可见性。用户代理将负责确定预算 根据其启发法(例如预算限额)分配给 Web 应用 都可能与用户互动度关联起来每个浏览器都可以决定自己的启发法。

TL;DRBudget API 可让您预留预算、使用预算、获取列表 剩余预算,并了解后台操作的费用

预留预算

在 Chrome 60 及更高版本中,navigator.budget.reserve() 方法将可用 不带任何标志

借助 reserve() 方法,您可以为特定操作请求预算,并 则会返回一个布尔值,指明预算是否可以预留。如果 预算已预留,无需通知用户您的背景知识 工作。

在推送通知示例中,您可以尝试为 “静默推送”操作,如果 reserve() 解析为 true,则操作为 允许。否则它会返回 false,并且您需要显示通知。

self.addEventListener('push', event => {
 const promiseChain = navigator.budget.reserve('silent-push')
   .then((reserved) => {
     if (reserved) {
       // No need to show a notification.
       return;
     }

     // Not enough budget is available, must show a notification.
     return registration.showNotification(...);
   });
 event.waitUntil(promiseChain);
});

在 Chrome 60 中,“静默推送”是唯一一个 但您可以找到 规范中列出操作类型的完整列表。 也没有简单的方法可以增加测试或调试的预算 但临时的解决办法是,您可以创建一个新的 个人资料。很抱歉,您不能将无痕模式用作预算限额 在无痕模式下,API 将返回预算为零(尽管 导致出错的 bug )。

仅当您打算执行操作时,才应调用 reserve() 在将来的某个时间点预订的请注意,如果您在 如上例所示,但仍显示了通知,则系统仍会使用此预算。

reserve() 无法实现的一个常见用例是 从后端调度静默推送预算 API 确实有 API 来启用 但它们仍在 Chrome 中处理,目前 仅在标志和 / 或源试用后才可用。

预算 API 和源试用

Web 应用可以使用两种方法:getBudget()getCost() 来规划预算的使用情况

在 Chrome 60 中,如果您注册参与源试用,则可以使用这两种方法 但对于测试,您可以在本地使用它们 实验性网络平台功能 标志(在以下位置打开 chrome://flags/#enable-experimental-web-platform-features Chrome)。

我们来看看如何使用这些 API。

获取预算

您可以使用 getBudget() 方法查找可用预算。某些浏览器 (例如 Chrome)的预算会“衰减”随着时间的推移, 则返回一个 BudgetStates 数组,指明您的预算 会在将来不同时间出现

要列出预算条目,我们可以运行以下命令:

navigator.budget.getBudget()
.then((budgets) => {
  budgets.forEach((element) => {
    console.log(\`At '${new Date(element.time).toString()}' \` +
      \`your budget will be '${element.budgetAt}'.\`);
  });
});

第一个条目是您当前的预算,另外还会显示其他值 您可以确定未来各个时间点的预算是多少

At 'Mon Jun 05 2017 12:47:20' you will have a budget of '3'.
At 'Fri Jun 09 2017 10:42:57' you will have a budget of '2'.
At 'Fri Jun 09 2017 12:31:09' you will have a budget of '1'.

加入未来预算津贴的好处之一是,开发者可以 与其后端共享此信息,以调整其服务器端行为 (即,仅当客户端有预算时才发送推送消息以触发更新 )。

获取操作费用

为了解操作的费用,调用 getCost() 将返回 一个数字,表示如果您调用 reserve()

例如,我们可以了解 接收包含以下内容的推送消息(即静默推送的费用), 代码:

navigator.budget.getCost('silent-push')
.then((cost) => {
  console.log('Cost of silent push is:', cost);
})
.catch((err) => {
  console.error('Unable to get cost:', err);
});

在撰写本文时,Chrome 60 将会输出以下内容:

Cost of silent push is: 2

reserve()getCost() 方法需要强调的一点是, 操作的实际费用可能小于 getCost() 返回的费用。 如果您目前的预算低于预期,您或许仍可预订某项操作 高于指明的费用规范中的具体详情如下:

这是 Chrome 中现行的 API,随着网络对新 API 的支持, 需要能够执行后台工作(如后台提取),Budget API 可用于 管理在不通知用户的情况下可以执行的操作数量。

使用此 API 时,请在 GitHub 代码库中提供反馈 或在 crbug.com 上提交 Chrome 错误。