簡體   English   中英

Firebase onNewToken 不刷新我的令牌

[英]Firebase onNewToken not refreshing my token

因此,我需要在每次過期時刷新我的令牌,但是在 ddo 后面運行的服務不會觸發onNewToken()

顯現

 <service
            android:name=".fcm.MyFirebaseMessagingService"
            android:exported="false">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT" />
            </intent-filter>
        </service>

代碼

class MyFirebaseMessagingService: FirebaseMessagingService() {

    override fun onNewToken(token: String) {
        super.onNewToken(token)
        val currentUser = FirebaseAuth.getInstance().currentUser?.uid
        if(currentUser != null){
            FirebaseFirestore.getInstance().collection("user").document(currentUser).update("deviceToken",token)
        }
    }
}

每次在我的應用程序中通過 onStart() 調用 go 時,我是否需要顯式調用getInstanceID() 或者這項服務應該像我一樣用新的更新我的 deviceToken 嗎?

我已經用舊的登錄帳戶對其進行了測試,但沒有收到通知,因此,新令牌尚未刷新(我需要注銷並再次登錄才能再次接收通知)

onNewToken 什么文檔說:

當生成默認 Firebase 項目的新令牌時調用。

這會在應用程序安裝后首次生成令牌時調用,如果令牌發生變化則會再次調用。

它的意思是,一旦生成令牌,將不會調用此方法,直到必須更改推送令牌。

當您的應用程序啟動時,您必須獲取FirebaseInstanceId的實例並從中提取令牌。 它將保證您獲得有效的令牌。

您應該將代碼保留在onNewToken方法中,並添加下面提到的代碼來處理已生成令牌的情況:

FirebaseInstanceId.getInstance().instanceId.addOnSuccessListener { instanceIdResult: InstanceIdResult ->
        val currentUser = FirebaseAuth.getInstance().currentUser?.uid
        if(currentUser != null){
            FirebaseFirestore.getInstance().collection("user").document(currentUser).update("deviceToken", instanceIdResult.token)
        }
    }

更新:何時使用它。

首先你要明白兩點:

  • onNewToken令牌不存在且必須生成(應用程序安裝后)或令牌已過期且必須更改時調用。
  • FirebaseInstanceId.getInstance().instanceId.addOnSuccessListener(...)不會生成任何令牌,它只會返回您當前可用的、有效的、安全的推送通知令牌。 在您的情況下多次調用它是沒有用的。

所以現在您已經准備好onNewToken並准備好處理令牌更改。 好的。 保持原樣。

現在您需要處理的是令牌已經生成、有效且可以使用的情況。 在這種情況下不會調用onNewToken 現在輪到您手動請求將此令牌返回給您了。

例子:

class YourActivity: Activity {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        uploadFcmToken()
    }

    private fun uploadFcmToken() {
        FirebaseInstanceId.getInstance().instanceId.addOnSuccessListener { instanceIdResult: InstanceIdResult ->
            val currentUser = FirebaseAuth.getInstance().currentUser?.uid
            if(currentUser != null){
                FirebaseFirestore.getInstance()
                                     .collection("user")
                                     .document(currentUser)
                                     .update("deviceToken", instanceIdResult.token)
            }
        }
    }
}

您很可能在 FCM 已經生成初始令牌添加了onNewToken實現。

對於該特定情況(這主要影響您作為開發人員,而不是您的用戶),您還希望在主要活動的onStart之類的地方獲得令牌。 或者,您可以卸載該應用程序並在首次添加onNewToken后重新安裝它,在這種情況下,它還會生成一個新令牌並調用onNewToken

因此,您通常最終會在應用程序的onNewTokenonStart中獲得令牌。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM