Notifiche
Notifiche locali e promemoria
Mostra notifiche immediate o programma promemoria che scattano anche con l'app chiusa: sul dispositivo, senza server
1Cosa aggiunge#
La tua app puГІ mostrare notifiche Android dal proprio codice, a due livelli:
- Immediata (Livello 1): una notifica che appare subito, mentre l'app ГЁ aperta. Ideale per 'download completato', 'timer terminato', ecc.
- Promemoria programmati (Livello 2): una notifica che scatta in un momento futuro anche con l'app CHIUSA e sopravvive a un riavvio. ГЁ ciГІ che serve alle app di promemoria, abitudini, sveglie e farmaci.
Sono al 100% sul dispositivo e offline: nessun server, nessun account OneSignal. (Le notifiche push di OneSignal sono una funzione separata per i messaggi che invii TU da un server.)
2Attivalo nella procedura guidata di creazione#
Nel Passaggio 4 (Accesso), spunta:
- рџ”” Notifiche: consente all'app di pubblicare notifiche (aggiunge POST_NOTIFICATIONS).
- вЏ° Promemoria: aggiunge notifiche programmate che scattano anche con l'app chiusa (aggiunge la gestione degli allarmi esatti e la riprogrammazione all'avvio). Spuntando Promemoria si attivano automaticamente anche le Notifiche.
Lascia entrambe disattivate per le app che non hanno bisogno di notifiche: non viene aggiunto nulla di extra al tuo APK.
3Chiama il bridge dal tuo codice web#
AppMint espone un bridge JavaScript in window.WebToApk. Verificane sempre prima la presenza: esiste solo nell'app installata, quindi il tuo sito funziona comunque in un browser.
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() || '[]');4Lascia che l'AI lo colleghi per te#
In AI App Studio descrivi semplicemente ciò che vuoi, ad esempio 'un promemoria per bere acqua che mi avvisa ogni 2 ore' o 'un tracker dei farmaci che mi ricorda ogni giorno alle 8'. Quando la tua richiesta parla di promemoria/allarmi/notifiche, AppMint istruisce automaticamente l'AI su questo bridge così l'app generata lo usa correttamente (con un'alternativa quando non è disponibile).
5Il tuo suono al posto di quello predefinito di Android#
Inserisci un file audio nel tuo pacchetto web (mp3, wav, ogg, m4a, flac o opus) e indica il suo percorso come suono. Funziona allo stesso modo su una notifica immediata e su un promemoria che scatta giorni dopo con l'app chiusa.
Il file viene copiato al suo posto quando programmi, quindi un nome di file sbagliato restituisce subito false invece di trasformarsi nel suono predefinito alle 7 del mattino.
Una regola di Android da conoscere: il suono di un canale di notifica ГЁ fissato quando il canale viene creato, quindi AppMint crea un canale separato per ogni suono. Cambiare un suono azzera quindi le impostazioni di quel canale nella schermata notifiche di Android: inevitabile, ed ГЁ il comportamento corretto.
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.6Promemoria con suono, immagini e pulsanti#
scheduleNotificationEx() accetta tutto ciГІ che accetta notify(), piГ№ il momento in cui farla scattare. Usala al posto della vecchia scheduleNotification() a cinque argomenti quando ti serve qualcosa in piГ№ di un titolo e un testo.
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.7Aprire l'app stessa a un orario stabilito#
Aggiungi openApp: true e il promemoria diventa un avviso a schermo intero: su un telefono bloccato l'app si apre sopra la schermata di blocco, su uno sbloccato appare come banner in primo piano.
Questo ГЁ tutto ciГІ che Android consente. Un'app non puГІ avviarsi di nascosto in background (bloccato dall'Android 10), quindi ogni pagina che promette 'l'app si apre da sola alle 7' deve passare da qui. Su Android 14+ l'utente concede l'avviso app per app; controlla canOpenAppAtTime() e, se risponde denied, mandalo alla schermata delle impostazioni.
Quando l'app si apre in questo modo, la tua pagina riceve un evento appmint:reminder, così può eseguire il lavoro che non ha potuto fare mentre era chiusa.
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);
});8AffidabilitГ sui dispositivi reali#
I promemoria programmati sono affidabili quanto Android consente:
- Su Android 12+, la tempistica esatta richiede SCHEDULE_EXACT_ALARM. Se ГЁ disattivata per la tua app, il promemoria viene impostato in una finestra di 10 minuti (piГ№ tardi mentre il telefono dorme) e l'app lo spiega una volta all'utente. Chiedi a getAlarmPrecision(), che risponde 'exact' o 'inexact', e chiama requestExactAlarms() per mandare l'utente all'impostazione. Un'app di sveglia o calendario puГІ spuntare "My app is an alarm clock or calendar app" nella procedura guidata: gli allarmi esatti sono allora sempre attivi (Google Play richiede la dichiarazione Exact alarm in Play Console).
- Alcuni telefoni (Xiaomi, Samsung, Oppo, ecc.) trattengono o fermano gli allarmi in background per risparmiare batteria. L'app lo spiega una volta (con il percorso dei limiti di utilizzo in background di Samsung) e apre l'elenco dell'ottimizzazione batteria.
- I promemoria vengono riattivati automaticamente dopo un riavvio o un aggiornamento dell'app.
9Riporta gli utenti che hanno disattivato le notifiche#
Molte persone toccano 'Non consentire' sulla richiesta di notifica di Android 13, o la saltano, e Android mostra quella richiesta solo un numero limitato di volte. Dopo, solo le impostazioni di notifica dell'app possono riattivarle.
AppMint.enableNotifications() fa la cosa giusta a partire da un pulsante toccato dall'utente: la richiesta di autorizzazione finchГ© Android puГІ ancora mostrarla, altrimenti le impostazioni di notifica dell'app, e ti comunica il nuovo stato quando l'utente torna. getNotificationState() risponde 'granted', 'prompt' (si puГІ ancora chiedere), 'blocked' (solo le Impostazioni possono risolvere) o 'unavailable' (la build non ha notifiche). Mostra il tuo banner solo per 'prompt' e 'blocked', e non chiedere mai all'avvio.
Un pulsante in una notifica push o in un messaggio in-app con il link appmint://notifications/enable fa lo stesso senza alcun codice nella pagina.
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?.();