Wprowadzenie do interfejsu Budget API

Interfejs Push Messaging API umożliwia wysyłanie powiadomień do użytkownika, nawet gdy przeglądarka jest zamknięta. Wielu programistów chce mieć możliwość używania tych komunikatów do aktualizowania i synchronizowania treści bez otwierania przeglądarki, ale interfejs API ma jedno ważne ograniczenie: musisz zawsze wyświetlać powiadomienie o każdej otrzymanej wiadomości push.

Wysyłanie powiadomień push w celu zsynchronizowania danych na urządzeniu użytkownika lub ukrycia powiadomienia, które zostało wcześniej wyświetlone, może być bardzo przydatne dla użytkowników i programistów, ale zezwolenie aplikacji internetowej na działanie w tle bez wiedzy użytkownika może prowadzić do nadużyć.

Interfejs Budget API to nowy interfejs API, który umożliwia deweloperom wykonywanie ograniczonych operacji w tle bez powiadamiania użytkownika, np. bezgłośne wysyłanie powiadomień push lub pobieranie w tle. W Chrome 60 i nowszych wersjach możesz zacząć korzystać z tego interfejsu API, a zespół Chrome chętnie pozna opinie programistów.

Aby umożliwić deweloperom korzystanie z zasobów użytkownika w tle, na platformie internetowej wprowadzono koncepcję budżetu za pomocą nowego interfejsu Budget API. Każda witryna otrzyma zasoby na podstawie zaangażowania użytkowników, które mogą wykorzystać na działania w tle, takie jak bezgłośne powiadomienia push. Każda operacja powoduje zmniejszenie budżetu. Gdy budżet zostanie wyczerpany, działania w tle nie będą mogły być wykonywane bez widoczności dla użytkownika. Klient użytkownika będzie odpowiadać za określanie budżetu przypisanego do aplikacji internetowej na podstawie jej heurystyki, np. czy limit budżetu może być powiązany z zaangażowaniem użytkownika. Każda przeglądarka może stosować własną heurystyk.

TL;DR: interfejs Budget API umożliwia rezerwowanie budżetu, korzystanie z budżetu, uzyskiwanie listy pozostałego budżetu i poznawanie kosztów operacji w tle.

Budżet zarezerwowany

W Chrome 60 i nowszych metoda navigator.budget.reserve() będzie dostępna bez flag.

Metoda reserve() umożliwia żądanie budżetu na konkretną operację i zwraca wartość logiczną wskazującą, czy można zarezerwować budżet. Jeśli budżet został zarezerwowany, nie trzeba powiadamiać użytkownika o Twojej pracy w tle.

W przypadku powiadomień push możesz spróbować zarezerwować budżet na operację „silent-push”. Jeśli reserve() zwróci wartość true, operacja będzie dozwolona. W przeciwnym razie zwraca wartość false (fałsz) i konieczne będzie pokazanie powiadomienia.

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);
});

W Chrome 60 jedynym dostępnym typem operacji jest „push bez potwierdzenia”, ale pełną listę typów operacji znajdziesz w specyfikacji. Nie ma też łatwego sposobu zwiększania budżetu na potrzeby testowania lub debugowania po użyciu tej metody, ale jako tymczasowe obejście możesz utworzyć nowy profil w Chrome. Niestety nie można do tego używać trybu incognito, ponieważ w trybie incognito budżet interfejsu Budget API będzie wskazywał budżet zerowy (chociaż podczas testów występuje błąd, który powoduje błąd).

Wywołuj funkcję reserve() tylko wtedy, gdy zamierzasz wykonać operację zarezerwowaną w jakimś momencie w przyszłości. Pamiętaj, że jeśli w powyższym przykładzie wywołano funkcję Zarezerwuj, a mimo to wyświetliło się powiadomienie, budżet nadal będzie używany.

Typowym przypadkiem użycia, który nie jest włączony tylko w reserve(), jest możliwość zaplanowania cichego przekazywania danych z backendu. Interfejs Budget API ma interfejsy API umożliwiające ten przypadek użycia, ale wciąż nad nimi pracujemy w Chrome i obecnie są dostępne tylko z wykorzystaniem flag lub wersji próbnej origin.

Interfejs Budget API i wersje próbne origin

Aplikacja internetowa może planować wykorzystanie budżetu na 2 sposoby: getBudget()getCost().

W Chrome 60 obie te metody są dostępne, jeśli zarejestrujesz się w testach wersji próbnej. W przeciwnym razie możesz ich używać lokalnie, włączając flagę Eksperymentalne funkcje platformy internetowej (w Chrome otwórz chrome://flags/#enable-experimental-web-platform-features).

Zobaczmy, jak używać tych interfejsów API.

Sprawdź swój budżet

Dostępny budżet możesz sprawdzić, korzystając z metody getBudget(). W niektórych przeglądarkach (np. Chrome) budżet „maleje” z upływem czasu. Aby zapewnić Ci pełną widoczność, zwracamy tablicę BudgetStates, która wskazuje, jaki budżet będzie miał w różnych momentach w przyszłości.

Aby wyświetlić listę wpisów budżetowych, które możemy uruchomić:

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

Pierwszym elementem będzie bieżący budżet, a dodatkowe wartości pokazują, jaki budżet będzie wykorzystywany w różnych momentach w przyszłości.

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'.

Jedną z zalet uwzględniania przyszłych limitów budżetowych jest to, że deweloperzy mogą udostępniać te informacje backendowi, aby dostosować działanie po stronie serwera (np. wysyłać powiadomienia push tylko wtedy, gdy klient ma budżet na powiadomienia cichsze).

Pobieranie kosztu operacji

Aby dowiedzieć się, ile będzie kosztować dana operacja, wywołanie funkcji getCost() zwróci liczbę wskazującą maksymalną kwotę budżetu, która zostanie wykorzystana, jeśli wywołasz funkcję getCost() dla tej operacji.reserve()

Możemy na przykład poznać koszt niewyświetlania powiadomień po otrzymaniu wiadomości push (tj. koszt cichego powiadomienia push) za pomocą tego kodu:

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

W momencie pisania tego tekstu Chrome 60 umożliwia drukowanie:

Cost of silent push is: 2

W przypadku metod reserve()getCost() należy pamiętać, że rzeczywisty koszt operacji może być mniejszy niż koszt zwrócony przez funkcję getCost(). Jeśli Twój obecny budżet jest mniejszy niż wskazany koszt, nadal możesz zarezerwować operację. Szczegóły specyfikacji są następujące:

To jest bieżący interfejs API w Chrome, a ponieważ internet nadal obsługuje nowe interfejsy API, które wymagają możliwości wykonywania pracy w tle, np. pobierania w tle, za pomocą interfejsu Budget API można zarządzać liczbą operacji, które można wykonać bez powiadamiania użytkownika.

Podczas korzystania z interfejsu API prześlij opinię w repozytorium GitHub lub zgłoszenie błędu w Chrome na stronie crbug.com.