Visualizzazione di una notifica

Le opzioni di notifica sono suddivise in due sezioni: una che riguarda gli aspetti visivi (questa sezione) e una che spiega gli aspetti comportamentali delle notifiche (la sezione successiva).

Puoi sperimentare varie opzioni di notifica in diversi browser su varie piattaforme utilizzando il generatore di notifiche di Peter Beverloo.

Opzioni visive

L'API per mostrare una notifica è semplice:

<ServiceWorkerRegistration>.showNotification(<title>, <options>);

Entrambi gli argomenti, title e options, sono facoltativi.

Il titolo è una stringa e le opzioni possono essere una delle seguenti:

{
  "//": "Visual Options",
  "body": "<String>",
  "icon": "<URL String>",
  "image": "<URL String>",
  "badge": "<URL String>",
  "dir": "<String of 'auto' | 'ltr' | 'rtl'>",
  "timestamp": "<Long>"

  "//": "Both visual & behavioral options",
  "actions": "<Array of Strings>",
  "data": "<Anything>",

  "//": "Behavioral Options",
  "tag": "<String>",
  "requireInteraction": "<boolean>",
  "renotify": "<Boolean>",
  "vibrate": "<Array of Integers>",
  "sound": "<URL String>",
  "silent": "<Boolean>",
}

Diamo un'occhiata alle opzioni visive:

Analisi della UI di una notifica.

Opzioni per titolo e corpo

Ecco come appare una notifica senza titolo e opzioni in Chrome su Windows:

Notifica senza titolo e opzioni in Chrome su Windows.

Come puoi vedere, il nome del browser viene utilizzato come titolo e il segnaposto "Nuova notifica" viene utilizzato come corpo della notifica.

Se sul dispositivo è installata un'applicazione web progressiva, verrà utilizzato il nome dell'app web anziché il nome del browser:

Notifica con il nome dell'app web anziché con il nome del browser.

Se eseguiamo il seguente codice:

const title = 'Simple Title';

const options = {
  body: 'Simple piece of body text.\nSecond line of body text :)',
};

registration.showNotification(title, options);

riceveremmo questa notifica in Chrome su Linux:

Notifica con titolo e corpo del testo in Chrome su Linux.

In Firefox su Linux, l'aspetto sarà il seguente:

Notifica con titolo e corpo del testo in Firefox su Linux.

Ecco come appare la notifica con molto testo nel titolo e nel corpo in Chrome su Linux:

Notifica con titolo e corpo del testo lunghi in Chrome su Linux.

Firefox su Linux comprime il corpo del testo finché non passi il mouse sopra la notifica, espandendola:

Notifica con titolo lungo e corpo del testo in Firefox su Linux.

Notifica con titolo e corpo del testo lunghi in Firefox su Linux mentre passi il mouse sopra la notifica con il cursore del mouse.

Le stesse notifiche in Firefox su Windows hanno il seguente aspetto:

Notifica con titolo e corpo del testo in Firefox su Windows.

Notifica con titolo e corpo del testo lunghi in Firefox su Windows.

Come puoi vedere, la stessa notifica può avere un aspetto diverso in browser diversi. Potrebbe anche avere un aspetto diverso nello stesso browser su piattaforme diverse.

Chrome e Firefox utilizzano le notifiche di sistema e il centro notifiche sulle piattaforme in cui sono disponibili.

Ad esempio, le notifiche di sistema su macOS non supportano immagini e azioni (pulsanti e risposte incorporate).

Chrome dispone anche di notifiche personalizzate per tutte le piattaforme desktop. Puoi attivarlo impostando il flag chrome://flags/#enable-system-notifications sullo stato Disabled.

Icona

L'opzione icon è essenzialmente una piccola immagine che puoi mostrare accanto al titolo e al corpo del testo.

Nel codice devi fornire un URL per l'immagine che vuoi caricare:

const title = 'Icon Notification';

const options = {
  icon: '/images/demos/icon-512x512.png',
};

registration.showNotification(title, options);

Ricevi questa notifica in Chrome su Linux:

Notifica con icona in Chrome su Linux.

e in Firefox su Linux:

Notifica con icona in Firefox su Linux.

Purtroppo non esistono linee guida precise sulle dimensioni dell'immagine da utilizzare per un'icona.

