Inizia a utilizzare Firebase Cloud Messaging nelle app Flutter

Seleziona la piattaforma: iOS+ Android Web Flutter Unity C++


Questa guida descrive come iniziare a utilizzare Firebase Cloud Messaging nelle app client Flutter in modo da poter inviare messaggi in modo affidabile.

A seconda della piattaforma di destinazione, dovrai eseguire alcuni passaggi di configurazione aggiuntivi obbligatori.

iOS+

Swizzling del metodo

Per utilizzare il plug-in FCM Flutter sui dispositivi Apple, è necessario lo swizzling del metodo. In caso contrario, le funzionalità chiave di Firebase, come la gestione dei token FCM non funzioneranno correttamente.

Android

Google Play Services

FCM client richiedono dispositivi con Android 4.4 o versioni successive su cui è installato Google Play Services oppure un emulatore con Android 4.4 con le API di Google. Tieni presente che non sei limitato al deployment delle app Android tramite Google Play Store.

Le app che si basano sull'SDK Play Services devono sempre verificare se sul dispositivo è presente un APK di Google Play Services compatibile prima di accedere alle funzionalità di Google Play Services. Ti consigliamo di eseguire questa operazione in due punti: nel metodo onCreate() dell'attività principale e nel metodo onResume(). Il controllo in onCreate() garantisce che l'app non possa essere utilizzata senza un controllo riuscito. Il controllo in onResume() garantisce che, se l'utente torna all'app in esecuzione tramite altri mezzi, ad esempio il pulsante Indietro, il controllo venga comunque eseguito.

Se il dispositivo non ha una versione compatibile di Google Play Services, la tua app può chiamare GoogleApiAvailability.makeGooglePlayServicesAvailable() per consentire agli utenti di scaricare Google Play Services dal Play Store.

Web

Configurare le credenziali web con FCM

L'interfaccia Web FCM utilizza credenziali Web chiamate identificazione volontaria del server applicazioni o chiavi "VAPID" per autorizzare le richieste di invio ai servizi web push supportati. Per abbonare l'app alle notifiche push, devi associare una coppia di chiavi al tuo progetto Firebase. Puoi generare una nuova coppia di chiavi o importare quella esistente tramite la Firebase console.

Installare il plug-in FCM

  1. Installa e inizializza i plug-in Firebase per Flutter se non l'hai già fatto.

  2. Dalla radice del progetto Flutter, esegui il seguente comando per installare il plug-in:

    flutter pub add firebase_messaging
    
  3. Al termine, ricompila l'applicazione Flutter:

    flutter run
    

Accedere al token di registrazione

Per inviare un messaggio a un dispositivo specifico, devi conoscere il token di registrazione del dispositivo. Per recuperare il token di registrazione per un'istanza dell'app, chiama getToken(). Se l'autorizzazione alle notifiche non è stata concessa, questo metodo chiederà all'utente le autorizzazioni alle notifiche. In caso contrario, restituisce un token o rifiuta il futuro a causa di un errore.

.
// You may set the permission requests to "provisional" which allows the user to choose what type
// of notifications they would like to receive once the user receives a notification.
final notificationSettings = await FirebaseMessaging.instance.requestPermission(provisional: true);

// For apple platforms, make sure the APNS token is available before making any FCM plugin API calls
final apnsToken = await FirebaseMessaging.instance.getAPNSToken();
if (apnsToken != null) {
 // APNS token is available, make FCM plugin API requests...
}

Sulle piattaforme web, passa la chiave pubblica VAPID a getToken():

final fcmToken = await FirebaseMessaging.instance.getToken(vapidKey: "BKagOny0KF_2pCJQ3m....moL0ewzQ8rZu");

Per ricevere una notifica ogni volta che il token viene aggiornato, abbonati allo stream onTokenRefresh:

FirebaseMessaging.instance.onTokenRefresh
    .listen((fcmToken) {
      // TODO: If necessary send token to application server.

      // Note: This callback is fired at each app startup and whenever a new
      // token is generated.
    })
    .onError((err) {
      // Error getting token.
    });

Impedire l'inizializzazione automatica

Quando viene generato un token di registrazione FCM, la libreria carica l'identificatore e i dati di configurazione in Firebase. Se preferisci impedire la generazione automatica dei token, disabilita l'inizializzazione automatica al tempo di compilazione.

iOS

Su iOS, aggiungi un valore di metadati a Info.plist:

FirebaseMessagingAutoInitEnabled = NO

Android

