因此,每次令牌到期时,我都需要刷新它,但ddoes后面运行的服务不会触发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()
?还是这个服务应该像我一样用新的设备令牌更新我的设备令牌?
我用一个旧的登录帐户测试了它,但通知没有到达,因此,新的令牌没有被刷新(我需要注销并再次登录才能再次收到通知(
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
。
因此,您通常会在应用程序的onNewToken
和onStart
中同时获得令牌。