Swift项目中Firebase用户登出重登后显示名被重置的原因是什么?
根本原因
- Firebase iOS SDK 身份认证模块的固有逻辑缺陷:使用邮箱密码方式登录时,登录成功后返回的用户对象会优先使用本次认证响应返回的字段填充,而邮箱密码登录的响应本身不会携带
displayName字段,SDK 未做服务端已有显示名的兜底校验,直接将本地缓存的displayName覆盖为空字符串,导致二次登录后本地读取到空值。 - 原有代码的判断逻辑依赖登录后即刻返回的本地缓存用户对象,此时服务端存储的正确显示名还未同步到本地,会触发错误的空值判断。
优化解决方案
无需每次登录都执行写入操作,只需要在登录成功后先触发一次用户资料服务端同步,再做显示名判断即可,优化后代码如下:
Auth.auth().signIn(withEmail: email, password: password) { [weak self] result, error in guard let user = result?.user, error == nil else { return } // 先同步服务端最新用户资料,覆盖SDK错误填充的空值 user.reload { reloadError in guard reloadError == nil else { return } // 仅当服务端返回的显示名确实不符合要求时才执行更新 if (user.displayName ?? "").count < 2, let email = user.email { var displayName = email if let atRange = displayName.range(of: "@") { displayName.removeSubrange(atRange.lowerBound..<displayName.endIndex) } let changeRequest = user.createProfileChangeRequest() changeRequest.displayName = displayName changeRequest.commitChanges { err in if let err = err { print(err) } } } } }
注意事项
- 避免直接强制解包
user.displayName、user.email可选值,防止极端场景下出现崩溃 - 资料同步操作仅需在登录成功的回调中执行一次,无需在App生命周期内重复调用
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

