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
.
因此,您通常最终会在应用的 onNewToken
和 onStart
中获得令牌。
所以,每次过期我都需要刷新我的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
.
因此,您通常最终会在应用的 onNewToken
和 onStart
中获得令牌。