FCM 註冊令牌管理的最佳實踐

如果您使用 FCM API 以編程方式構建發送請求,您可能會發現,隨著時間的推移,您會通過向具有陳舊註冊令牌的非活動設備發送消息來浪費資源。這種情況可能會影響 Firebase 控制台中報告的消息傳遞數據或導出到 BigQuery 的數據,表現為傳遞率急劇下降(但實際上並非有效)。本指南討論了您可以採取的一些措施,以幫助確保有效的郵件定位和有效的傳遞報告。

基本最佳實踐

在任何使用 FCM API 以編程方式構建發送請求的應用程序中,您都應該遵循一些基本實踐。主要的最佳實踐是:

  • 在您的服務器上存儲註冊令牌。服務器的一個重要角色是跟踪每個客戶端的令牌並保持更新的活動令牌列表。我們強烈建議在您的代碼和服務器中實現令牌時間戳,並定期更新此時間戳。
  • 刪除已存儲的過時令牌。除了在明顯的無效令牌響應情況下刪除令牌外,您可能還需要監視令牌已過時的其他跡象。本指南討論了實現此目標的一些選項。

檢索和存儲註冊令牌

在您的應用程序首次啟動時,FCM SDK 會為客戶端應用程序實例生成一個註冊令牌。這是您必須包含在來自 API 的目標發送請求中的令牌,或添加到目標主題的主題訂閱中。

正如我們的客戶端設置指南中所述,您的應用應在初始啟動時檢索此令牌,並將其與時間戳一起保存到您的應用服務器。此時間戳必須由您的代碼和服務器實現,因為 FCM SDK 不為您提供。

此外,將令牌保存到服務器並在其更改時更新時間戳也很重要,例如:

  • 該應用程序已在新設備上恢復
  • 用戶卸載/重新安裝應用程序
  • 用戶清除應用數據。

檢測來自 FCM 後端的無效令牌響應

確保檢測到來自 FCM 的無效令牌響應,並通過從系統中刪除任何已知無效的註冊令牌來響應。使用 HTTP v1 API,這些錯誤消息可能表明您的發送請求針對的是陳舊或無效的令牌:

  • UNREGISTERED (HTTP 404)
  • INVALID_ARGUMENT (HTTP 400)

有關詳細信息,請參閱錯誤代碼

如果您收到針對目標令牌的這些響應中的任何一個,則可以安全地刪除您對該令牌的記錄,因為它將永遠不再有效。但是,請記住,仍然存在令牌實際上無效但沒有任何跡象的情況。例如,有時 FCM 後端無法驗證設備是否已永久離線。

確保註冊令牌的新鮮度

確定令牌是新鮮的還是陳舊的並不總是那麼簡單。為了涵蓋所有情況,您應該在考慮令牌陳舊時採用閾值;我們的建議是兩個月。任何超過兩個月的代幣都可能是非活動設備;否則,活動設備將刷新其令牌。

定期更新代幣

我們建議您定期檢索和更新服務器上的所有註冊令牌。這要求您:

  • 在您的客戶端應用程序中添加應用程序邏輯以使用適當的 API 調用檢索當前令牌(例如token(completion):用於 Apple 平台或getToken()用於 Android),然後將當前令牌發送到您的應用服務器進行存儲(帶有時間戳)。這可能是配置為涵蓋所有客戶端/令牌的月度作業。
  • 添加服務器邏輯以定期更新令牌的時間戳,無論令牌是否已更改。

無論您遵循什麼時序模式,請確保定期更新令牌。每月一次的更新頻率可能會在電池影響與檢測非活動註冊令牌之間取得良好平衡。通過執行此刷新,您還可以確保任何處於非活動狀態的設備在再次變為活動狀態時都會刷新其註冊。比每週更頻繁地進行刷新沒有任何好處。

從主題中取消訂閱過時的令牌

管理主題訂閱以刪除過時的註冊令牌是另一個考慮因素。它包括兩個步驟:

  1. 您的應用應每月和/或每當註冊令牌更改時重新訂閱主題。這形成了一個自我修復的解決方案,當應用再次激活時,訂閱會自動重新出現。
  2. 如果應用實例閒置了 2 個月(或您自己的過時窗口),您應該使用Firebase Admin SDK取消訂閱主題,以從 FCM 後端刪除令牌/主題映射。

這兩個步驟的好處是您的扇出將發生得更快,因為有更少的陳舊令牌可供扇出,並且您的陳舊應用程序實例將在它們再次處於活動狀態時自動重新訂閱。

衡量交付成功

通常,我們建議根據從活躍使用的應用實例中觀察或捕獲的操作來定位消息。如果您定期向擁有大量訂閱者的主題發送消息,這一點尤其重要;如果這些訂閱者中有一部分實際上是不活躍的,那麼隨著時間的推移,對您的交付統計數據的影響可能會很大。

在將消息定位到令牌之前,請考慮:

  • Google Analytics、BigQuery 中捕獲的數據或其他跟踪信號是否表明令牌處於活動狀態?
  • 之前的交付嘗試是否在一段時間內一直失敗?
  • 在過去兩個月內,您的服務器上的註冊令牌是否已更新?
  • 對於 Android 設備, FCM 數據 API是否報告了由於droppedDeviceInactive導致的高比例消息傳遞失敗?

有關傳遞的更多信息,請參閱了解消息傳遞