[{"data":1,"prerenderedAt":22},["ShallowReactive",2],{"articolo-notifiche-push-in-flutter-con-firebase-cloud-messaging-guida-pratica":3,"comments-article-notifiche-push-in-flutter-con-firebase-cloud-messaging-guida-pratica":21},{"id":4,"title":5,"slug":6,"excerpt":7,"body":8,"cover_image":9,"video_url":10,"status":11,"published_at":12,"meta_title":13,"meta_description":14,"category":15,"author":19},15,"Notifiche push in Flutter con Firebase Cloud Messaging: guida pratica","notifiche-push-in-flutter-con-firebase-cloud-messaging-guida-pratica","Impara a integrare le notifiche push in Flutter usando Firebase Cloud Messaging: setup, gestione dei messaggi in foreground e background, notifiche locali e best practice.","## Introduzione\n\nLe notifiche push sono uno strumento fondamentale per coinvolgere gli utenti di un'app mobile: avvisano di nuovi messaggi, promozioni o aggiornamenti anche quando l'app è chiusa. In Flutter, la soluzione più diffusa e gratuita è **Firebase Cloud Messaging (FCM)**, integrabile tramite i pacchetti `firebase_core` e `firebase_messaging`.\n\nIn questa guida vedremo come configurare FCM, ricevere notifiche nei diversi stati dell'app (foreground, background, terminata) e mostrare notifiche locali con `flutter_local_notifications`.\n\n## Configurazione iniziale\n\nAggiungi le dipendenze al tuo `pubspec.yaml`:\n\n```yaml\ndependencies:\n  firebase_core: ^3.6.0\n  firebase_messaging: ^15.1.3\n  flutter_local_notifications: ^18.0.1\n```\n\nDopo aver creato un progetto su [Firebase Console](https:\u002F\u002Fconsole.firebase.google.com), usa la **FlutterFire CLI** per generare la configurazione:\n\n```bash\ndart pub global activate flutterfire_cli\nflutterfire configure\n```\n\nQuesto comando crea il file `firebase_options.dart` e configura automaticamente Android e iOS.\n\n## Inizializzazione di Firebase\n\nInizializza Firebase nel `main()` prima di avviare l'app:\n\n```dart\nimport 'package:firebase_core\u002Ffirebase_core.dart';\nimport 'firebase_options.dart';\n\nFuture\u003Cvoid> main() async {\n  WidgetsFlutterBinding.ensureInitialized();\n  await Firebase.initializeApp(\n    options: DefaultFirebaseOptions.currentPlatform,\n  );\n  runApp(const MyApp());\n}\n```\n\n## Richiedere i permessi\n\nSu iOS (e su Android 13+) è obbligatorio richiedere il permesso all'utente per ricevere notifiche:\n\n```dart\nimport 'package:firebase_messaging\u002Ffirebase_messaging.dart';\n\nFuture\u003Cvoid> requestPermission() async {\n  final messaging = FirebaseMessaging.instance;\n  final settings = await messaging.requestPermission(\n    alert: true,\n    badge: true,\n    sound: true,\n  );\n\n  if (settings.authorizationStatus == AuthorizationStatus.authorized) {\n    print('Permesso notifiche concesso');\n  }\n}\n```\n\n## Ottenere il token FCM\n\nOgni dispositivo possiede un **token** univoco che identifica la destinazione delle notifiche. Va inviato al tuo backend per indirizzare i messaggi:\n\n```dart\nfinal token = await FirebaseMessaging.instance.getToken();\nprint('Token FCM: $token');\n\n\u002F\u002F Ascolta i rinnovi del token\nFirebaseMessaging.instance.onTokenRefresh.listen((newToken) {\n  \u002F\u002F Invia il nuovo token al backend\n});\n```\n\n## Gestire i messaggi nei tre stati\n\nFCM si comporta diversamente a seconda dello stato dell'app.\n\n### App in foreground\n\nQuando l'app è aperta, le notifiche **non vengono mostrate automaticamente**: dobbiamo gestirle noi, tipicamente mostrando una notifica locale.\n\n```dart\nFirebaseMessaging.onMessage.listen((RemoteMessage message) {\n  final notification = message.notification;\n  if (notification != null) {\n    showLocalNotification(\n      notification.title ?? '',\n      notification.body ?? '',\n    );\n  }\n});\n```\n\n### App in background o terminata (tap sulla notifica)\n\nQuando l'utente tocca una notifica con l'app in background:\n\n```dart\nFirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {\n  \u002F\u002F Naviga verso una schermata specifica\n  final route = message.data['route'];\n  if (route != null) {\n    navigatorKey.currentState?.pushNamed(route);\n  }\n});\n```\n\nSe l'app era completamente chiusa, recupera il messaggio iniziale:\n\n```dart\nfinal initialMessage = await FirebaseMessaging.instance.getInitialMessage();\nif (initialMessage != null) {\n  \u002F\u002F Gestisci la navigazione di avvio\n}\n```\n\n### Handler in background\n\nPer elaborare messaggi anche quando l'app non è in foreground, registra un handler **top-level** (fuori da qualsiasi classe):\n\n```dart\n@pragma('vm:entry-point')\nFuture\u003Cvoid> firebaseBackgroundHandler(RemoteMessage message) async {\n  await Firebase.initializeApp();\n  print('Messaggio in background: ${message.messageId}');\n}\n\nvoid main() {\n  FirebaseMessaging.onBackgroundMessage(firebaseBackgroundHandler);\n  \u002F\u002F ...\n}\n```\n\n> L'annotazione `@pragma('vm:entry-point')` è essenziale: impedisce al tree-shaking di rimuovere la funzione nelle build release.\n\n## Notifiche locali in foreground\n\nConfiguriamo `flutter_local_notifications` per mostrare le notifiche quando l'app è aperta:\n\n```dart\nimport 'package:flutter_local_notifications\u002Fflutter_local_notifications.dart';\n\nfinal localNotifications = FlutterLocalNotificationsPlugin();\n\nFuture\u003Cvoid> initLocalNotifications() async {\n  const androidSettings =\n      AndroidInitializationSettings('@mipmap\u002Fic_launcher');\n  const iosSettings = DarwinInitializationSettings();\n  const settings = InitializationSettings(\n    android: androidSettings,\n    iOS: iosSettings,\n  );\n  await localNotifications.initialize(settings);\n}\n\nFuture\u003Cvoid> showLocalNotification(String title, String body) async {\n  const androidDetails = AndroidNotificationDetails(\n    'high_importance_channel',\n    'Notifiche importanti',\n    importance: Importance.max,\n    priority: Priority.high,\n  );\n  const details = NotificationDetails(android: androidDetails);\n  await localNotifications.show(0, title, body, details);\n}\n```\n\nSu Android è inoltre consigliato creare il **canale di notifica** con la stessa `id` usata nei dettagli, altrimenti su Android 8+ le notifiche potrebbero non apparire.\n\n## Best practice\n\n- **Richiedi i permessi al momento giusto**: non al primo avvio, ma quando l'utente comprende il valore delle notifiche.\n- **Usa i `data message`** oltre ai `notification message` per veicolare informazioni di routing.\n- **Salva e aggiorna il token** sul backend, gestendo anche `onTokenRefresh`.\n- **Testa tutti gli stati**: foreground, background e app terminata si comportano diversamente.\n- **Configura i canali su Android** per dare all'utente controllo granulare.\n\n## Conclusioni\n\nIntegrare le notifiche push con Firebase Cloud Messaging in Flutter richiede pochi passaggi, ma è fondamentale gestire correttamente i diversi stati dell'app e combinare FCM con le notifiche locali per un'esperienza coerente. Con i frammenti visti in questa guida hai una base solida e pronta per la produzione.","https:\u002F\u002Fflutter.it\u002Fstorage\u002Farticles\u002Fe9819833-942c-47b2-a8cb-4396f0c9b92b.jpg",null,"published","2026-06-18T04:00:36+00:00","Notifiche push in Flutter con Firebase Cloud Messaging","Guida pratica alle notifiche push in Flutter con Firebase Cloud Messaging: setup, gestione foreground\u002Fbackground, notifiche locali e best practice.",{"id":16,"name":17,"slug":18},1,"Guide","guide",{"id":16,"name":20},"Flutter Bot",[],1781766636593]