Android sembra richiedere un'immagine da 64 dp (ovvero 64 px moltiplicati per il rapporto pixel del dispositivo).

Supponendo che il rapporto pixel più alto per un dispositivo sia 3, una dimensione dell'icona di 192 px o più è una scelta sicura.

Badge

La badge è una piccola icona monocromatica che viene utilizzata per fornire all'utente qualche informazione in più sulla provenienza della notifica:

const title = 'Badge Notification';

const options = {
  badge: '/images/demos/badge-128x128.png',
};

registration.showNotification(title, options);

Al momento della stesura di questo articolo, il badge viene utilizzato solo in Chrome su Android.

Notifica con badge in Chrome su Android.

Su altri browser (o su Chrome senza il badge), vedrai l'icona del browser.

Notifica con badge in Firefox su Android.

Come per l'opzione icon, non esistono linee guida reali sulle dimensioni da utilizzare.

Consultando le linee guida di Android, la dimensione consigliata è 24 px moltiplicata per il rapporto pixel del dispositivo.

Ciò significa che un'immagine di almeno 72 px dovrebbe essere sufficiente (supponendo un rapporto pixel del dispositivo massimo di 3).

Immagine

L'opzione image può essere utilizzata per mostrare all'utente un'immagine più grande. Questo è particolarmente utile per mostrare un'immagine di anteprima all'utente.

const title = 'Image Notification';

const options = {
  image: '/images/demos/unsplash-farzad-nazifi-1600x1100.jpg',
};

registration.showNotification(title, options);

In Chrome su Linux, la notifica sarà simile alla seguente:

Notifica con immagine in Chrome su Linux.

In Chrome su Android, il ritaglio e il rapporto sono diversi:

Notifica con immagine in Chrome su Android.

Date le differenze di proporzioni tra desktop e dispositivi mobili, è estremamente difficile suggerire linee guida.

Poiché Chrome su computer non riempie lo spazio disponibile e ha un rapporto di 4:3, forse l'approccio migliore è pubblicare un'immagine con questo rapporto e consentire ad Android di ritagliarla. Detto questo, l'opzione image potrebbe comunque cambiare.

Su Android, l'unica linea guida è una larghezza di 450 dp.

In base a questa linea guida, un'immagine con una larghezza di almeno 1350 px sarebbe una buona scelta.

Azioni (pulsanti)

Puoi definire actions per visualizzare i pulsanti con una notifica:

const title = 'Actions Notification';

const options = {
  actions: [
    {
      action: 'coffee-action',
      type: 'button',
      title: 'Coffee',
      icon: '/images/demos/action-1-128x128.png',
    },
    {
      action: 'doughnut-action',
      type: 'button',
      title: 'Doughnut',
      icon: '/images/demos/action-2-128x128.png',
    },
    {
      action: 'gramophone-action',
      type: 'button',
      title: 'Gramophone',
      icon: '/images/demos/action-3-128x128.png',
    },
    {
      action: 'atom-action',
      type: 'button',
      title: 'Atom',
      icon: '/images/demos/action-4-128x128.png',
    },
  ],
};

registration.showNotification(title, options);

Per ogni azione puoi definire un title, un action (che è essenzialmente un ID), un icon e un type. Il titolo e l'icona sono ciò che puoi vedere nella notifica. L'ID viene utilizzato per rilevare che è stato fatto clic sul pulsante di azione (maggiori informazioni nella sezione successiva). Il tipo può essere omesso perché 'button' è il valore predefinito.

Al momento della stesura di questo articolo, solo Chrome e Opera per Android supportano le azioni.

Nell'esempio precedente sono definite quattro azioni per illustrare che puoi definire più azioni di quelle che verranno visualizzate. Se vuoi conoscere il numero di azioni che verranno visualizzate dal browser, puoi controllare window.Notification?.maxActions:

const maxVisibleActions = window.Notification?.maxActions;

if (maxVisibleActions) {
  options.body = `Up to ${maxVisibleActions} notification actions can be displayed.`;
} else {
  options.body = 'Notification actions are not supported.';
}

Su computer, le icone dei pulsanti di azione mostrano i loro colori (vedi la ciambella rosa):

