Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

了解消息傳遞

FCM 提供了三組工具來幫助您深入了解消息傳遞:

  • Firebase 控制台消息傳遞報告和通知漏斗分析
  • 來自 Firebase Cloud Messaging Data API 的匯總 Android SDK 交付指標
  • 全面的數據導出到 Google BigQuery

本頁中描述的報告工具​​都需要 Google Analytics 才能運行。如果谷歌Analytics(分析)沒有為您的項目啟用後,您可以在設置它整合你的火力地堡的項目設置選項卡。

請記住,由於分析數據的批處理,此頁面上的許多統計數據的報告可能會延遲最多 24 小時。

消息傳遞報告

報告中火力地堡控制台選項卡,您可以查看發送到Android或iOS SDK的FCM的消息,包括通過通知作曲家和FCM API的那些發送以下數據:

  • 發送 - 數據消息或通知消息已排隊等待發送或已成功傳遞給第三方服務(如 APNs)進行發送。見消息的一生以獲取更多信息。
  • 已收到(僅適用於 Android 設備)— 應用程序已收到數據消息或通知消息。當接收 Android 設備安裝了 FCM SDK 18.0.1 或更高版本時,此數據可用。
  • 展示次數(僅適用於 Android 設備上的通知消息)— 當應用程序處於後台時,顯示通知已顯示在設備上。
  • 打開 - 用戶打開了通知消息。僅報告應用程序在後台時收到的通知。

這個數據可用於與通知有效載荷和所有標記的所有消息的數據消息。要了解更多關於標籤,請參閱添加分析標籤的消息

查看消息報告時,您可以為顯示的數據設置日期範圍,並可選擇導出為 CSV。您還可以按以下條件過濾:

  • 平台(iOS 或 Android)
  • 應用程序
  • 自定義分析標籤

向消息添加分析標籤

標記消息對於自定義分析非常有用,允許您按標籤或標籤集過濾傳遞統計信息。您可以添加標籤通過設置通過HTTP 1.0版API發送的任何消息fcmOptions.analyticsLabel在現場消息對象,或在特定平台的AndroidFcmOptionsApnsFcmOptions領域。

分析標籤的格式為文本字符串^[a-zA-Z0-9-_.~%]{1,50}$ 。標籤可以包括大小寫字母、數字和以下符號:

  • -
  • ~
  • %

最大長度為 50 個字符。您每天最多可以指定 100 個唯一標籤;不報告添加了超出該限制的標籤的消息。

在火力地堡控制台短信報告選項卡,你可以搜索所有現有標籤的列表,並單獨或組合過濾統計顯示應用它們。

通知漏斗分析

內置的通知漏斗分析顯示您的用戶如何響應從 Firebase 控制台發送的特定通知。此視圖包含以下類別的目標 iOS 和 Android 設備的數據:

  • 已發送通知 — 消息已排隊等待發送或已成功傳遞給第三方服務(如 APNs)進行發送。請注意,針對過時的令牌或不活動的註冊可能會誇大這些統計數據。
  • 已打開的通知 — 打開的通知數。僅針對應用在後台時收到的通知報告。
  • 觸發轉化事件的唯一用戶數(如果已定義)。

要查看通知漏斗分析:

  1. 在通知作曲家,選擇通知選項卡。
  2. 單擊消息列表中已完成或進行中的消息。顯示包含漏斗分析的擴展視圖。

Analytics 報告會定期更新,但在用戶打開通知和事件數據在控制台中可用之間可能會有一些延遲。除了在這些報告的通知選項卡,你也可以創建自定義渠道的數據分析,可視化的在你的應用程序的一系列步驟的完成率。

通過 FCM 數據 API 聚合交付數據

Firebase Cloud Messaging Data API 可讓您檢索可幫助您了解針對 Android 應用程序的消息請求結果的信息。 API 提供跨項目中所有啟用數據收集的 Android 設備的聚合數據。這包括無延遲交付的郵件百分比細節,以及有多少消息被延遲或丟棄內Android的傳輸層。評估這些數據可以揭示消息傳遞的廣泛趨勢,並幫助您找到提高發送請求性能的有效方法。

API 提供可用於給定應用程序的所有數據。請參閱API參考文檔

數據是如何分解的?

交付數據由應用程序,日期和分解分析標籤。對 API 的調用將返回日期、應用程序和分析標籤的每個組合的數據。例如,一個androidDeliveryData JSON對象應該是這樣的:

 {
  "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
    }
  }

如何解釋指標

傳遞數據概述了符合以下每個指標的消息百分比。一條消息可能適合多個指標。由於我們是如何收集數據和粒度在我們聚集的指標水平的限制,一些消息的結果沒有在所有的指標來表示,所以在下面的百分比不會合計為100%。

計算接受的消息

數據集中包含的唯一計數是 FCM 接受以傳送到 Android 設備的消息計數。所有百分比都使用此值作為分母。請記住,此計數不包括針對已禁用在其設備上收集使用情況和診斷信息的用戶的消息。

消息結果百分比

包括在該字段MessageOutcomePercents對象提供關於消息請求的結果的信息。這些類別都是互斥的。它可以回答諸如“我的消息是否正在傳遞?”之類的問題。和“是什麼導致消息被丟棄?”

例如,對於較高的值droppedTooManyPendingMessages字段可能預示該應用實例接收的體積不可折疊的消息超過100未決消息的FCM的限制。為了緩解這種情況,請確保您的應用程序句柄調用onDeletedMessages ,並考慮派遣可折疊的消息。同樣,高百分比droppedDeviceInactive可能是一個信號,以更新註冊標記您的服務器上,刪除一些無用的令牌和從主題取消訂閱他們。見管理FCM註冊標記在這一領域的最佳實踐。

交付績效百分比

在該領域DeliveryPerformancePercents對象提供關於已成功發送的郵件信息。它可以回答諸如“我的消息是否延遲?”之類的問題。和“為什麼消息會延遲?”例如,對於較高的值delayedMessageThrottled將清楚地表明,您已超出每個設備的最大限制,並且應該調整在您發送消息的速率。

消息洞察百分比

此對象提供有關所有消息發送的附加信息。該priorityLowered現場表達了已經從優先級降低接受的郵件的比例HIGHNORMAL由於應用待機桶。如果此值很高,請嘗試發送較少的高優先級消息或確保在發送高優先級消息時始終顯示通知。

這些數據與導出到 BigQuery 的數據有何不同?

大量查詢出口提供關於由FCM後端消息的接受和消息傳遞在SDK設備(在步驟2和4上個別消息日誌FCM架構)。此數據可用於確保接受和傳遞單個消息。了解更多關於BigQuery的數據導出在下一節。

相比之下,火力地堡雲端通訊數據API提供匯總什麼Android的傳輸層(或第3步在具體細節發生FCM架構)。該數據專門提供了對從 FCM 後端到 Android SDK 的消息傳遞的洞察。它對於顯示有關消息在此傳輸過程中延遲或丟棄的原因的趨勢特別有用。

在某些情況下,由於以下原因,兩個數據集可能不完全匹配:

  • 聚合指標僅對所有消息的一部分進行採樣
  • 聚合指標四捨五入
  • 我們不提供低於隱私閾值的指標
  • 由於我們管理大量流量的方式進行了優化,因此缺少部分消息結果。

API 的限制

數據延遲

此 API 返回的數據將延遲最多 5 天。例如,在 1 月 10 日,1 月 5 日的數據將可用,但 1 月 6 日或之後的數據不可用。此外,數據是盡最大努力提供的。如果發生數據中斷,FCM 將努力向前修復,並且在問題修復後不會回填數據。在較大的中斷中,數據可能會在一周或更長時間內不可用。

數據覆蓋

Firebase Cloud Messaging Data API 提供的指標旨在深入了解消息傳遞的廣泛趨勢。但是,它們並不能 100% 覆蓋所有消息場景。以下場景是指標中未反映的已知結果。

收起的消息

已經消息倒塌另一條消息不會出現在該數據集。

給非活動設備的消息

發送到非活動設備的消息可能會或可能不會出現在數據集中,具體取決於它們採用的數據路徑。這可能會導致“丟棄的非活動設備”和“待處理”字段中的一些錯誤計數。

