Per risolvere i problemi relativi agli errori di pubblicazione dei messaggi in corso, utilizza lo strumento per la risoluzione dei problemi di FCM e consulta questo post del blog per comprendere i diversi motivi per cui potresti non visualizzare il tuo messaggio. Puoi anche visitare la dashboard dello stato di FCM per verificare se sono in corso interruzioni del servizio che interessano FCM.
FCM fornisce anche tre set di strumenti per aiutarti a ottenere informazioni su una valutazione generale della strategia e del successo della messaggistica:
- Firebase Report Consegna messaggi della console
- Metriche di pubblicazione dell'SDK Android aggregate dall'API di dati Firebase Cloud Messaging
- Esportazione completa dei dati in Google BigQuery
L'esportazione dei dati di BigQuery e la scheda Report nella console Firebase richiedono Google Analytics per funzionare. Se Google Analytics non è abilitato per il tuo progetto, puoi configurarlo nella scheda Integrazioni delle impostazioni del progetto Firebase. I dati di pubblicazione aggregati non richiedono Google Analytics per funzionare.
Tieni presente che la generazione di report per molte delle statistiche in questa pagina è soggetta a ritardi fino a 24 ore a causa del raggruppamento dei dati di analisi.
Report Consegna messaggi
Nella scheda Report della console Firebase, puoi visualizzare i seguenti dati per i messaggi inviati agli SDK FCM per le piattaforme Android o Apple, inclusi quelli inviati tramite il compositore di notifiche e le API FCM:
- Invii: il messaggio di dati o di notifica è stato messo in coda per la consegna o è stato trasmesso correttamente a un servizio di terze parti come APNs per la consegna. Tieni presente che le statistiche sugli invii potrebbero essere in ritardo di un paio d'ore. Per saperne di più, consulta la sezione Durata di un messaggio.
- Ricevuto (disponibile solo su dispositivi Android): il messaggio di dati o di notifica è stato ricevuto dall'app. Questi dati sono disponibili quando sul dispositivo Android ricevente è installato l'SDK 18.0.1 o versioni successive.FCM
- Impressioni (disponibili solo per i messaggi di notifica sui dispositivi Android): la notifica di visualizzazione è stata mostrata sul dispositivo mentre l'app è in background.
- Aperture: l'utente ha aperto il messaggio di notifica. Segnalato solo per le notifiche ricevute quando l'app è in background.
Questi dati sono disponibili per tutti i messaggi con un payload di notifica e per tutti i messaggi di dati etichettati. Per saperne di più sulle etichette, vedi Aggiungere etichette di analisi ai messaggi.
Quando visualizzi i report sui messaggi, puoi impostare un intervallo di date per i dati visualizzati, con la possibilità di esportarli in formato CSV. Puoi anche filtrare in base a questi criteri:
- Piattaforma (iOS o Android)
- App
- Etichette di analisi personalizzate
Aggiungere etichette di analisi ai messaggi
L'etichettatura dei messaggi è molto utile per l'analisi personalizzata, in quanto consente di
filtrare le statistiche di pubblicazione in base alle etichette o ai gruppi di etichette. Puoi aggiungere un'etichetta a qualsiasi messaggio inviato tramite l'API HTTP v1 impostando il campo fcmOptions.analyticsLabel
nell'oggetto message o nei campi AndroidFcmOptions
o ApnsFcmOptions
specifici della piattaforma.
Le etichette di Analytics sono stringhe di testo nel formato ^[a-zA-Z0-9-_.~%]{1,50}$
.
Le etichette possono includere lettere maiuscole e minuscole,
numeri e i seguenti simboli:
-
~
%
La lunghezza massima è di 50 caratteri. Puoi specificare fino a 100 etichette uniche al giorno; i messaggi con etichette aggiunte oltre questo limite non vengono segnalati.
Nella scheda Report della Firebasemessaggistica della console, puoi cercare un elenco di tutte le etichette esistenti e applicarle singolarmente o in combinazione per filtrare le statistiche visualizzate.
Dati di pubblicazione aggregati utilizzando l'API FCM
L'API Firebase Cloud Messaging Data ti consente di recuperare informazioni che possono aiutarti a comprendere i risultati delle richieste di messaggi indirizzate alle applicazioni Android. L'API fornisce dati aggregati su tutti i dispositivi Android con raccolta dei dati abilitata in un progetto. Sono inclusi i dettagli sulla percentuale di messaggi consegnati senza ritardi, nonché il numero di messaggi ritardati o eliminati all'interno del livello di trasporto Android. La valutazione di questi dati può rivelare tendenze generali nella distribuzione dei messaggi e aiutarti a trovare modi efficaci per migliorare il rendimento delle richieste di invio. Consulta Cronologie dei dati aggregati per informazioni sulla disponibilità dell'intervallo di date nei report.
L'API fornisce tutti i dati disponibili per una determinata applicazione. Consulta la documentazione di riferimento dell'API.
Come vengono suddivisi i dati?
I dati di pubblicazione sono suddivisi per applicazione, data ed etichetta di analisi.
Una chiamata all'API restituirà
dati per ogni combinazione di data, applicazione ed etichetta di analisi. Ad esempio, un singolo oggetto JSON androidDeliveryData
avrebbe questo aspetto:
{
"appId": "1:23456789:android:a93a5mb1234efe56",
"date": {
"year": 2021,
"month": 1,
"day": 1
},
"analyticsLabel": "foo",
"data": {
"countMessagesAccepted": "314159",
"messageOutcomePercents": {
"delivered": 71,
"pending": 15
},
"deliveryPerformancePercents": {
"deliveredNoDelay": 45,
"delayedDeviceOffline": 11
}
}
Come interpretare le metriche
I dati di pubblicazione indicano la percentuale di messaggi che rientrano in ciascuna delle seguenti metriche. È possibile che un singolo messaggio soddisfi più metriche. A causa delle limitazioni nel modo in cui raccogliamo i dati e del livello di granularità con cui abbiamo aggregato le metriche, alcuni risultati dei messaggi non sono rappresentati nelle metriche, quindi le percentuali riportate di seguito non danno come somma 100%.
Conteggio dei messaggi accettati
L'unico conteggio incluso nel set di dati è quello dei messaggi accettati da FCM per la consegna ai dispositivi Android. Tutte le percentuali utilizzano questo valore come denominatore. Tieni presente che questo conteggio non include i messaggi destinati agli utenti che hanno disattivato la raccolta di informazioni sull'utilizzo e diagnostiche sui propri dispositivi.
Percentuali di esito dei messaggi
I campi inclusi nell'oggetto
MessageOutcomePercents
forniscono informazioni sugli
esiti delle richieste di messaggi. Le categorie si escludono a vicenda. Può
rispondere a domande come "I miei messaggi vengono recapitati?" e "Qual è la causa
della mancata ricezione dei messaggi?"
Ad esempio, un valore elevato per il campo droppedTooManyPendingMessages
potrebbe
indicare che le istanze dell'app ricevono volumi di
messaggi non comprimibili
superiori al limite di 100 messaggi in attesa di FCM.
Per risolvere questo problema, assicurati che l'app gestisca le chiamate a
onDeletedMessages
e valuta la possibilità di inviare messaggi comprimibili. Allo stesso modo, percentuali elevate per
droppedDeviceInactive
potrebbero indicare la necessità di aggiornare i token di registrazione sul tuo
server, rimuovendo i token obsoleti e annullando l'iscrizione agli argomenti. Consulta
Gestire i token di registrazione FCM
per le best practice in questo ambito.
Percentuali di rendimento della pubblicazione
I campi dell'oggetto DeliveryPerformancePercents
forniscono informazioni sui messaggi consegnati correttamente. Può
rispondere a domande come "I miei messaggi sono in ritardo?" e
"Perché i messaggi sono in ritardo?" Ad esempio, un valore elevato per
delayedMessageThrottled
indicherebbe chiaramente che stai superando
i limiti massimi per dispositivo
e dovresti modificare la velocità con cui invii i messaggi.
Percentuali di approfondimenti sui messaggi
Questo oggetto fornisce ulteriori informazioni su tutti gli invii di messaggi. Il campo
priorityLowered
esprime la percentuale di messaggi accettati la cui
priorità è stata ridotta da HIGH
a NORMAL
. Se questo valore è elevato, prova a inviare meno messaggi ad alta priorità o assicurati di
visualizzare sempre una notifica quando viene inviato un messaggio ad alta priorità. Per saperne di più, consulta la nostra documentazione sulla priorità dei messaggi.
In che modo questi dati differiscono da quelli esportati in BigQuery?
L'esportazione BigQuery fornisce log dei singoli messaggi relativi all'accettazione dei messaggi da parte del backend FCM e al recapito dei messaggi nell'SDK sul dispositivo (passaggi 2 e 4 dell'architettura FCM). Questi dati sono utili per verificare che i singoli messaggi siano stati accettati e consegnati. Scopri di più sull'esportazione dei dati di BigQuery nella sezione successiva.
Al contrario, l'API Firebase Cloud Messaging Data fornisce dettagli aggregati su ciò che accade specificamente nel livello di trasporto Android (o nel passaggio 3 dell'architettura FCM). Questi dati forniscono informazioni specifiche sulla distribuzione dei messaggi dai backend FCM all'SDK Android. È particolarmente utile per mostrare le tendenze relative al motivo per cui i messaggi sono stati ritardati o eliminati durante il trasporto.
In alcuni casi, è possibile che i due set di dati non corrispondano esattamente per i seguenti motivi:
- Le metriche aggregate campionano solo una parte di tutti i messaggi
- Le metriche aggregate vengono arrotondate
- Non mostriamo le metriche al di sotto di una soglia di privacy
- Una parte dei risultati dei messaggi non è presente a causa delle ottimizzazioni nel modo in cui gestiamo il grande volume di traffico.
Limitazioni dell'API
Cronologie dei dati aggregati
L'API restituirà 7 giorni di dati storici; tuttavia, i dati restituiti da questa API verranno ritardati fino a 5 giorni. Ad esempio, il 20 gennaio saranno disponibili i dati dal 9 al 15 gennaio, ma non quelli dal 16 gennaio in poi. Inoltre, i dati vengono forniti al meglio delle possibilità. In caso di interruzione dei dati, FCM si adopererà per risolvere il problema e non eseguirà il backfill dei dati dopo la risoluzione. In caso di interruzioni più gravi, i dati potrebbero non essere disponibili per una settimana o più.
Copertura dei dati
Le metriche fornite dall'API Firebase Cloud Messaging Data hanno lo scopo di fornire informazioni sulle tendenze generali della distribuzione dei messaggi. Tuttavia, non forniscono una copertura al 100% di tutti gli scenari di messaggistica. I seguenti scenari sono risultati noti non riflessi nelle metriche.
Messaggi scaduti
Se la durata (TTL) scade
dopo la fine della data del log specificata, il messaggio non verrà conteggiato come
droppedTtlExpired
in questa data.
Messaggi ai dispositivi inattivi
I messaggi inviati ai dispositivi inattivi potrebbero essere visualizzati o meno nel set di dati
a seconda del percorso dei dati. Ciò può portare a errori di conteggio nei campi
droppedDeviceInactive
e pending
.
Messaggi ai dispositivi con determinate preferenze utente
I messaggi degli utenti che hanno disattivato la raccolta di informazioni sull'utilizzo e la diagnostica sui propri dispositivi non verranno inclusi nel nostro conteggio, in linea con le loro preferenze.
Arrotondamento e valori minimi
FCM arrotonda ed esclude deliberatamente i conteggi in cui i volumi non sono sufficientemente grandi.
Esportazione dei dati di BigQuery
Puoi esportare i dati dei messaggi in BigQuery per ulteriori analisi. BigQuery ti consente di analizzare i dati utilizzando BigQuery SQL, esportarli in un altro provider cloud o utilizzarli per i tuoi modelli ML personalizzati. Un'esportazione in BigQuery include tutti i dati disponibili per i messaggi, indipendentemente dal tipo di messaggio o dal fatto che il messaggio venga inviato tramite l'API o il compositore di notifiche.
Per i messaggi inviati ai dispositivi con le seguenti versioni minime dell'SDK FCM, hai l'opzione aggiuntiva per attivare l'esportazione dei dati di recapito dei messaggi per la tua app:
- Android 20.1.0 o versioni successive.
- iOS 8.6.0 o versioni successive
- SDK web di Firebase 9.0.0 o versioni successive
Di seguito sono riportati i dettagli sull'attivazione dell'esportazione dei dati per Android e iOS.
Per iniziare, collega il tuo progetto a BigQuery:
Scegli una delle seguenti opzioni:
Apri il compositore di notifiche, poi fai clic su Accedi a BigQuery nella parte inferiore della pagina.
Nella pagina Integrazioni della console Firebase, fai clic su Collega nella scheda BigQuery.
Questa pagina mostra le opzioni di esportazione FCM per tutte le app abilitate per FCM nel progetto.
Segui le istruzioni sullo schermo per attivare BigQuery.
Per ulteriori informazioni, consulta Collegare Firebase a BigQuery.
Quando attivi l'esportazione di BigQuery per Cloud Messaging:
Firebase esporta i dati in BigQuery. Tieni presente che la propagazione iniziale dei dati per l'esportazione potrebbe richiedere fino a 48 ore per essere completata.
- Puoi pianificare manualmente i backfill dei dati fino a 30 giorni prima.
Dopo la creazione del set di dati, la località non può essere modificata, ma puoi copiare il set di dati in un'altra località o spostare (ricreare) manualmente il set di dati in un'altra località. Per saperne di più, consulta Modificare la posizione del set di dati.
Firebase configura sincronizzazioni regolari dei dati dal progetto Firebase a BigQuery. Queste operazioni di esportazione giornaliere iniziano alle 04:00 del Pacific Time e di solito terminano entro 24 ore.
Per impostazione predefinita, tutte le app del progetto sono collegate a BigQuery e qualsiasi app che aggiungi in seguito viene collegata automaticamente a BigQuery. Puoi gestire le app che inviano dati.
Per disattivare l'esportazione di BigQuery, scollega il progetto nella console Firebase.
Abilitare l'esportazione dei dati di pubblicazione dei messaggi
I dispositivi iOS con l'SDK 8.6.0 o versioni successive possono attivare l'esportazione dei dati di recapito dei messaggi della propria app.FCM FCM supporta l'esportazione dei dati sia per le notifiche di avviso sia per quelle in background. Prima di attivare queste opzioni, devi creare il FCM-collegamento BigQuery per il tuo progetto come descritto in Esportazione dei dati BigQuery.
Attivare l'esportazione dei dati di consegna per le notifiche di avviso
Poiché solo le notifiche di avviso possono attivare le estensioni dell'app di servizio di notifica, devi aggiungere un'estensione di servizio di notifica alla tua app e chiamare questa API all'interno di un'estensione di servizio per attivare il monitoraggio dei messaggi visualizzati. Consulta la documentazione di Apple sulla modifica dei contenuti nelle notifiche appena inviate.
La seguente chiamata deve essere effettuata per ogni notifica ricevuta:
Swift
// For alert notifications, call the API inside the service extension:
class NotificationService: UNNotificationServiceExtension {
override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
Messaging.extensionHelper()
.exportDeliveryMetricsToBigQuery(withMessageInfo:request.content.userInfo)
}
}
Objective-C
// For alert notifications, call the API inside the service extension:
@implementation NotificationService
- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request
withContentHandler:(void (^)(UNNotificationContent *_Nonnull))contentHandler {
[[FIRMessaging extensionHelper] exportDeliveryMetricsToBigQueryWithMessageInfo:request.content.userInfo];
}
@end
Se crei richieste di invio utilizzando l'API HTTP v1, assicurati di specificare mutable-content = 1
nell'oggetto payload.
Abilitare l'esportazione dei dati di pubblicazione per le notifiche in background
Per i messaggi in background ricevuti quando l'app è in primo piano o in background, puoi chiamare l'API Export all'interno del gestore dei messaggi di dati dell'app principale. Questa chiamata deve essere effettuata per ogni notifica ricevuta:
Swift
// For background notifications, call the API inside the UIApplicationDelegate or NSApplicationDelegate method:
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any]) {
Messaging.extensionHelper().exportDeliveryMetricsToBigQuery(withMessageInfo:userInfo)
}
Objective-C
// For background notifications, call the API inside the UIApplicationDelegate or NSApplicationDelegate method:
@implementation AppDelegate
- (void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo
fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
[[FIRMessaging extensionHelper] exportDeliveryMetricsToBigQueryWithMessageInfo:userInfo];
}
@end
Quali dati vengono esportati in BigQuery?
Tieni presente che il targeting di token obsoleti o registrazioni inattive potrebbe gonfiare alcune di queste statistiche.
Lo schema della tabella esportata è:
_PARTITIONTIME | TIMESTAMP | Questa pseudo-colonna contiene un timestamp per l'inizio della giornata (in UTC) in cui sono stati caricati i dati. Per la partizione YYYYMMDD, questa pseudocolonna contiene il valore TIMESTAMP('AAAA-MM-GG'). |
event_timestamp | TIMESTAMP | Timestamp dell'evento registrato dal server |
project_number | NUMERO INTERO | Il numero del progetto identifica il progetto che ha inviato il messaggio |
message_id | STRING | L'ID messaggio identifica un messaggio. Generato dall'ID app e dal timestamp, l'ID messaggio potrebbe, in alcuni casi, non essere univoco a livello globale. |
instance_id | STRING | L'ID univoco dell'app a cui viene inviato il messaggio (se disponibile). Può essere un ID istanza o un ID installazione di Firebase. |
message_type | STRING | Il tipo di messaggio. Può essere un messaggio di notifica o un messaggio di dati. L'argomento viene utilizzato per identificare il messaggio originale per l'invio di un argomento o di una campagna; i messaggi successivi sono una notifica o un messaggio di dati. |
sdk_platform | STRING | La piattaforma dell'app destinataria |
nome_app | STRING | Il nome del pacchetto per le app per Android o l'ID gruppo per le app per iOS. |
collapse_key | STRING | La chiave di compressione identifica un gruppo di messaggi che possono essere compressi. Quando un dispositivo non è connesso, solo l'ultimo messaggio con una determinata chiave di compressione viene messo in coda per la consegna finale |
priorità | NUMERO INTERO | La priorità del messaggio. I valori validi sono "normal" e "high". Su iOS, corrispondono alle priorità APN 5 e 10 |
ttl | NUMERO INTERO | Questo parametro specifica per quanto tempo (in secondi) il messaggio deve essere conservato nello spazio di archiviazione FCM se il dispositivo è offline |
argomento | STRING | Il nome dell'argomento a cui è stato inviato un messaggio (se applicabile) |
bulk_id | NUMERO INTERO | L'ID bulk identifica un gruppo di messaggi correlati, ad esempio un invio specifico a un argomento. |
evento | STRING | Il tipo di evento.
I valori possibili sono:
|
analytics_label | STRING | Con l'API HTTP v1, l'etichetta di analisi può essere impostata durante l'invio del messaggio, per contrassegnarlo ai fini dell'analisi |
Che cosa puoi fare con i dati esportati?
Le sezioni seguenti offrono esempi di query che puoi eseguire in BigQuery sui dati FCM esportati.
Conteggio dei messaggi inviati per app
SELECT app_name, COUNT(1)
FROM `project ID.firebase_messaging.data`
WHERE
_PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
AND event = 'MESSAGE_ACCEPTED'
AND message_id != ''
GROUP BY 1;
Conteggia le istanze uniche dell'app a cui sono destinati i messaggi
SELECT COUNT(DISTINCT instance_id)
FROM `project ID.firebase_messaging.data`
WHERE
_PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
AND event = 'MESSAGE_ACCEPTED';
Conteggio dei messaggi di notifica inviati
SELECT COUNT(1)
FROM `project ID.firebase_messaging.data`
WHERE
_PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
AND event = 'MESSAGE_ACCEPTED'
AND message_type = 'DISPLAY_NOTIFICATION';
Conteggio dei messaggi di dati inviati
SELECT COUNT(1)
FROM `project ID.firebase_messaging.data`
WHERE
_PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
AND event = 'MESSAGE_ACCEPTED'
AND message_type = 'DATA_MESSAGE';
Conteggiare i messaggi inviati a un argomento o a una campagna
SELECT COUNT(1)
FROM `project ID.firebase_messaging.data`
WHERE
_PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
AND event = 'MESSAGE_ACCEPTED'
AND bulk_id = your bulk id AND message_id != '';
Per monitorare gli eventi per un messaggio inviato a un argomento specifico, modifica questa query sostituendo AND message_id != ''
con AND message_id = <your message id>;
.
Calcolare la durata della fanout per un determinato argomento o campagna
L'ora di inizio della distribuzione è l'ora in cui viene ricevuta la richiesta originale, mentre l'ora di fine è l'ora in cui viene creato l'ultimo messaggio individuale destinato a una singola istanza.
SELECT TIMESTAMP_DIFF( end_timestamp, start_timestamp, MILLISECOND ) AS fanout_duration_ms, end_timestamp, start_timestamp FROM ( SELECT MAX(event_timestamp) AS end_timestamp FROM `project ID.firebase_messaging.data` WHERE _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD') AND event = 'MESSAGE_ACCEPTED' AND bulk_id = your bulk id ) sent CROSS JOIN ( SELECT event_timestamp AS start_timestamp FROM `project ID.firebase_messaging.data` WHERE _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD') AND event = 'MESSAGE_ACCEPTED' AND bulk_id = your bulk id AND message_type = 'TOPIC' ) initial_message;
Percentuale di conteggio dei messaggi consegnati
SELECT messages_sent, messages_delivered, messages_delivered / messages_sent * 100 AS percent_delivered FROM ( SELECT COUNT(DISTINCT CONCAT(message_id, instance_id)) AS messages_sent FROM `project ID.firebase_messaging.data` WHERE _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD') AND event = 'MESSAGE_ACCEPTED' ) sent CROSS JOIN ( SELECT COUNT(DISTINCT CONCAT(message_id, instance_id)) AS messages_delivered FROM `project ID.firebase_messaging.data` WHERE _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD') AND (event = 'MESSAGE_DELIVERED' AND message_id IN ( SELECT message_id FROM `project ID.firebase_messaging.data` WHERE _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD') AND event = 'MESSAGE_ACCEPTED' GROUP BY 1 ) ) delivered;
Monitora tutti gli eventi per un determinato ID messaggio e ID istanza
SELECT *
FROM `project ID.firebase_messaging.data`
WHERE
_PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
AND message_id = 'your message id'
AND instance_id = 'your instance id'
ORDER BY event_timestamp;
Calcola la latenza per un determinato ID messaggio e ID istanza
SELECT TIMESTAMP_DIFF( MAX(delivered_time), MIN(accepted_time), MILLISECOND ) AS latency_ms FROM ( SELECT event_timestamp AS accepted_time FROM `project ID.firebase_messaging.data` WHERE _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD') AND message_id = 'your message id' AND instance_id = 'your instance id' AND event = 'MESSAGE_ACCEPTED' ) sent CROSS JOIN ( SELECT event_timestamp AS delivered_time FROM `project ID.firebase_messaging.data` WHERE _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD') AND message_id = 'your message id' AND instance_id = 'your instance id' AND (event = 'MESSAGE_DELIVERED' ) delivered;