Notifica con pulsanti di azione su Chrome su Linux.

Su Android 6 e versioni precedenti, le icone sono colorate in modo da corrispondere alla combinazione di colori del sistema:

Notifica con pulsanti di azione su Chrome per Android.

Su Android 7 e versioni successive, le icone delle azioni non vengono visualizzate affatto.

Si spera che Chrome modifichi il suo comportamento su computer per adattarsi ad Android (ovvero applicare la combinazione di colori appropriata per far corrispondere le icone all'aspetto del sistema). Nel frattempo, puoi abbinare il colore del testo di Chrome impostando il colore delle icone su #333333.

Vale anche la pena sottolineare che le icone appaiono nitide su Android, ma non su computer.

La dimensione migliore che sono riuscito a far funzionare su Chrome per computer è stata 24 x 24 px. Purtroppo, questo aspetto non è in linea con Android.

La best practice che possiamo trarre da queste differenze è:

  • Utilizza una combinazione di colori coerente per le tue icone, in modo che vengano visualizzate in modo coerente per l'utente.
  • Assicurati che funzionino in bianco e nero, poiché alcune piattaforme potrebbero visualizzarle in questo modo.
  • Prova le dimensioni e scopri cosa funziona per te. 128 px × 128 px funziona bene su Android, ma la qualità era scarsa su computer.
  • Le icone delle azioni non verranno visualizzate.

La specifica Notification sta esplorando un modo per definire più dimensioni delle icone, ma sembra che ci vorrà un po' di tempo prima che venga raggiunto un accordo.

Azioni (risposte incorporate)

Puoi aggiungere una risposta in linea alla notifica definendo un'azione con il tipo 'text':

const title = 'Alexey Rodionov';

const options = {
  body: 'How are you doing? )',
  image: '/images/demos/avatar-512x512.jpg',
  icon: '/images/demos/icon-512x512.png',
  badge: '/images/demos/badge-128x128.png',
  actions: [
    {
      action: 'reply',
      type: 'text',
      title: 'Reply',
      icon: '/images/demos/action-5-128x128.png',
    }
  ],
};

registration.showNotification(title, options);

Ecco come apparirà su Android:

Notifica su Android con un pulsante di azione per la risposta.

Se fai clic sul pulsante di azione, si apre un campo di immissione del testo:

Notifica su Android con un campo di immissione di testo aperto.

Puoi personalizzare il segnaposto per il campo di immissione del testo:

const title = 'Alexey Rodionov';

const options = {
  body: 'How are you doing? )',
  icon: '/images/demos/avatar-512x512.jpg',
  badge: '/images/demos/badge-128x128.png',
  actions: [
    {
      action: 'reply',
      type: 'text',
      title: 'Reply',
      icon: '/images/demos/action-5-128x128.png',
      placeholder: 'Type text here',
    }
  ],
};

registration.showNotification(title, options);

Notifica su Android con segnaposto personalizzato per il campo di immissione del testo.

In Chrome su Windows, il campo di immissione del testo è sempre visibile senza dover fare clic sul pulsante di azione:

Notifica su Windows con un campo di immissione di testo e un pulsante di azione per la risposta.

Puoi aggiungere più di una risposta in linea o combinare pulsanti e risposte in linea:

const title = 'Poll';

const options = {
  body: 'Do you like this photo?',
  image: '/images/demos/cat-image.jpg',
  icon: '/images/demos/icon-512x512.png',
  badge: '/images/demos/badge-128x128.png',
  actions: [
    {
      action: 'yes',
      type: 'button',
      title: '👍 Yes',
    },
    {
      action: 'no',
      type: 'text',
      title: '👎 No (explain why)',
      placeholder: 'Type your explanation here',
    },
  ],
};

registration.showNotification(title, options);

Notifica su Windows con un campo di immissione di testo e due pulsanti di azione.

Direzione

Il parametro dir consente di definire la direzione in cui deve essere visualizzato il testo, da destra a sinistra o da sinistra a destra.

Durante i test, è emerso che la direzione era determinata in gran parte dal testo anziché da questo parametro. Secondo le specifiche, questo attributo dovrebbe suggerire al browser come disporre le opzioni, come le azioni, ma non ho notato alcuna differenza.

Probabilmente è meglio definirlo, se possibile, altrimenti il browser dovrebbe fare la cosa giusta in base al testo fornito.

Il parametro deve essere impostato su auto, ltr o rtl.

Una lingua con scrittura da destra a sinistra utilizzata su Chrome su Linux ha il seguente aspetto:

Notifica con lingua da destra a sinistra su Chrome su Linux.

In Firefox (passando il mouse sopra l'elemento) vedrai questo:

Notifica con lingua da destra a sinistra su Firefox su Linux.

Vibrazione

L'opzione vibrate consente di definire un pattern di vibrazione che verrà eseguito quando viene visualizzata una notifica, supponendo che le impostazioni correnti dell'utente consentano le vibrazioni (ovvero che il dispositivo non sia in modalità silenziosa).

Il formato dell'opzione di vibrazione deve essere un array di numeri che descrivono il numero di millisecondi per cui il dispositivo deve vibrare, seguito dal numero di millisecondi per cui il dispositivo non deve vibrare.

const title = 'Vibrate Notification';

const options = {
  // Star Wars shamelessly taken from the awesome Peter Beverloo
  // https://tests.peter.sh/notification-generator/
  vibrate: [
    500, 110, 500, 110, 450, 110, 200, 110, 170, 40, 450, 110, 200, 110, 170,
    40, 500,
  ],
};

registration.showNotification(title, options);

Questa operazione interessa solo i dispositivi che supportano la vibrazione.

Suono

Il parametro sound consente di definire un suono da riprodurre quando viene ricevuta la notifica.

Al momento della stesura di questo documento, nessun browser supporta questa opzione.

const title = 'Sound Notification';

const options = {
  sound: '/demos/notification-examples/audio/notification-sound.mp3',
};

registration.showNotification(title, options);

Timestamp

Il timestamp ti consente di comunicare alla piattaforma l'ora in cui si è verificato un evento che ha comportato l'invio della notifica push.

timestamp deve essere il numero di millisecondi trascorsi dalle ore 00:00:00 UTC del 1° gennaio 1970 (ovvero l'epoca di Unix).

const title = 'Timestamp Notification';

const options = {
  body: 'Timestamp is set to "01 Jan 2000 00:00:00".',
  timestamp: Date.parse('01 Jan 2000 00:00:00'),
};

registration.showNotification(title, options);

Best practice per la UX

Il più grande errore di UX che ho visto con le notifiche è la mancanza di specificità nelle informazioni visualizzate da una notifica.

Dovresti considerare il motivo per cui hai inviato il messaggio push in primo luogo e assicurarti che tutte le opzioni di notifica vengano utilizzate per aiutare gli utenti a capire perché stanno leggendo quella notifica.

A dire il vero, è facile vedere esempi e pensare "Non farò mai questo errore". Ma è più facile cadere in questa trappola di quanto si possa pensare.

Alcuni errori comuni da evitare:

  • Non inserire il tuo sito web nel titolo o nel corpo. I browser includono il tuo dominio nella notifica, quindi non duplicarlo.
  • Utilizza tutte le informazioni a tua disposizione. Se invii un messaggio push perché qualcuno ha inviato un messaggio a un utente, anziché utilizzare il titolo "Nuovo messaggio" e il corpo "Fai clic qui per leggerlo", utilizza il titolo "Giovanni ha appena inviato un nuovo messaggio" e imposta il corpo della notifica su una parte del messaggio.

Browser e rilevamento delle funzionalità

Al momento della stesura di questo articolo, esiste una disparità piuttosto grande tra Chrome e Firefox in termini di supporto delle funzionalità per le notifiche.

Fortunatamente, puoi rilevare il supporto delle funzionalità di notifica esaminando il prototipo window.Notification.

Supponiamo di voler sapere se una notifica supporta i pulsanti di azione. Procederemmo nel seguente modo:

if ('actions' in window.Notification?.prototype) {
  // Action buttons are supported.
} else {
  // Action buttons are NOT supported.
}

In questo modo, potremmo modificare la notifica che mostriamo ai nostri utenti.

Per le altre opzioni, segui la stessa procedura descritta sopra, sostituendo 'actions' con il nome del parametro desiderato.

Passaggi successivi

Codelab