Notificações
Notificações locais e lembretes
Mostre notificações instantâneas ou agende lembretes que disparam mesmo com o app fechado - no próprio dispositivo, sem servidor
1O que isto adiciona#
Seu app pode mostrar notificações do Android pelo próprio código - em dois níveis:
- Instantânea (Nível 1): uma notificação que aparece agora, com o app aberto. Boa para 'download concluído', 'timer finalizado' etc.
- Lembretes agendados (Nível 2): uma notificação que dispara em um horário futuro mesmo com o app FECHADO e sobrevive a uma reinicialização. É disso que apps de lembretes, hábitos, alarmes e medicação precisam.
Tudo isso é 100% no dispositivo e offline - sem servidor, sem conta no OneSignal. (O push do OneSignal é um recurso separado para mensagens que VOCÊ envia de um servidor.)
2Ative no assistente de build#
Na Etapa 4 (Acesso), marque:
- 🔔 Notificações - permite que o app publique notificações (adiciona POST_NOTIFICATIONS).
- ⏰ Lembretes - adiciona notificações agendadas que disparam com o app fechado (adiciona a estrutura de alarme exato + reagendar na inicialização). Marcar Lembretes ativa Notificações automaticamente.
Deixe as duas opções desativadas em apps que não precisam de notificações - nada extra é adicionado ao seu APK.
3Chame a ponte pelo seu código web#
O AppMint expõe uma ponte JavaScript em window.WebToApk. Sempre verifique se ela existe antes de usar - ela só existe dentro do app instalado, então seu site continua funcionando em um navegador.
const b = window.WebToApk || null;
// Ask once (Android 13+):
b?.requestNotificationPermission();
// Tier 1 — instant (app open):
b?.showNotification('Saved', 'Your note was saved', '', 'note');
// Tier 2 — scheduled reminder in 1 hour:
b?.scheduleNotification(
'water-1',
'Drink water',
'Time for a glass of water',
String(Date.now() + 60*60*1000),
'daily' // none | minutely | hourly | daily | weekly
);
b?.cancelNotification('water-1');
b?.cancelAllNotifications();
const pending = JSON.parse(b?.getScheduledNotifications() || '[]');4Deixe a IA fazer a integração por você#
No AI App Studio, basta descrever o que você quer - por exemplo, 'um lembrete de água que me avisa a cada 2 horas' ou 'um controle de medicação que me lembra às 8h todos os dias'. Quando seu pedido menciona lembretes/alarmes/notificações, o AppMint ensina automaticamente a IA sobre essa ponte para que o app gerado a use corretamente (com uma alternativa segura quando ela não estiver disponível).
5Seu próprio som em vez do padrão do Android#
Coloque um arquivo de áudio no pacote web (mp3, wav, ogg, m4a, flac ou opus) e informe o caminho dele como o som. Funciona igual em uma notificação instantânea e em um lembrete que dispara dias depois com o app fechado.
O arquivo é copiado para o lugar quando você agenda, então um nome de arquivo errado retorna false na hora, em vez de virar o som padrão às 7h.
Uma regra do Android que vale conhecer: o som de um canal de notificação é fixado quando o canal é criado, então o AppMint cria um canal separado para cada som. Trocar um som, portanto, redefine as configurações próprias desse canal na tela de notificações do Android - é inevitável, e é o comportamento honesto.
const b = window.WebToApk || null;
// Instant, with your sound:
b?.notify(JSON.stringify({
title: 'Order confirmed',
body: 'Arriving Tuesday',
sound: '/audio/chime.mp3' // a file in YOUR bundle
}));
// Check a sound before you save it in a settings screen:
const ok = b?.prepareNotificationSound('/audio/chime.mp3');
// 'silent' for no sound at all; leave it out for the Android default.6Lembretes com som, imagens e botões#
scheduleNotificationEx() aceita tudo o que notify() aceita, além de quando disparar. Use-a no lugar da antiga scheduleNotification() de cinco argumentos quando quiser algo além de um título e um texto.
const b = window.WebToApk || null;
b?.scheduleNotificationEx('dose-1', JSON.stringify({
at: Date.now() + 60*60*1000, // epoch millis
repeat: 'daily', // none|minutely|hourly|daily|weekly
title: 'Time for your dose',
body: 'Vitamin D — 1 tablet',
sound: '/audio/chime.mp3',
actions: [{ id: 'taken', label: 'Taken' }]
}));
// Returns false if the sound file does not exist — check it.7Abrir o próprio app em um horário definido#
Adicione openApp: true e o lembrete vira um alerta em tela cheia: em um celular bloqueado o app abre sobre a tela de bloqueio; em um desbloqueado aparece como um banner de alerta.
Isso é tudo o que o Android permite. Um app não pode se iniciar em segundo plano sem aviso - isso é bloqueado desde o Android 10 - então qualquer página que prometa 'o app simplesmente abre às 7h' precisa passar por aqui. No Android 14+ o usuário concede o alerta por app; verifique canOpenAppAtTime() e leve-o à tela de configurações se disser negado.
Quando o app abre dessa forma, sua página recebe um evento appmint:reminder, para poder executar o trabalho que não conseguiu fazer enquanto estava fechado.
const b = window.WebToApk || null;
if (b?.canOpenAppAtTime() === 'denied') b?.requestOpenAppPermission();
b?.scheduleNotificationEx('standup', JSON.stringify({
at: tomorrowAt9am, repeat: 'daily',
title: 'Stand-up', body: 'Daily sync starts now',
sound: '/audio/alarm.mp3',
openApp: true
}));
window.addEventListener('appmint:reminder', e => {
// e.detail = { id: 'standup', overLockScreen: true }
showReminderScreen(e.detail.id);
});8Confiabilidade em dispositivos reais#
Os lembretes agendados são tão confiáveis quanto o Android permite:
- No Android 12+, o horário exato exige SCHEDULE_EXACT_ALARM. Se estiver desativada para o seu app, o lembrete é armado em uma janela de 10 minutos (mais tarde enquanto o celular dorme), e o app explica isso ao usuário uma vez. Consulte getAlarmPrecision() - ela responde 'exact' ou 'inexact' - e chame requestExactAlarms() para levar o usuário à configuração. Um app de despertador ou de calendário pode marcar "Meu app é um despertador ou app de calendário" no assistente: os alarmes exatos ficam sempre ativos (o Google Play exige a declaração de Alarme exato no Play Console).
- Alguns celulares (Xiaomi, Samsung, Oppo etc.) seguram ou interrompem alarmes em segundo plano para economizar bateria. O app explica isso uma vez (com o caminho de Limites de uso em segundo plano da Samsung) e abre a lista de otimização de bateria.
- Os lembretes são reagendados automaticamente após uma reinicialização ou uma atualização do app.
9Traga de volta usuários que desativaram as notificações#
Muitas pessoas tocam em 'Não permitir' no aviso de notificação do Android 13, ou o ignoram, e o Android mostra esse aviso apenas um número limitado de vezes. Depois disso, só as configurações de notificação do app podem reativá-las.
AppMint.enableNotifications() faz a coisa certa a partir de um botão que o usuário tocou: o aviso de permissão enquanto o Android ainda pode mostrá-lo; caso contrário, as configurações de notificação do app - e informa o novo estado quando o usuário volta. getNotificationState() responde 'granted', 'prompt' (ainda dá para pedir), 'blocked' (só as Configurações resolvem) ou 'unavailable' (o build não tem notificações). Mostre seu banner apenas para 'prompt' e 'blocked', e nunca peça ao abrir o app.
Um botão de push ou de mensagem no app com o link appmint://notifications/enable faz o mesmo sem nenhum código na página.
const A = window.AppMint;
if (A?.enableNotifications) {
const state = await A.getNotificationState();
// 'granted' | 'prompt' | 'blocked' | 'unavailable'
banner.hidden = !(state === 'prompt' || state === 'blocked');
turnOnButton.onclick = async () => {
const r = await A.enableNotifications();
// r = { state, changed, openedSettings }
banner.hidden = r.state === 'granted';
};
}
// Just the settings screen:
A?.openNotificationSettings?.();