Firebase中用户登录正式账号后是否需删除废弃匿名UID
是否需要删除登录正式账号后废弃的匿名uid
建议删除这类无留存价值的废弃匿名uid,这是Firebase认证场景下的通用最佳实践。
- 不清理的实际问题:Firebase Authentication本身不会自动回收孤立的匿名账号,官方虽然没有给出强制清理规则,但在最佳实践里明确建议定期处理无用匿名账号——长期堆着的无效匿名uid会占满Auth模块的账号配额,同时你在实时数据库里对应这些uid存的用户数据会变成没用的脏数据,白占存储,积少成多了还会影响用户统计口径、拖慢数据查询速度。
- 操作前一定要分清楚场景,别乱删搞丢用户数据:
- 如果是新用户第一次用App,先是匿名逛,之后第一次用手机号/邮箱注册,这时候别删当前的匿名uid,应该调用凭证绑定接口,把手机号/邮箱的登录凭证绑到这个匿名账号上,这样用户匿名状态下攒的浏览记录、草稿、购物车数据能直接顺到正式账号里,不会出现一注册东西全没了的bug。
- 如果是已经有正式账号的老用户,退登之后再打开App被分配了临时匿名uid,之后又用自己绑过的手机号/邮箱登回原来的正式账号,这个临时生成的匿名uid没有任何长期关联的用户数据,完全可以安全删掉。
- 对应你贴的代码,有个细节要注意:你在调手机号登录接口之前提前存了
anonymousUser的引用这个写法是对的——因为signIn方法跑成功之后,Auth的当前用户会直接切到刚登的正式账号,这时候再去取当前用户就拿不到之前的临时匿名账号了。等你判断完这次登的是已经存在的老用户正式账号,直接调anonymousUser.delete()就能把这个临时匿名账号从认证侧删掉,同时别忘了把数据库里对应这个匿名uid的用户数据节点也一起清掉,别留脏数据。
怕漏处理或者误删的话,可以加个兜底的定时清理任务:把创建时间超过30天、从来没绑过任何正式登录凭证(邮箱/手机号/第三方登录)、也没产生过有效业务数据的匿名账号批量清掉,就算有当时没来得及删的临时匿名uid,也会被定期回收,不会堆出问题。
对应参考代码片段:
let anonymousUserUID = Auth.auth().currentUser?.uid // "abc..." let anonymousUser = Auth.auth().currentUser let credential = PhoneAuthProvider.provider().credential(withVerificationID: verificationID, verificationCode: verificationCode) Auth.auth().signIn(with: credential, completion: { (authDataResult, error) in guard let userId = authDataResult?.user.uid else { return } let usersRef = Database.database().reference() .child("users") .child(userId) usersRef.observeSingleEvent(of: .value, with: { [weak self](snapshot) in if snapshot.exists() { // 确认登录的是已存在的老正式账号,删除临时匿名账号及对应数据 anonymousUser?.delete(completion: { deleteError in guard deleteError == nil else { return } // 同步删除数据库中对应该匿名uid的节点数据 Database.database().reference().child("users").child(anonymousUserUID).removeValue() }) } }) })
内容的提问来源于stack exchange,提问作者Lance Samaria
相关产品推荐
相关产品推荐