向具有特定用戶偏好的設備發送消息

已禁用在其設備上收集使用和診斷信息的用戶將不會根據他們的偏好將他們的消息包括在我們的計數中。

四捨五入和最小值

FCM 故意舍入並排除體積不夠大的計數。

BigQuery 數據導出

您可以將信息數據導出到BigQuery的進行進一步的分析。 BigQuery 允許您使用 BigQuery SQL 分析數據,將其導出到另一個雲提供商,或將數據用於您的自定義 ML 模型。導出到 BigQuery 包括消息的所有可用數據,無論消息類型如何,或者消息是通過 API 還是通知編輯器發送的。

對於發送到具有以下 FCM SDK 最低版本的設備的消息,您可以通過附加選項為您的應用啟用消息傳遞數據的導出:

  • Android 20.1.0 或更高版本。
  • iOS 8.6.0 或更高版本
  • Firebase Web SDK 9.0.0 或更高版本

見下面關於支持數據導出細節的AndroidiOS的

首先,將您的項目鏈接到 BigQuery:

  1. 選擇以下選項之一:

    • 打開通知作曲家,依次訪問的BigQuery在頁面的底部。

    • 集成在火力地堡控制台頁面,單擊鏈接使用BigQuery卡。

      此頁面顯示項目中所有啟用 FCM 的應用程序的 FCM 導出選項。

  2. 按照屏幕上的說明啟用 BigQuery。

請參閱鏈接火力地堡至BigQuery以獲取更多信息。

將項目鏈接到 BigQuery 後:

  • 火力地堡出口數據至BigQuery。請注意,導出數據的初始傳播可能需要長達 48 小時才能完成。

  • Firebase 設置將您的數據從 Firebase 項目定期同步到 BigQuery。這些每日出口操作從太平洋夏令時間凌晨 4:00 開始,最多可能需要 10 個小時才能完成。

  • 默認情況下,您項目中的所有應用都與 BigQuery 相關聯,您稍後添加到項目中的任何應用都會自動與 BigQuery 相關聯。您可以管理哪些應用程序發送數據

要停用的BigQuery出口,取消鏈接您的項目在火力地堡控制台。

啟用消息傳遞數據導出

帶有 FCM SDK 8.6.0 或更高版本的 iOS 設備可以啟用其應用程序的消息傳遞數據導出。 FCM 支持警報和後台通知的數據導出。啟用這些選項之前,如在您必須先創建FCM-BiqQuery鏈接為您的項目BigQuery的數據導出

為警報通知啟用交付數據導出

由於只有警報通知才能觸發通知服務應用擴展,因此您必須向應用添加通知服務擴展並在服務擴展中調用此 API 以啟用顯示消息跟踪。請參閱蘋果的文檔修改的內容在新交付的通知

必須為收到的每個通知進行以下調用:

迅速

// 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)
  }
}

目標-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

如果您正在構建使用發送請求的HTTP 1.0版API,請務必指定mutable-content = 1有效載荷對象

為後台通知啟用遞送數據導出

對於當應用程序在前台或後台接收到的背景信息,你可以調用主應用程序的數據消息處理程序中的數據導出API UIApplicationDelegate application:didReceiveRemoteNotification:fetchCompletionHandler:必須為收到的每個通知進行此調用:

迅速

// For background notifications, call the API inside the UIApplicationDelegate method:
  func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any]) {
    Messaging.extensionHelper().exportDeliveryMetricsToBigQuery(withMessageInfo:userInfo)
  }

目標-C

// For background notifications, call the API inside the UIApplicationDelegate method:
@implementation AppDelegate
- (void)application:(UIApplication *)application
    didReceiveRemoteNotification:(NSDictionary *)userInfo
          fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
  [[FIRMessaging extensionHelper] exportDeliveryMetricsToBigQueryWithMessageInfo:userInfo];
@end

哪些數據會導出到 BigQuery?

請注意,針對過時的令牌或不活動的註冊可能會誇大其中的一些統計數據。

導出表的架構是:

