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

SwiftUI登录状态视图切换优化:注入对象至ViewModel及自动登出

需求目标
  • 用户首次启动应用时展示LoginView
  • 用户登录后存储token并跳转至HomeView
  • 用户后续启动应用时,因已存储token直接进入HomeView
  • 当token过期时,自动登出用户并返回登录界面
已尝试的方案

核心思路是将Authentication对象注入SwiftUI环境,实现登录状态的全局管理,具体代码如下:

定义Authentication类

class Authentication: ObservableObject {
    @Published var isValidated = false
    
    func updateValidation(success: Bool) {
        withAnimation {
            isValidated = success
        }
    }
}

在主App中注入环境

@main
struct MySecureApp_App: App {
    @StateObject var authentication = Authentication()
    var body: some Scene {
        WindowGroup {
            if authentication.isValidated {
                ContentView()
                    .environmentObject(authentication)
            } else {
                HomeView()
                    .environmentObject(authentication)
            }
        }
    }
}

登录视图中使用环境对象

struct LoginView: View {
    @StateObject private var loginVM = LoginViewModel()
    @EnvironmentObject var authentication: Authentication

    var body: some View {
            VStack {
                // 登录相关UI
                
                Button("登录") {
                    loginVM.login { success in
                        authentication.updateValidation(success: success)
                    }
                }
            }
    }
}

首页视图中监听未授权状态

struct HomeView: View {
    @StateObject private var homeVM = HomeViewModel()
    @EnvironmentObject var authentication: Authentication

    var body: some View {
        NavigationView {
            VStack {
                
            }.onReceive(homeVM.$isUnauthorized) { isUnauthorized in
                if isUnauthorized {
                    authentication.updateValidation(success: false)
                }
            }
        }
    }
}
问题与疑问
  • 当前方案需要在每个视图中传递Authentication对象,操作繁琐,能否将这类StateObject或EnvironmentObject直接注入到ViewModel或服务类中?
  • 我认为更优的实现是在HTTPClient收到API未授权响应时直接触发登出逻辑,而非在每个视图中单独检查未授权状态,该如何实现这一逻辑?

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 00:38:32