You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

双认证注册后用户路由优化:避免重复引导邮箱注册

优化手机号+邮箱联合注册的路由逻辑方案

咱们先拆解核心问题:原逻辑靠对比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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:04:15