Una notifica locale è un messaggio che l’app invia all’utente senza il coinvolgimento di un server remoto. Tutti i dati vengono elaborati e visualizzati direttamente sul dispositivo del destinatario. Questo meccanismo è adatto per promemoria, timer e sveglie quando l’app è in background o chiusa. Secondo la Documentazione per sviluppatori Apple, UNUserNotificationCenter fornisce una gestione centralizzata delle notifiche locali su iOS.
Punti chiave
Una notifica locale è un messaggio di attivazione generato e visualizzato dal sistema operativo sullo stesso dispositivo in cui è installata l’app. A differenza delle notifiche push, quelle locali non passano attraverso un server esterno — tutta la logica di pianificazione viene eseguita sul client.
Queste notifiche funzionano indipendentemente dallo stato dell’app: attiva, ridotta a icona o completamente chiusa. Il sistema operativo gestisce la consegna all’ora pianificata, mentre lo sviluppatore specifica solo il contenuto e il trigger.
Il sistema garantisce la consegna della notifica locale anche senza connessione di rete. Questo è un vantaggio fondamentale rispetto alle notifiche push, che richiedono una connessione Internet stabile e un server funzionante.
Ogni notifica locale è composta da tre parti: contenuto (titolo, corpo, suono), trigger (condizione temporale o geografica) e identificatore della richiesta. L’identificatore consente di annullare o aggiornare la notifica prima della consegna.
Uno sviluppatore può pianificare fino a 64 notifiche locali per app su iOS e un numero illimitato su Android. Questa differenza è dovuta a vincoli architetturali dei sistemi operativi.
Entrambe le piattaforme forniscono le proprie API per lavorare con le notifiche locali. Su iOS, il componente centrale è UNUserNotificationCenter, su Android — NotificationManager. Nonostante le diverse interfacce, la logica è la stessa: l’app crea una richiesta, la registra nel sistema e il OS consegna la notifica all’ora pianificata.
iOS utilizza UNCalendarNotificationTrigger per eventi calendario, UNTimeIntervalNotificationTrigger per intervalli e UNLocationNotificationTrigger per la geolocalizzazione. Android offre AlarmManager, WorkManager e pianificazione precisa tramite setExact.
Da Android 12 — SCHEDULE_EXACT_ALARM richiede un’autorizzazione speciale dall’utente. Su iOS, l’autorizzazione viene richiesta una volta tramite UNUserNotificationCenter.requestAuthorization e l’utente sceglie il livello di accesso: banner, suoni, badge.
Le notifiche locali sono classificate per tipo di trigger, non per contenuto. Ogni tipo determina quando e in quali condizioni la notifica verrà mostrata all’utente.
Su iOS e Android, i tipi di trigger sono implementati diversamente, sebbene la classificazione logica sia la stessa. iOS utilizza UNCalendarNotificationTrigger per le date, UNTimeIntervalNotificationTrigger per gli intervalli e UNLocationNotificationTrigger per la geolocalizzazione. Android offre AlarmManager con setExact e setRepeating, oltre a WorkManager per attività differite.
| Tipo di trigger | Descrizione | Esempio |
|---|---|---|
| Intervallo di tempo | Notifica N secondi dopo l’avvio | Timer di countdown |
| Data calendario | Notifica a una data e ora specifiche | Promemoria riunione |
| Geolocalizzazione | Notifica all’ingresso/uscita da una regione | Promemoria al negozio |
| Immediato | Consegna immediata alla chiamata API | Notifica di download |
iOS supporta anche UNNotificationAttachment — allegare un’immagine, audio o video al corpo della notifica. Android supporta modelli personalizzati con pulsanti e immagini grandi tramite NotificationCompat.Style.
La scelta del trigger dipende dallo scenario: i promemoria del calendario funzionano meglio con trigger del calendario, i promemoria geografici con la geolocalizzazione. I trigger a intervallo sono adatti per eventi ricorrenti con periodo fisso.
Su iOS, le notifiche locali vengono consegnate dal sistema anche quando l’app è chiusa — UNUserNotificationCenter gestisce la coda in modo indipendente. Su Android, la consegna dipende dal meccanismo scelto: AlarmManager si attiva anche con lo schermo spento, mentre WorkManager tiene conto del risparmio energetico.
Le notifiche locali risolvono attività in cui l’infrastruttura esterna è eccessiva o non disponibile. Scenari principali: promemoria, timer, suggerimenti di onboarding e azioni differite.
Le ricerche di Localytics mostrano che le app che utilizzano promemoria locali trattengono il 35% in più di utenti nella prima settimana dopo l’installazione. Questo rende le notifiche locali un potente strumento di onboarding.
È importante non abusare della frequenza — il sistema raggruppa le notifiche della stessa app e l’utente può disattivare tutte le notifiche locali se diventano fastidiose. La frequenza ottimale è non più di 2–3 notifiche al giorno per eventi non critici.
Per pianificare una notifica locale su Android, utilizza NotificationManager insieme ad AlarmManager. Su Android 8+, devi prima creare un canale di notifica, altrimenti la notifica non verrà visualizzata.
val channelId = "reminder_channel"
val notificationId = "task_reminder_42"
val channel = NotificationChannel(
channelId,
"Promemoria",
NotificationManager.IMPORTANCE_HIGH
).apply {
description = "Canale per promemoria di attività"
}
val manager = getSystemService(NotificationManager::class.java)
manager.createNotificationChannel(channel)
val intent = Intent(this, ReminderReceiver::class.java).apply {
putExtra("notification_id", notificationId)
putExtra("channel_id", channelId)
}
val pendingIntent = PendingIntent.getBroadcast(
this, notificationId.hashCode(),
intent, PendingIntent.FLAG_UPDATE_CURRENT
)
val alarmManager = getSystemService(AlarmManager::class.java)
alarmManager.setExact(
AlarmManager.RTC_WAKEUP,
triggerTimeMillis,
pendingIntent
)
Su Android 12+, verifica l’autorizzazione SCHEDULE_EXACT_ALARM prima di chiamare setExact. Se l’autorizzazione non è concessa — utilizza setWindow, che garantisce la consegna entro una finestra temporale.
Quando AlarmManager si attiva, il sistema invia un Intent broadcast che viene ricevuto da BroadcastReceiver. Al suo interno, devi creare e mostrare la notifica tramite NotificationManager. Assicurati che PendingIntent utilizzi FLAG_UPDATE_CURRENT, altrimenti le notifiche vecchie continueranno a utilizzare un Intent obsoleto quando i dati cambiano.
Su iOS, le notifiche locali vengono create tramite UNUserNotificationCenter utilizzando UNMutableNotificationContent e uno dei trigger. Prima di pianificare, devi richiedere l’autorizzazione all’utente.
import UserNotifications
let center = UNUserNotificationCenter.current()
center.requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
guard granted else { return }
}
let content = UNMutableNotificationContent()
content.title = "Promemoria attività"
content.body = "Non dimenticare di completare il rapporto entro le 18:00"
content.sound = .default
content.userInfo = ["task_id": "42"]
let trigger = UNTimeIntervalNotificationTrigger(
timeInterval: 3600,
repeats: false
)
let request = UNNotificationRequest(
identifier: "task_reminder_42",
content: content,
trigger: trigger
)
center.add(request)
iOS supporta fino a 64 richieste simultanee di notifiche locali. Se il limite viene superato, il sistema rifiuta le nuove richieste fino a quando quelle attive non vengono consegnate o annullate. Utilizza getPendingNotificationRequests per verificare la coda corrente.
Quando un utente interagisce con una notifica locale su iOS, viene chiamato il metodo userNotificationCenter:didReceive response del delegato UNUserNotificationCenterDelegate. Questo metodo fornisce l’identificatore della richiesta, actionIdentifier (quale pulsante è stato premuto) e userInfo personalizzato. Ciò consente di distinguere tra una semplice apertura della notifica e la pressione di un pulsante di azione specifico.
Per rendere le notifiche locali utili invece che fastidiose, segui diverse regole chiave. Primo: controlla la frequenza — non più di 2–3 notifiche al giorno per eventi non critici, altrimenti l’utente disattiverà tutte le notifiche dell’app.
Secondo: dai all’utente la possibilità di scegliere. Aggiungi nell’interfaccia la possibilità di disattivare determinati tipi di notifiche locali. Su Android, utilizza un NotificationChannel separato con importanza bassa; su iOS, una categoria separata nelle impostazioni dell’app.
Terzo: rilevanza contestuale — la notifica dovrebbe apparire quando l’utente ne ha bisogno. I trigger geografici sono ideali per promemoria vicino a casa, i trigger del calendario per riunioni, i trigger a intervallo per attività regolari come bere acqua o fare stretching. Non mescolare i tipi inutilmente.
Quarto: testa su dispositivi reali. Il simulatore iOS non emula tutti gli scenari di consegna delle notifiche locali, specialmente in background. Su Android, utilizza adb shell dumpsys notification per verificare la coda delle notifiche pianificate e i loro parametri. Quinto: fornisci sempre all’utente la possibilità di disattivare le notifiche tramite l’interfaccia dell’app — questo è un requisito obbligatorio di UX e delle linee guida di revisione dell’App Store.
Domande frequenti
Una notifica locale viene pianificata e consegnata dal dispositivo senza coinvolgimento del server. Una notifica push richiede un servizio esterno (FCM, APNS) e una connessione Internet. Le notifiche locali funzionano offline, le push solo con accesso alla rete.
iOS limita a 64 richieste pianificate contemporaneamente. Android non ha un limite rigoroso, ma oltre 500 notifiche potrebbero ridurre le prestazioni del sistema e influenzare i tempi di consegna.
Sì, su iOS utilizza removePendingNotificationRequests con l’identificatore della richiesta. Su Android, chiama NotificationManager.cancel o annulla il PendingIntent tramite AlarmManager. Un identificatore univoco è obbligatorio per l’annullamento.
Su iOS, l’autorizzazione è obbligatoria tramite requestAuthorization. Su Android 13+ (Tiramisu), è richiesta anche l’autorizzazione POST_NOTIFICATIONS. Le versioni precedenti di Android non richiedono autorizzazione esplicita per le notifiche locali.
Su iOS, crea una UNNotificationAction e aggiungila a UNNotificationCategory. Su Android, utilizza NotificationCompat.Builder.addAction con un PendingIntent che punta a BroadcastReceiver. Ogni pulsante attiva un’azione separata nell’app.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche