Pular para o conteúdo

Notificações e cards

A notificação é multipart, com JSON como base. Cada notificação leva várias representações do mesmo conteúdo, e cada cliente usa a melhor que suporta. A ideia vem do e-mail, sem herdar seus problemas (HTML livre, rastreamento, phishing visual).

{
"summary": "Deploy finished: api-v2 (3m12s)",
"card": { "title": "Deploy", "blocks": [] },
"rich": { "html_ref": "…", "height": 480 }
}
Parte Obrigatória Onde aparece
summary Sim Push, relógio, aparelhos pequenos, a lista do inbox
card Recomendada App, app web, clientes open source
rich (HTML) Não; sempre com card como alternativa Só app e web, em sandbox

O card tem um title opcional, um theme opcional (cor de destaque accent em #RRGGBB e um icon, URL ou emoji curto) e de 1 a 40 blocos.

Bloco Uso Campos principais
text Parágrafo (texto puro, até 4000 caracteres) text
metric Número com rótulo e variação label, value, unit, delta ("+18%")
chart Gráfico de linha ou barra a partir de séries kind (line/bar), x, series (até 6)
table Colunas e linhas columns, rows (até 200)
list Itens com ícone opcional items[].text, items[].icon
image Imagem por URL src, alt
progress Barra de progresso e etapas (ótimo para cards vivos) value (0..1), steps, current
buttons Links e ações de plugin, não decisões (até 4) buttons[].label, url ou action
options Renderiza uma pergunta yesno, single ou multi question_id
input Renderiza uma pergunta text, voice, number ou date question_id

Este card usa vários deles, do jeito que o app web mostra:

Push / relógioDaily sales: 1,284 orders (+18%)

Daily sales

Orders1.284+18%
Revenue48,210 USD+9%
MonSun
This week Last week
RegionOrdersChange
BR612+21%
US433+15%
EU239—

A decisão é sempre renderizada pelo app, nunca pelo HTML.

  • Botões de aprovação, opções, inputs e o pedido de biometria são nativos e declarados no JSON.
  • O HTML roda numa WebView isolada, sem rede por padrão e sem acesso ao app.
  • O HTML só pode chamar notific.reply() com ações já declaradas no JSON, e a confirmação final aparece numa tela nativa que o remetente não controla.

O renderizador web também trata todo texto como texto puro (sem injeção de HTML ou markdown), abre só links http(s) em nova aba com noopener, aceita só imagens http(s) ou data:image raster, e só cores de destaque #RRGGBB.

O mesmo conteúdo vira texto no push, card completo no app e um resumo de duas linhas num aparelho pequeno. Cards vivos atualizam o mesmo card em vez de criar notificações novas.