Введение в бюджетный API

API push-сообщений позволяет нам отправлять уведомления пользователю, даже когда браузер закрыт. Многие разработчики хотят иметь возможность использовать этот обмен сообщениями для обновления и синхронизации контента без открытия браузера, но у API есть одно важное ограничение: вы всегда должны отображать уведомление для каждого полученного push-сообщения.

Возможность отправить push-сообщение для синхронизации данных на устройстве пользователя или скрыть ранее показанное вами уведомление может быть чрезвычайно полезно для пользователей и разработчиков, но разрешение веб-приложению выполнять работу в фоновом режиме без ведома пользователя может быть подвергнуто злоупотреблениям. .

Budget API — это новый API, позволяющий разработчикам выполнять ограниченную фоновую работу без уведомления пользователя, например автоматическую отправку данных или выполнение фоновой выборки. В Chrome 60 и более поздних версиях вы сможете начать использовать этот API, и команда Chrome с нетерпением ждет обратной связи от разработчиков.

Чтобы позволить разработчикам потреблять ресурсы пользователя в фоновом режиме, веб-платформа представляет концепцию бюджета с использованием нового API бюджета. Каждому сайту будет выделено определенное количество ресурсов в зависимости от вовлеченности пользователей, которое они смогут использовать для фоновых действий, таких как автоматическое нажатие, когда каждая операция истощает бюджет. Когда бюджет израсходован, фоновые действия больше не могут выполняться без видимости пользователя. Пользовательский агент будет отвечать за определение бюджета, назначенного веб-приложению, на основе его эвристики, например, бюджетный лимит может быть связан с вовлечением пользователей. Каждый браузер может выбрать свою собственную эвристику.

TL;DR Бюджетный API позволяет вам резервировать бюджет, использовать бюджет, получать список оставшегося бюджета и понимать стоимость фоновых операций.

Резервирование бюджета

В Chrome 60 и более поздних версиях метод navigator.budget.reserve() будет доступен без каких-либо флагов.

Метод reserve() позволяет вам запросить бюджет для конкретной операции и вернет логическое значение, указывающее, можно ли зарезервировать бюджет. Если бюджет был зарезервирован, нет необходимости уведомлять пользователя о вашей фоновой работе.

В примере с push-уведомлениями вы можете попытаться зарезервировать бюджет для операции «тихого нажатия», и если 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 «тихий ввод» — единственный доступный тип операции, но полный список типов операций можно найти в спецификации . Также нет простого способа увеличить бюджет на тестирование или отладку после его использования, но в качестве временного обходного пути вы можете создать новый профиль в Chrome. К сожалению, вы также не можете использовать для этого инкогнито, поскольку Budget API вернет нулевой бюджет в Incognito (хотя во время моего тестирования произошла ошибка, которая привела к ошибке ).

Вам следует вызывать reserve() только тогда, когда вы собираетесь выполнить операцию, которую резервируете, в какой-то момент в будущем. Обратите внимание: если вы вызвали резерв в приведенном выше примере, но все равно отобразили уведомление, бюджет все равно будет использован.

Одним из распространенных случаев использования, который не включается только с помощью reserve() , является возможность запланировать тихую отправку данных из бэкэнда. У Budget API есть API для реализации этого варианта использования, но над ними все еще ведется работа в Chrome и в настоящее время они доступны только с флагами и/или пробной версией Origin .

Бюджетный API и пробные версии Origin

Существует два метода: getBudget() и getCost() , которые веб-приложение может использовать для планирования использования своего бюджета.

В Chrome 60 оба этих метода доступны, если вы подпишетесь на пробную версию Origin, но в противном случае для тестирования вы можете использовать их локально, включив флаг функций экспериментальной веб-платформы (Откройте chrome://flags/#enable-experimental-web- функции платформы в 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'.

Одним из преимуществ включения будущих бюджетных пособий является то, что разработчики могут делиться этой информацией со своей серверной частью, чтобы адаптировать поведение на стороне сервера (т. е. отправлять push-сообщение для запуска обновления только тогда, когда у клиента есть бюджет для тихой отправки).

Узнайте стоимость операции

Чтобы узнать, сколько будет стоить операция, вызов getCost() вернет число, указывающее максимальную сумму бюджета, которая будет израсходована, если вы вызовете reserve() для этой операции.

Например, мы можем узнать стоимость неотображения уведомления при получении push-сообщения (т. е. стоимость молчаливого push-уведомления) с помощью следующего кода:

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() . Вы все равно сможете зарезервировать операцию, если ваш текущий бюджет меньше указанной стоимости. Конкретные детали из спецификации следующие :

Это текущий API в Chrome, и поскольку Интернет продолжает поддерживать новые API, требующие возможности выполнять фоновую работу, например фоновую выборку , Budget API можно использовать для управления количеством операций, которые вы можете выполнять без уведомления пользователя.

При использовании API оставляйте отзывы о репозитории GitHub или сообщайте об ошибках Chrome на crbug.com .