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
相关产品推荐
相关产品推荐

