1

我正在從GCM升級到FCM。在onTokenRefresh之外獲取Firebase設備令牌的正確方法是什麼?如何訪問FirebaseInstanceIdService之外的Firebase令牌?

我試圖獲取設備令牌,以便以後可以在服務器上重新啓用它。我最初通過遵循方法1的here文檔獲取設備令牌。但是,當我嘗試通過方法2直接訪問設備令牌時,我得到了一個不同的令牌。我是否在方法2中錯誤地檢索設備標記?

方法1:FirebaseInstanceIdService.onTokenRefresh的()內

String refreshedToken = FirebaseInstanceId.getInstance().getToken(); 

方法2:在設備令牌

FirebaseInstanceId instanceID = FirebaseInstanceId.getInstance(); 
String registrationToken = instanceID.getToken(this.projectNumber, "FCM"); 

回答

2

只是爲了解釋什麼是方法1發生的直接訪問。建議在onTokenRefresh()之內獲得令牌,因爲此方法被觸發時,這意味着之前的令牌已失效。從文檔:

當系統確定令牌需要刷新時調用。應用程序應調用getToken()並將令牌發送給所有應用程序服務器。

對於方法2,你打電話getToken(String authorizedEntity, String scope),而不是getToken()。具有兩個參數的那個通常在setting up your app to receive messages from multiple senders時使用。

對於使用不同項目ID(authorizedEntity)的getToken(String authorizedEntity, String scope)的每個調用,它將返回不同的標記。

就用相同的調用替換您的方法2方法1,就像這樣:

String registrationToken = FirebaseInstanceId.getInstance().getToken(); 

,你應該能夠檢索指定的令牌。令牌通常在您的初始活動的onCreate()中檢索。

+0

明白了。如果我使用與google-services.json中指定的項目ID相同的項目ID,您是否碰巧知道爲什麼Method#2會返回不同的標記?我假設他們應該是相同的,如果他們使用相同的ID。 –

+0

關於內部工作原理的文檔中沒有提及。我認爲會發生的是,由於'getToken(String,String)'預計僅用於註冊不同的發件人,因此它會自動處理髮件人ID(不管它是默認的/還是一個google-services。 JSON)作爲一個不同的。我希望這是有道理的。 –