Firebase onNewToken 没有刷新我的令牌

Firebase onNewToken not refreshing my token

所以,每次过期我都需要刷新我的token,但是后面运行的服务并没有触发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() 时是否需要显式调用 getInstanceID()?还是该服务应该像我一样用新的 deviceToken 更新我的 deviceToken?

我用旧的登录帐户测试过,但没有收到通知,因此,新令牌没有刷新(我需要注销并重新登录才能再次收到通知)

onNewToken。文件说什么:

Called when a new token for the default Firebase project is generated.

This is invoked after app install when a token is first generated, and again if the token changes.

这是什么意思,一旦生成令牌,将不会调用此方法,直到必须更改推送令牌。

当您的应用程序启动时,您必须获取 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(...) 没有生成任何令牌!目前只有 returns 可用,有效,可以安全使用推送通知令牌。在你的情况下多次调用它是没有用的。

现在您已经 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)
            }
        }
    }
}

很可能您添加了 onNewToken 实施 FCM 已经生成初始令牌之后。

对于该特定情况(这主要影响您作为开发人员,而不是您的用户),您还需要在主 activity 的 onStart 中获取令牌。或者,您可以卸载应用程序并在首次添加 onNewToken 后重新安装,在这种情况下,它还会生成一个新令牌并调用 onNewToken.

因此,您通常最终会在应用的 onNewTokenonStart 中获得令牌。