_PARTITIONTIME時間戳此偽列包含加載數據的當天(UTC 時間)開始的時間戳。對於 YYYYMMDD 分區,此偽列包含值 TIMESTAMP('YYYY-MM-DD')。
事件時間戳時間戳服務器記錄的事件時間戳
項目編號整數項目編號標識發送消息的項目
message_id細繩消息 ID 標識消息。根據 App ID 和時間戳生成,消息 ID 在某些情況下可能不是全局唯一的。
實例 ID細繩消息發送到的應用程序的實例 ID(如果可用)
消息類型細繩消息的類型。可以是通知消息或數據消息。主題用於標識主題或活動發送的原始消息;後續消息是通知或數據消息。
sdk_platform細繩接收方應用的平台
應用名稱細繩Android 應用程序的包名稱或 iOS 應用程序的包 ID
折疊鍵細繩折疊鍵標識一組可以折疊的消息。當設備未連接時,只有具有給定折疊鍵的最後一條消息排隊等待最終傳遞
優先事項整數消息的優先級。有效值為“正常”和“高”。在 iOS 上,這些對應於 APNs 優先級 5 和 10
特爾整數此參數指定如果設備離線,消息應在 FCM 存儲中保留多長時間(以秒為單位)
話題細繩消息發送到的主題的名稱(如果適用)
批量 ID整數批量 ID 標識一組相關消息,例如發送到主題的特定消息
事件細繩事件的類型。可能的值為:
  • MESSAGE_ACCEPTED:消息已被FCM服務器接收,請求有效;
  • MESSAGE_DELIVERED:消息已發送到設備上應用的 FCM SDK。默認情況下,不傳播此字段。要啟用,請按提供的說明setDeliveryMetricsExportToBigQuery(boolean)
  • MISSING_REGISTRATIONS:由於缺少註冊,請求被拒絕;
  • UNAUTHORIZED_REGISTRATION:消息被拒絕,因為發件人無權向註冊發送;
  • MESSAGE_RECEIVED_INTERNAL_ERROR:處理消息請求時出現未指明的錯誤;
  • MISMATCH_SENDER_ID:發送消息的請求被拒絕,因為發送消息的發送者 ID 與為端點聲明的 ID 不匹配;
  • QUOTA_EXCEEDED:由於配額不足,發送消息的請求被拒絕;
  • INVALID_REGISTRATION:由於註冊無效,發送消息的請求被拒絕;
  • INVALID_PACKAGE_NAME:由於包名無效,發送消息的請求被拒絕;
  • INVALID_APNS_CREDENTIAL:由於APNS證書無效,發送消息的請求被拒絕;
  • INVALID_PARAMETERS:由於參數無效,發送消息的請求被拒絕;
  • PAYLOAD_TOO_LARGE:由於負載大於限制,發送消息的請求被拒絕;
  • AUTHENTICATION_ERROR:由於身份驗證錯誤,發送消息的請求被拒絕(檢查用於發送消息的API Key);
  • INVALID_TTL:由於 TTL 無效,發送消息的請求被拒絕。
分析標籤細繩HTTP V1 API ,發送該消息時,以標記為分析目的消息的分析標記物可以是集

您可以對導出的數據做什麼?

以下部分提供了您可以在 BigQuery 中針對導出的 FCM 數據運行的查詢示例。

按應用計算發送的消息

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;

計算消息所針對的唯一應用程序實例

SELECT COUNT(DISTINCT instance_id)
FROM `project ID.firebase_messaging.data`
WHERE
  _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
  AND event = 'MESSAGE_ACCEPTED';

計算發送的通知消息

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';

統計發送的數據消息

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';

計算發送到主題或活動的消息

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 != '';

要跟踪事件發送到特定主題相關的消息,修改這個查詢,以取代AND message_id != '' AND message_id = <your message id>; .

計算給定主題或活動的扇出持續時間

扇出開始時間是收到原始請求的時間,結束時間是創建針對單個實例的最後一條單獨消息的時間。

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;

計算已發送消息的百分比

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;

跟踪給定消息 ID 和實例 ID 的所有事件

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;

計算給定消息 ID 和實例 ID 的延遲

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;