5

Ho letto i documenti per l'implementazione di Chrome dell'API Web Push here e ho notato che l'API dice "prometti di mostrare una notifica ogni volta che ricevi una spinta" e sotto le limitazioni è dichiarato "è avere per mostrare una notifica quando si riceve un messaggio push".Notifiche push silenziose Google Chrome

Dopo aver implementato l'esempio sul mio localhost, ho usato cURL per inviare correttamente una notifica push. Ero curioso, quindi ho commentato le righe che in realtà chiamano la funzione showNotification e ho inserito un console.log e ho scoperto che potevo, infatti, inviare, ricevere e ignorare totalmente una notifica push. Ho anche provato a usare un'istruzione if per controllare se mostrarli o meno in base al booleano globale controllato dalla mia pagina principale, e questo ha funzionato. Quindi mi chiedevo se qualcuno sapeva cosa volevano dire dicendo che è necessario mostrare una notifica e che le notifiche push silenziose non erano disponibili?

Questo non era solo per il gusto di farlo, ho legittimamente potrebbe essere necessario controllare se mostrare o meno queste notifiche nella mia app Web, quindi sarebbe bello se fosse effettivamente possibile. Codice sotto nel caso in cui sei curioso.

self.addEventListener('push', function(event) { 
    var title = 'New Message'; 
    var body = 'You have received a new message!'; 
    var icon = '/img/favicon.png'; 
    var tag = 'well-notification'; 
    console.log("DID RECEIVE NOTIFICATION") 

    if(settingsShowNotification) { 
    event.waitUntil(
     self.registration.showNotification(title, { 
     body: body, 
     icon: icon, 
     tag: tag 
     }) 
    ); 
    } 
}); 

EDIT: Su Chrome 47, se è rilevante.

AGGIORNAMENTO: Dopo ulteriori esperimenti, ho trovato il problema ovvio che non è possibile aggiornare la variabile globale originale una volta che l'utente si allontana e quindi ri-naviga alla stessa pagina. Tuttavia, sono stato in grado di aggirare questo problema utilizzando una variabile sul servicestore stesso e inviando un messaggio al lavoratore del servizio utilizzando l'API descritta here per attivare il valore booleano showNotifications.

risposta

7

Tu devi mostrare una notifica, e se non si mostra una notifica si ottiene una notifica forzata dal browser dicendo "Questo sito è stato aggiornato in background". Ma i requisiti che mostrano il messaggio spaventoso sono stati leggermente allentati:

A partire dal gennaio 16, sembra che fino a quando le ultime 10 notifiche siano state verificate per indicare se ciascuna ha mostrato o meno una notifica. Se una notifica negli ultimi dieci notifiche fatto non mostrano una notifica, che è considerato un incidente e il browser non mostrerà la paura "Questo sito è stato aggiornato in background". Devi perdere due notifiche negli ultimi dieci per il messaggio spaventoso a comparire.

Nota: Se l'URL nella barra degli indirizzi della scheda del browser attiva corrisponde l'origine della pagina, e il browser è non ridotto al minimo, si è non richiesto per mostrare una notifica. Questo è probabilmente il motivo per cui i test sono riusciti, se eri sulla pagina stessa mentre eseguivi i test.

cromo bug che traccia l'attuazione: https://code.google.com/p/chromium/issues/detail?id=437277

linee rilevanti del codice sorgente: https://code.google.com/p/chromium/codesearch#chromium/src/chrome/browser/push_messaging/push_messaging_notification_manager.cc&l=249

+0

Wow! Grazie per questa risposta. Grande scoperta! –

+3

Nel nostro caso, dopo aver ricevuto una notifica controlliamo lo stato del server e mostrare la notifica solo se una condizione è soddisfatta. Per evitare che una notifica forzata torniamo mai adempiuto promessa come 'event.waitUntil (nuova promessa (function() {}))'. –

+0

Coppia di commenti. Se si vuole rilevare se è necessario mostrare una notifica, controllare i clienti delle finestre attualmente aperte e vedere se qualcuno di loro visibilityState === 'visibile'. C'è una nuova specifica chiamata Budget API che consentirà agli sviluppatori di verificare se possono * not * mostrare una notifica (cioè consentire push silenzioso) ma questo sarà limitato a un determinato importo. –