双认证注册后用户路由优化:避免重复引导邮箱注册
优化手机号+邮箱联合注册的路由逻辑方案
咱们先拆解核心问题:原逻辑靠对比creationDate和lastSignInDate判断是否需要引导邮箱注册,这个规则太脆弱——用户当天登出再登录时,lastSignInDate会更新,直接导致判断逻辑失效,要么错误重复引导到邮箱注册页,要么跳过必要的认证步骤。
正确的思路是给用户加一个明确的认证状态标记,用它来判断是否完成邮箱注册,而非依赖登录时间。下面是具体实现步骤:
1. 新增用户认证状态标记
在用户首次通过手机号注册成功后,给Firebase Auth的用户metadata(或Firestore用户文档,推荐后者更灵活)添加hasCompletedEmailRegistration字段,初始值设为false。
修改你的phoneRegister函数:
func phoneRegister () { let credential = PhoneAuthProvider.provider().credential(withVerificationID: self.verificationCode, verificationCode: self.code) Auth.auth().signIn(with: credential) { (result, error) in if let error = error { self.alertMessage = error.localizedDescription self.alert.toggle() return } guard let user = result?.user else { return } // 判定是否为新用户:首次注册时creationDate和lastSignInDate完全一致 if user.metadata.creationDate == user.metadata.lastSignInDate { // 给新用户初始化邮箱注册状态 let userData = ["hasCompletedEmailRegistration": false] user.updateProfile(userData) { error in if let error = error { print("更新用户状态失败: \(error.localizedDescription)") } } } UserDefaults.standard.set(true, forKey: "status") NotificationCenter.default.post(name: NSNotification.Name("statusChange"), object: nil) } }
2. 完成邮箱注册后更新状态
在用户完成邮箱绑定/验证的逻辑里,把hasCompletedEmailRegistration更新为true:
func completeEmailRegistration() { // 假设此处已完成邮箱绑定、验证的核心逻辑 guard let user = Auth.auth().currentUser else { return } let userData = ["hasCompletedEmailRegistration": true] user.updateProfile(userData) { error in if let error = error { print("更新邮箱注册状态失败: \(error.localizedDescription)") return } // 状态更新后通知路由跳转至AppView NotificationCenter.default.post(name: NSNotification.Name("emailRegistrationCompleted"), object: nil) } }
3. 修改路由判断逻辑
现在路由直接读取用户的认证状态标记,彻底摆脱对登录时间的依赖:
Group { if let session = self.session.session, let user = session.currentUser { // 读取用户自定义状态,默认值为true兼容老用户 let hasCompletedEmailReg = user.profileData["hasCompletedEmailRegistration"] as? Bool ?? true if hasCompletedEmailReg { AppView() } else { EmailRegisterView() } } else { OnBoardingView() } }.onAppear(perform: { session.listen() })
补充提示
- 如果项目用Firestore存储用户信息,建议把
hasCompletedEmailRegistration存在Firestore文档里,比Auth metadata更灵活(Auth字段长度有限,Firestore支持更多复杂类型)。 - 确保
session.listen()的回调能实时获取用户最新状态,避免缓存导致的判断错误。 - 给老用户设置默认值
true,不会影响现有用户的正常使用。
这样修改后,只有未完成邮箱注册的新用户会被引导至EmailRegisterView,完成后状态永久更新,后续登录直接进入AppView,彻底解决了当日登出再登录重复引导的问题。
内容的提问来源于stack exchange,提问作者devOP1
相关产品推荐
相关产品推荐

