| 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.