Firebase Realtime Database删除的Token数据反复自动再生如何解决?
问题根因
你代码里的核心问题出在Token存在性校验用了持续实时监听器,删除操作触发了监听器的回调自动重写了Token:
- 你在获取FCM Token后,使用
addValueEventListener监听Token节点的变更,这个监听器会一直保持激活状态,只要监听路径下的数据发生变化就会触发回调 - 你登出时删除Token的操作会触发该监听器回调,此时
snapshot.exists()返回false,代码自动执行写入逻辑把Token重新存回数据库,就出现了删完立刻再生的现象
修复步骤
- 将Token存在性校验的实时监听器替换为单次查询监听器
你只需要在获取到Token的时候判断一次是否已经存在,不需要持续监听,把代码中的addValueEventListener替换为addListenerForSingleValueEvent即可,修改后的示例:
myRef.child("Token").orderByChild("token").equalTo(firebaseToken) // 替换为单次查询,只会触发一次回调,不会监听后续数据变更 .addListenerForSingleValueEvent(object : ValueEventListener { override fun onDataChange(snapshot: DataSnapshot) { val token : Token = Token(firebaseToken) if (snapshot.exists()) { return } else { databaseReference.child("Token") .child(currentdate.toString()).setValue(token) } } override fun onCancelled(error: DatabaseError) { Toast.makeText(context, error.message, Toast.LENGTH_LONG).show() } })
- 修正登出删除逻辑的数据库实例引用
你写入Token时指定了完整的数据库URL,删除时如果没指定会导致操作的是默认数据库实例,出现删错库的问题,修改删除代码的数据库实例初始化:
// 删除时也指定和写入相同的数据库URL,保证操作的是同一个库 val delRef = FirebaseDatabase.getInstance("https://trial-38785-default-rtdb.firebaseio.com/") .getReference("AppUsers") .child("Doctor").child(currentId.toString()) .child("Token").child(key.toString()).removeValue() delRef.addOnSuccessListener { println("Removed.") }.addOnFailureListener { println("Not Removed.") }
- 可选优化:登出时主动删除FCM Token
如果需要彻底避免当前设备后续再收到对应账号的推送,可以在登出时主动调用删除Token的接口:
FirebaseMessaging.getInstance().deleteToken().addOnCompleteListener { // 回调中再执行数据库删除操作即可 }
内容的提问来源于stack exchange,提问作者suhail zack
相关产品推荐
相关产品推荐

