Ricevere messaggi nelle app per Android

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


Per ricevere messaggi, puoi utilizzare un servizio che estende FirebaseMessagingService. Il servizio deve eseguire l'override dei callback onMessageReceived e onDeletedMessages. Per un esempio completo, consulta l'esempio della guida rapida di Firebase Cloud Messaging sample.

onMessageReceived viene fornito per la maggior parte dei tipi di messaggi, con le seguenti eccezioni:

  • Messaggi di notifica recapitati quando l'app è in background. In questo caso, la notifica viene recapitata nella barra delle applicazioni del dispositivo. Per impostazione predefinita, un tocco dell'utente su una notifica apre Avvio applicazioni.

  • Messaggi con payload di notifica e dati, quando vengono ricevuti in background. In questo caso, la notifica viene recapitata nella barra delle applicazioni del dispositivo e il payload di dati viene recapitato negli extra dell'intent dell'attività di avvio.

In sintesi:

Stato dell'app Notifica Dati Entrambe
Primo piano onMessageReceived onMessageReceived onMessageReceived
Sfondo Barra delle applicazioni onMessageReceived Notifica: barra delle applicazioni Dati: negli extra dell'intent.

Per saperne di più sui tipi di messaggi, consulta Messaggi di notifica e dati messages.

Il callback onMessageReceived ha una breve finestra di esecuzione. Molti fattori possono influire sulla durata di questa finestra, tra cui i ritardi del sistema operativo, il tempo di avvio dell'app, il blocco del thread principale da parte di altre operazioni o le chiamate onMessageReceived precedenti che richiedono troppo tempo.

Per questo motivo, devi evitare attività a lunga esecuzione (ad esempio, il recupero di immagini da un server da visualizzare in una notifica) in onMessageReceived e pianificare invece un'attività utilizzando WorkManager per gestire le attività che potrebbero richiedere più di un paio di secondi per essere completate. Per saperne di più sulla priorità dei messaggi e su come influisce sull'elaborazione, consulta Elaborazione dei messaggi per i messaggi con priorità alta e normale messaggi.

Modificare il manifest dell'app

Per utilizzare FirebaseMessagingService, devi aggiungere quanto segue nel manifest dell'app:

<service
    android:name=".java.MyFirebaseMessagingService"
    android:exported="false">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>

Ti consigliamo di impostare i valori predefiniti per personalizzare l'aspetto delle notifiche. Puoi specificare un'icona predefinita personalizzata e un colore predefinito personalizzato da applicare quando i valori equivalenti non sono impostati nel payload della notifica.

Aggiungi queste righe all'interno del tag application per impostare l'icona predefinita personalizzata e il colore personalizzato:

<!-- Set custom default icon. This is used when no icon is set for incoming notification messages.
     See README(https://goo.gl/l4GJaQ) for more. -->
<meta-data
    android:name="com.google.firebase.messaging.default_notification_icon"
    android:resource="@drawable/ic_stat_ic_notification" />
<!-- Set color used with incoming notification messages. This is used when no color is set for the incoming
     notification message. See README(https://goo.gl/6BKBk7) for more. -->
<meta-data
    android:name="com.google.firebase.messaging.default_notification_color"
    android:resource="@color/colorAccent" />

Android visualizza e utilizza l'icona predefinita personalizzata per

  • Tutti i messaggi di notifica inviati da il compositore di notifiche nella Firebase console.

  • Qualsiasi messaggio di notifica che non imposta esplicitamente l'icona nel payload della notifica.

Se non è impostata un'icona predefinita personalizzata e non è impostata un'icona nel payload della notifica, Android visualizza l'icona dell'applicazione in bianco.

Eseguire l'override di onMessageReceived

Eseguendo l'override del metodo FirebaseMessagingService.onMessageReceived, puoi eseguire azioni in base all'oggetto RemoteMessage ricevuto e recuperare i dati del messaggio:

Kotlin

override fun onMessageReceived(remoteMessage: RemoteMessage) {
    // TODO(developer): Handle FCM messages here.
    // Not getting messages here? See why this may be: https://goo.gl/39bRNJ
    Log.d(TAG, "From: ${remoteMessage.from}")

    // Check if message contains a data payload.
    if (remoteMessage.data.isNotEmpty()) {
        Log.d(TAG, "Message data payload: ${remoteMessage.data}")

        // Check if data needs to be processed by long running job
        if (needsToBeScheduled()) {
            // For long-running tasks (10 seconds or more) use WorkManager.
            scheduleJob()
        } else {
            // Handle message within 10 seconds
            handleNow()
        }
    }

    // Check if message contains a notification payload.
    remoteMessage.notification?.let {
        Log.d(TAG, "Message Notification Body: ${it.body}")
    }

    // Also if you intend on generating your own notifications as a result of a received FCM
    // message, here is where that should be initiated. See sendNotification method below.
}

Java

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    // TODO(developer): Handle FCM messages here.
    // Not getting messages here? See why this may be: https://goo.gl/39bRNJ
    Log.d(TAG, "From: " + remoteMessage.getFrom());

    // Check if message contains a data payload.
    if (remoteMessage.getData().size() > 0) {
        Log.d(TAG, "Message data payload: " + remoteMessage.getData());

        if (/* Check if data needs to be processed by long running job */ true) {
            // For long-running tasks (10 seconds or more) use WorkManager.
            scheduleJob();
        } else {
            // Handle message within 10 seconds
            handleNow();
        }

    }

    // Check if message contains a notification payload.
    if (remoteMessage.getNotification() != null) {
        Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
    }

    // Also if you intend on generating your own notifications as a result of a received FCM
    // message, here is where that should be initiated. See sendNotification method below.
}

Eseguire l'override di onDeletedMessages

In alcune situazioni, FCM potrebbe non recapitare un messaggio. Ciò accade quando sono in attesa di recapito troppi messaggi (>100) per la tua app su un determinato dispositivo al momento della connessione o se il dispositivo non si è connesso a FCM da più di un mese. In questi casi, potresti ricevere un callback a FirebaseMessagingService.onDeletedMessages(). Quando l'istanza dell'app riceve questo callback, deve eseguire una sincronizzazione completa con il server dell'app. Se non hai inviato un messaggio all'app su quel dispositivo nelle ultime 4 settimane, FCM non chiamerà onDeletedMessages().

Gestire i messaggi di notifica in un'app in background

Quando l'app è in background, Android indirizza i messaggi di notifica alla barra delle applicazioni. Per impostazione predefinita, un tocco dell'utente sulla notifica apre Avvio applicazioni.

Sono inclusi i messaggi che contengono sia il payload di notifica sia quello di dati (e tutti i messaggi inviati dal compositore di notifiche nella console Firebase). In questi casi, la notifica viene recapitata nella barra delle applicazioni del dispositivo e il payload di dati viene recapitato negli extra dell'intent dell'attività di avvio.

Per informazioni sul recapito dei messaggi alla tua app, vai alla dashboard DevOps e coinvolgimento > Messaggistica > Report nella console Firebase. Questa dashboard registra il numero di messaggi inviati e aperti su dispositivi Apple e Android, insieme ai dati per le "impressioni" (notifiche visualizzate dagli utenti) per le app Android.