升级Firebase依赖后FirebaseInstanceId无法解析,如何获取Token?
解决Firebase升级后「FirebaseInstanceId Cannot resolve symbol」错误并获取FCM Token
问题背景
旧版Firebase依赖下代码可正常运行,升级至使用Firebase BOM(版本32.1.1)的新版依赖后,出现「FirebaseInstanceId Cannot resolve symbol」错误,原代码通过FirebaseInstanceId获取FCM Token。
旧版build.gradle配置
//Firebase implementation 'com.google.firebase:firebase-auth:16.0.2' implementation 'com.google.firebase:firebase-firestore:17.0.1' implementation 'com.google.firebase:firebase-messaging:17.1.0' implementation 'com.google.firebase:firebase-core:16.0.0' //FirebaseUI implementation 'com.firebaseui:firebase-ui-auth:7.2.0'
新版build.gradle配置
//Firebase implementation platform('com.google.firebase:firebase-bom:32.1.1') implementation 'com.google.firebase:firebase-firestore:' implementation 'com.google.firebase:firebase-messaging:' implementation 'com.google.firebase:firebase-auth:' implementation 'com.google.firebase:firebase-core:' //FirebaseUI implementation 'com.firebaseui:firebase-ui-auth:7.2.0'
原获取Token代码
FirebaseInstanceId.getInstance().getInstanceId().addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() { public void onComplete(Task<InstanceIdResult> task) { if (task.isSuccessful()) { if (task.getResult() != null) { String unused = LoginActivity.this.tokenid = task.getResult().getToken(); } if (FirebaseAuth.getInstance().getCurrentUser() != null) { String unused2 = LoginActivity.this.userid = FirebaseAuth.getInstance().getCurrentUser().getUid(); } NoteUserData noteUserData = new NoteUserData(); noteUserData.setDoc_id(userid); noteUserData.setToken(tokenid); noteUserData.setUseremail(useremail); noteUserData.setUserphone(userphone); noteUserData.setAccountstatus("Approved"); noteUserData.setIdcheckstatus(false); FirebaseFirestore.getInstance().collection(getResources().getString(R.string.dataUsers)).document(userid).set(noteUserData); } } });
原因
从Firebase Messaging 21.0.0版本开始,FirebaseInstanceId类已被废弃,FCM Token的获取逻辑迁移至FirebaseMessaging类。
解决步骤
直接替换原Token获取代码为以下实现:
FirebaseMessaging.getInstance().getToken() .addOnCompleteListener(new OnCompleteListener<String>() { @Override public void onComplete(@NonNull Task<String> task) { if (!task.isSuccessful()) { return; } // 获取到FCM Token if (task.getResult() != null) { LoginActivity.this.tokenid = task.getResult(); } // 以下保持原逻辑不变 if (FirebaseAuth.getInstance().getCurrentUser() != null) { LoginActivity.this.userid = FirebaseAuth.getInstance().getCurrentUser().getUid(); } NoteUserData noteUserData = new NoteUserData(); noteUserData.setDoc_id(userid); noteUserData.setToken(tokenid); noteUserData.setUseremail(useremail); noteUserData.setUserphone(userphone); noteUserData.setAccountstatus("Approved"); noteUserData.setIdcheckstatus(false); FirebaseFirestore.getInstance().collection(getResources().getString(R.string.dataUsers)) .document(userid) .set(noteUserData); } });
关键变化说明
- 用
FirebaseMessaging.getInstance().getToken()替代FirebaseInstanceId.getInstance().getInstanceId() getToken()的返回任务直接携带String类型的Token,无需再通过InstanceIdResult获取- 移除了无用的
unused变量赋值,简化代码
内容的提问来源于stack exchange,提问作者Azmat Ali
相关产品推荐
相关产品推荐

