利用 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 错误。