Introduzione all'API Budget

L'API Push Messaging ci consente di inviare notifiche a un utente anche quando il browser è chiuso. Molti sviluppatori vogliono poter usare questi messaggi per: aggiornare e sincronizzare i contenuti senza che il browser sia aperto, ma l'API ha una limitazione importante: devi sempre visualizzare una notifica per ogni è stato ricevuto un singolo messaggio push.

Possibilità di inviare un messaggio push per sincronizzare i dati sul dispositivo di un utente o per nasconderli una notifica che hai visualizzato in precedenza può essere estremamente utile per gli utenti sviluppatori, ma consentire a un'app web di lavorare in background senza che l'utente è soggetta ad abusi.

L'API Budget, è una nuova API progettata per consentire agli sviluppatori di eseguire lavori in background limitati senza informare l'utente, ad esempio con push silenzioso o eseguendo in background recupero. In Chrome 60 e versioni successive puoi iniziare a utilizzare questa API e Il team di Chrome non vede l'ora di ricevere feedback dagli sviluppatori.

Per consentire agli sviluppatori di utilizzare le risorse di un utente in background, il web sta introducendo il concetto di budget utilizzando la nuova API Budget. Ciascuna al sito verrà assegnata una quantità di risorse in base al coinvolgimento degli utenti che può essere utilizzato per le azioni in background, come un push silenzioso, in cui ogni operazione esaurisce il budget. Quando è esaurito il budget, le azioni in background non possono più essere eseguite visibilità. Lo user agent sarà responsabile di determinare il budget Assegnato a un'app web in base alla sua euristica, ad esempio il budget potrebbe essere collegato al coinvolgimento degli utenti. Ogni browser può decidere la propria euristica.

TL;DR L'API Budget consente di prenotare i budget, utilizzarli e ottenere un elenco del budget rimanente e comprendere il costo delle operazioni in background

Prenotazione del budget

In Chrome 60 e versioni successive, sarà disponibile il metodo navigator.budget.reserve() senza flag.

Il metodo reserve() ti consente di richiedere un budget per un'operazione specifica e restituirà un valore booleano per indicare se il budget può essere riservato. Se il budget è stato prenotato, non è necessario informare l'utente del tuo background al lavoro.

Nell'esempio delle notifiche push, puoi tentare di prenotare un budget per un "push-silenzio" e se reserve() si risolve con true, l'operazione viene consentito. In caso contrario, restituirà false e dovrai mostrare una notifica

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

In Chrome 60, "silent-push" è l'unico tipo di operazione ma puoi trovare elenco completo dei tipi di operazioni nella specifica. Inoltre, non esiste un modo semplice per aumentare il budget per i test o il debug una volta usato, ma come soluzione alternativa temporanea puoi creare un nuovo profilo in Chrome. Purtroppo non puoi usare la modalità in incognito nemmeno per questa opzione come budget l'API restituirà un budget pari a zero in modalità di navigazione in incognito (sebbene sia presente una bug che restituisce un errore durante i test).

Devi chiamare reserve() solo quando intendi eseguire l'operazione che stai prenotare in futuro. Tieni presente che se hai chiamato Prenota precedente, ma con una notifica, il budget verrà comunque utilizzato.

Un caso d'uso comune che non viene attivato soltanto da reserve() è la possibilità di di pianificare un push silenzioso da un backend. L'API Budget dispone di API per abilitare per questo caso d'uso, ma sono ancora in fase di sviluppo in Chrome disponibile solo dietro segnalazioni e / o una prova dell'origine.

API Budget e prove dell'origine

Esistono due metodi, getBudget() e getCost(), che possono essere utilizzati da un'app web per pianificare l'utilizzo del budget.

In Chrome 60, entrambi i metodi sono disponibili se ti registri alla prova dell'origine ma per il test puoi usarle localmente abilitando Funzionalità sperimentali della piattaforma web (Apri chrome://flags/#enable-experimental-web-platform-features in Chrome).

Vediamo come si utilizzano queste API.

Ottieni il tuo budget

Puoi trovare il budget disponibile con il metodo getBudget(). Alcuni browser (come Chrome) avranno "decadimento" del budget nel tempo, quindi per offrirti per la visibilità, questo restituisce un array di BudgetStates, che indica quale in futuro in vari momenti.

Per elencare le voci del budget che possiamo eseguire:

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

La prima voce sarà il budget corrente e verranno visualizzati i valori aggiuntivi come sarà il budget nei vari momenti in futuro.

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

Uno dei vantaggi dell'inclusione di quote di budget future è che gli sviluppatori possono condivide queste informazioni con il backend per adattare il comportamento lato server Ad esempio, invia un messaggio push per attivare un aggiornamento solo quando il cliente dispone del budget. per un push silenzioso).

Calcola il costo di un'operazione

Per scoprire il costo di un'operazione, se chiami il numero getCost() verrà restituito numero che indica l'importo massimo del budget che verrà utilizzato se chiami reserve() per l'operazione.

Ad esempio, possiamo scoprire il costo della mancata visualizzazione di una notifica quando ricevi un messaggio push (ovvero il costo di un push silenzioso) con le seguenti informazioni: codice:

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

Al momento della stesura di questo documento, Chrome 60 stamperà:

Cost of silent push is: 2

Una cosa da evidenziare con i metodi reserve() e getCost() è che il costo effettivo di un'operazione può essere inferiore al costo restituito da getCost(). Se il budget attuale è inferiore, potresti comunque riuscire a prenotare un'operazione rispetto al costo indicato. I dettagli specifici delle specifiche sono segue:

Questa è l'API attuale di Chrome e dato che il web continua a supportare le nuove API che richiedono la capacità di eseguire lavori in background, come il recupero in background, l'API Budget può essere utilizzata gestire il numero di operazioni che puoi eseguire senza informare l'utente.

Quando utilizzi l'API, fornisci feedback sul repository GitHub o segnala i bug di Chrome all'indirizzo crbug.com.