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

SwiftUI应用登出后重启自动登录问题求助

SwiftUI Firebase登出后重启状态不保持的解决方案

问题根源

  • 登出按钮仅直接修改了@Published var signedIn的变量值,未调用Firebase Auth的signOut()方法,导致Firebase端的用户会话未真正清除。
  • 应用重启时,ContentView的onAppear会执行viewModel.signedIn = viewModel.isSignedIn,而isSignedIn依赖auth.currentUser判断登录状态,此时用户会话仍存在,所以signedIn被重置为true,自动回到主页面。

解决方案

1. 修复登出按钮逻辑

将直接修改signedIn的代码,改为调用viewModel的signOut()方法,确保真正清除Firebase会话:

@EnvironmentObject var appViewModel: AppViewModel
// ...
Button {
    appViewModel.signOut() // 替换原来的appViewModel.signedIn = false
} label: {
   Text("Sign Out")
}

2. 优化AppViewModel的signOut方法(可选但推荐)

原代码用try?忽略了登出错误,建议添加错误处理便于排查问题:

class AppViewModel:ObservableObject{    
    let auth = Auth.auth()
    
    @Published var signedIn = false
    
    var isSignedIn: Bool {
        return auth.currentUser != nil
    }
    
    // ...其他方法
    
    func signOut(){
        do {
            try auth.signOut()
            self.signedIn = false
        } catch {
            print("登出失败:\(error.localizedDescription)")
        }
    }
}

3. 初始化时同步登录状态(优化体验)

在AppViewModel初始化时直接同步登录状态,避免依赖ContentView的onAppear:

class AppViewModel:ObservableObject{    
    let auth = Auth.auth()
    
    @Published var signedIn = false
    
    var isSignedIn: Bool {
        return auth.currentUser != nil
    }
    
    init() {
        // 初始化时同步登录状态
        self.signedIn = isSignedIn
    }
    
    // ...其他方法
}

4. 补全ContentView未登录视图

原ContentView的else块为空,需要添加SignInView确保未登录时显示登录页面:

struct ContentView: View {    
    @EnvironmentObject var viewModel: AppViewModel
    
    var body: some View {
        NavigationView{
            if viewModel.signedIn {
                MainPage()
            } else {
                SignInView() // 补充未登录时的视图
            }
        }
        // 可选:保留onAppear作为双重校验
        .onAppear{
            viewModel.signedIn = viewModel.isSignedIn
        }
    }
}

内容的提问来源于stack exchange,提问作者user20959032

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 06:30:49