Su Android, disabilita la raccolta di Analytics e l'inizializzazione automatica di FCM (devi disabilitare entrambe) aggiungendo questi valori di metadati a AndroidManifest.xml:

<meta-data
    android:name="firebase_messaging_auto_init_enabled"
    android:value="false" />
<meta-data
    android:name="firebase_analytics_collection_enabled"
    android:value="false" />

Riabilitare l'inizializzazione automatica di FCM in fase di runtime

Per abilitare l'inizializzazione automatica per un'istanza dell'app specifica, chiama setAutoInitEnabled():

await FirebaseMessaging.instance.setAutoInitEnabled(true);

Una volta impostato, questo valore viene mantenuto anche dopo il riavvio dell'app.

Inviare un messaggio di notifica di prova

  1. Installa ed esegui l'app sul dispositivo di destinazione. Sui dispositivi Apple, dovrai accettare la richiesta di autorizzazione a ricevere notifiche remote.
  2. Assicurati che l'app sia in background sul dispositivo.
  3. Nella console Firebase, apri la pagina Messaggi.
  4. Se è il tuo primo messaggio, seleziona Crea la tua prima campagna.
    1. Seleziona Messaggi di notifica Firebase e poi Crea.
  5. In caso contrario, nella scheda Campagne, seleziona Nuova campagna e poi Notifiche.
  6. Inserisci il testo del messaggio.
  7. Seleziona Invia messaggio di prova nel riquadro a destra.
  8. Nel campo Aggiungi un token di registrazione, inserisci il tuo token di registrazione.FCM
  9. Seleziona Test.

Dopo aver selezionato Test, il dispositivo client di destinazione, con l'app in background, dovrebbe ricevere la notifica.

Per informazioni sulla distribuzione dei messaggi alla tua app, consulta la dashboard dei report FCM, che registra il numero di messaggi inviati e aperti su dispositivi Apple e Android, insieme ai dati sulle impressioni per le app Android.

Gestire l'interazione

Quando gli utenti toccano una notifica, il comportamento predefinito sia su Android sia su iOS è l'apertura dell'applicazione. Se l'applicazione viene terminata, verrà avviata e, se è in background, verrà portata in primo piano.

A seconda dei contenuti di una notifica, potresti voler gestire l'interazione dell'utente quando l'applicazione si apre. Ad esempio, se viene inviato un nuovo messaggio di chat utilizzando una notifica e l'utente lo seleziona, potresti voler aprire la conversazione specifica quando l'applicazione si apre.

Il pacchetto firebase-messaging offre due modi per gestire questa interazione:

  1. getInitialMessage(): Se l'applicazione viene aperta da uno stato di terminazione, questo metodo restituisce un Future contenente un RemoteMessage. Una volta utilizzato, il RemoteMessage verrà rimosso.
  2. onMessageOpenedApp: unStream che pubblica un RemoteMessage quando l' applicazione viene aperta da uno stato in background.

Per assicurarti che gli utenti abbiano un'esperienza fluida, devi gestire entrambi gli scenari. Il seguente esempio di codice illustra come è possibile ottenere questo risultato:

class Application extends StatefulWidget {
  @override
  State createState() => _Application();
}

class _Application extends State {
  // In this example, suppose that all messages contain a data field with the key 'type'.
  Future setupInteractedMessage() async {
    // Get any messages which caused the application to open from
    // a terminated state.
    RemoteMessage? initialMessage =
        await FirebaseMessaging.instance.getInitialMessage();

    // If the message also contains a data property with a "type" of "chat",
    // navigate to a chat screen
    if (initialMessage != null) {
      _handleMessage(initialMessage);
    }

    // Also handle any interaction when the app is in the background using a
    // Stream listener
    FirebaseMessaging.onMessageOpenedApp.listen(_handleMessage);
  }

  void _handleMessage(RemoteMessage message) {
    if (message.data['type'] == 'chat') {
      Navigator.pushNamed(context, '/chat',
        arguments: ChatArguments(message),
      );
    }
  }

  @override
  void initState() {
    super.initState();

    // Run code required to handle interacted messages in an async function
    // as initState() must not be async
    setupInteractedMessage();
  }

  @override
  Widget build(BuildContext context) {
    return Text("...");
  }
}

La modalità di gestione dell'interazione dipende dalla configurazione. L'esempio mostrato in precedenza è un esempio di base di utilizzo di un StatefulWidget.

Passaggi successivi

Dopo aver completato i passaggi di configurazione, ecco alcune opzioni per procedere con FCM per Flutter: