Como mostrar uma notificação

As opções de notificação são divididas em duas seções, uma sobre os aspectos visuais e outra que explique os aspectos comportamentais das notificações (a próxima).

Você pode testar as diversas opções de notificação em vários navegadores e em diversas plataformas usando Peter Beverloo Gerador de notificações.

Opções visuais

A API para mostrar uma notificação é simples:

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

Ambos os argumentos, title e options, são opcionais.

O título é uma string, e as opções podem ser qualquer uma das seguintes:

{
  "//": "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>",
}

Vejamos as opções visuais:

Dissecção da UI de uma notificação.

Opções de título e corpo

Uma notificação fica assim sem o título e as opções no Chrome no Windows:

Notificação sem título e opções no Chrome no Windows.

Como você pode ver, o nome do navegador é usado como título e a "Nova notificação" o marcador de posição é usada como o corpo da notificação.

Se um App Web Progressivo estiver instalado no dispositivo, o nome do app da Web será usado. do nome do navegador:

Notificação com o nome do app da Web em vez do nome do navegador.

Se executarmos o seguinte código:

const title = 'Simple Title';

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

registration.showNotification(title, options);

receberíamos esta notificação no Chrome no Linux:

Notificação com título e corpo do texto no Chrome no Linux.

No Firefox no Linux, o código ficaria assim:

Notificação com título e texto no Firefox no Linux.

É assim que uma notificação com muito texto no título e no corpo é exibida no Chrome no No Linux, siga estas etapas:

Notificação com título longo e corpo do texto no Chrome no Linux.

O Firefox no Linux recolhe o corpo do texto até que você passe o cursor sobre a notificação, fazendo com que a notificação para expandir:

Notificação com título longo e corpo do texto no Firefox no Linux.

Notificação com título longo e corpo de texto no Firefox no Linux ao passar o cursor sobre a notificação.

As mesmas notificações no Firefox do Windows têm esta aparência:

Notificação com título e corpo do texto no Firefox para Windows.

Notificação com título longo e corpo do texto no Firefox para Windows.

A mesma notificação pode ter aparências diferentes em navegadores diferentes. Também pode parecer no mesmo navegador e em diferentes plataformas.

O Chrome e o Firefox usam as notificações do sistema e a central de notificações nas plataformas em que estão disponíveis.

Por exemplo, as notificações do sistema no macOS não oferecem suporte a imagens e ações (botões e respostas).

O Chrome também tem notificações personalizadas para todas as plataformas de computador. Você pode ativá-lo definindo o sinalização chrome://flags/#enable-system-notifications para o estado Disabled.

Ícone

A opção icon é basicamente uma pequena imagem que você pode mostrar ao lado do título e do corpo do texto.

No seu código, é necessário fornecer um URL para a imagem que você quer carregar:

const title = 'Icon Notification';

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

registration.showNotification(title, options);

Você recebe esta notificação no Chrome no Linux:

Notificação com ícone no Chrome no Linux.

e no Firefox para Linux:

Notificação com ícone no Firefox no Linux.

Infelizmente, não há diretrizes sólidas sobre qual tamanho de imagem usar para um ícone.

O Android parece querer uma imagem de 64 dp (que é 64 px múltiplos pela proporção de pixels do dispositivo).

Supondo que a proporção de pixels mais alta para um dispositivo seja 3, um tamanho de ícone de 192px ou mais é um aposta segura.

Selo

badge é um pequeno ícone monocromático usado para retratar um pouco mais de informações ao sobre a origem da notificação:

const title = 'Badge Notification';

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

registration.showNotification(title, options);

No momento em que este artigo foi escrito, o selo é usado apenas no Chrome no Android.

Notificação com crachá no Chrome no Android.

Em outros navegadores (ou no Chrome sem o selo), você verá um ícone do navegador.

Notificação com selo no Firefox para Android.

Assim como na opção icon, não há diretrizes reais sobre o tamanho a ser usado.

Leia as diretrizes do Android o tamanho recomendado é 24 px multiplicado pela proporção de pixels do dispositivo.

Uma imagem de 72 px ou mais precisa ser boa (supondo uma proporção máxima de 3 pixels do dispositivo).

Imagem

A opção image pode ser usada para mostrar uma imagem maior ao usuário. Isso é particularmente útil para exibir uma imagem de visualização ao usuário.

const title = 'Image Notification';

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

registration.showNotification(title, options);

No Chrome no Linux, a notificação será semelhante a esta:

Notificação com imagem no Chrome no Linux.

No Chrome para Android, o corte e a proporção são diferentes:

Notificação com imagem no Chrome para Android.

Devido às diferenças de proporção entre computadores e dispositivos móveis, é extremamente difícil sugerir diretrizes.

Como o Chrome no computador não preenche o espaço disponível e tem uma proporção de 4:3, talvez o melhor é exibir uma imagem com essa proporção e permitir que o Android corte a imagem. Dito isso, a opção image ainda pode mudar.

No Android, a única diretriz é que largura de 450 dp.

Usando essa diretriz, uma imagem de largura de 1.350 px ou mais seria uma boa aposta.

Ações (botões)

Você pode definir actions para mostrar botões com uma notificação:

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

Para cada ação, você pode definir um title, um action (que é essencialmente um ID), um icon e um type. O título e o ícone são exibidos na notificação. O ID é usado para detectar que o botão de ação foi clicado (mais sobre isso na próxima seção). O tipo pode ser omitido porque 'button' é o valor padrão.

No momento em que este artigo foi escrito, apenas o Chrome e o Opera para Android são compatíveis.

No exemplo acima, há quatro ações definidas para ilustrar que é possível definir mais ações do que será exibido. Para saber o número de ações que serão exibidas pelo navegador, verifique 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.';
}

No computador, os ícones do botão de ação mostram as cores (confira o ícone de rosca rosa):

Notificação com botões de ação no Chrome no Linux.

No Android 6 e versões anteriores, os ícones são coloridos para combinar com o esquema de cores do sistema:

Notificação com botões de ação no Google Chrome para Android.

No Android 7 e versões mais recentes, os ícones de ação não são exibidos.

Esperamos que o Chrome mude seu comportamento na área de trabalho para corresponder ao Android (ou seja, aplicar a esquema de cores apropriado para que os ícones correspondam à aparência do sistema). Enquanto isso, você pode combinar com a cor do texto do Chrome fazendo com que seus ícones tenham a cor #333333.

Vale ressaltar que os ícones têm aparência nítida no Android, mas não no computador.

O melhor tamanho que eu conseguia trabalhar no Chrome para computadores era 24 x 24 pixels. Com tristeza, isto parece estar fora do lugar no Android.

A melhor prática que podemos tirar dessas diferenças:

  • Atenha-se a um esquema de cores consistente para que pelo menos todos os ícones sejam consistentes exibidos ao usuário.
  • Eles precisam funcionar no modo monocromático, já que algumas plataformas podem exibi-los dessa forma.
  • Teste o tamanho e veja o que funciona melhor para você. 128 px × 128 px funciona bem no Android, mas era ruim no computador.
  • É normal que seus ícones de ação não sejam exibidos.

As especificações de notificação estão buscando uma maneira de definir vários tamanhos de ícones, mas parece que um tempo até que algo seja combinado.

Ações (respostas diretas)

É possível adicionar uma resposta in-line à notificação definindo uma ação com o 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);

Ela vai ficar assim no Android:

Notificação no Android com um botão de ação de resposta.

Um clique no botão de ação abre um campo de entrada de texto:

Notificação no Android com um campo de entrada de texto aberto.

É possível personalizar o marcador de posição do campo de entrada de texto:

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ção no Android com um marcador de posição personalizado para o campo de entrada de texto.

No Chrome para Windows, o campo de entrada de texto fica sempre visível sem que você precise clicar na ação botão:

Notificação no Windows com um campo de entrada de texto e um botão de ação de resposta.

É possível adicionar mais de uma resposta inline ou combinar botões e respostas inline:

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ção no Windows com um campo de entrada de texto e dois botões de ação.

Direção

O parâmetro dir permite definir em qual direção o texto é mostrado. da direita para a esquerda ou da esquerda para a direita.

Nos testes, parecia que a direção era amplamente determinada pelo texto, e não por essa . De acordo com a especificação, o objetivo é sugerir ao navegador como definir o layout das opções como ações, mas não notei diferença.

Se possível, o melhor é definir. Caso contrário, o navegador deve fazer a coisa certa de acordo com o o texto fornecido.

O parâmetro precisa ser definido como auto, ltr ou rtl.

Um idioma da direita para a esquerda usado no Chrome no Linux tem a seguinte aparência:

Notificação com idioma da direita para a esquerda no Chrome no Linux.

No Firefox (ao passar o cursor sobre ele), você verá o seguinte:

Notificação com idioma da direita para a esquerda no Firefox no Linux.

Vibrar

A opção de vibração permite definir um padrão de vibração que será executado quando uma notificação for exibido, supondo que as configurações atuais do usuário permitam vibrações (ou seja, o dispositivo não está silencioso).

O formato da opção de vibração deve ser uma matriz de números que descreva a quantidade milésimos de segundo, o dispositivo deve vibrar, seguido pelo número de milissegundos que o dispositivo deve não vibrar.

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

Isso afeta apenas dispositivos compatíveis com vibração.

Som

O parâmetro sound permite definir um som a ser reproduzido quando a notificação for recebida.

Até a data deste artigo, nenhum navegador era compatível com essa opção.

const title = 'Sound Notification';

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

registration.showNotification(title, options);

Carimbo de data/hora

O carimbo de data/hora permite informar à plataforma a hora em que ocorreu um evento que resultou no envio notificação sendo enviada.

O timestamp precisa ser o número de milissegundos desde 00:00:00 UTC, que é 1o de janeiro de 1970. (que é a época do 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);

Práticas recomendadas de UX

O maior fracasso de UX que vi nas notificações é a falta de especificidade nas informações exibido por uma notificação.

Você deve primeiro considerar por que enviou a mensagem push e verificar se todos os as opções de notificação são usadas para ajudar os usuários a entender por que estão lendo a notificação.

Para ser honesto, é fácil ver exemplos e pensar: "nunca vou cometer esse erro". Mas é mais fácil cair nessa armadilha do que você imagina.

Algumas armadilhas comuns a serem evitadas:

  • Não coloque seu site no título ou no corpo. Os navegadores incluem seu domínio no então não as duplique.
  • Use todas as informações disponíveis. Se você enviar uma mensagem push porque alguém enviou uma mensagem a um usuário, em vez de usar o título "Nova mensagem" e no corpo de "Clique aqui para ler". use o título "João acabou de enviar uma nova mensagem" e defina o corpo da notificação como parte da mensagem.

Navegadores e detecção de recursos

Atualmente, existe uma grande disparidade entre o Chrome e o Firefox em termos de suporte a recursos de notificações.

Felizmente, você pode detectar o suporte aos recursos de notificação consultando o window.Notification protótipo.

Digamos que queremos saber se uma notificação é compatível com botões de ação. Faça o seguinte:

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

Com isso, podemos alterar a notificação exibida aos usuários.

Com as outras opções, faça o mesmo acima, substituindo 'actions' pelo valor desejado como o nome do parâmetro.

A seguir

Code labs