// // AppUITestLaunchState.swift // suixinkan // // Created by Codex on 2026/6/26. // import Foundation /// UI 测试启动状态,仅在测试进程显式传入启动参数时生效。 enum AppUITestLaunchState { /// UI Test 主开关,测试进程统一传入。 static let uiTestsArgument = "-suixinkan-ui-tests" /// 冷启动前清理本地登录缓存。 static let resetArgument = "-suixinkan-ui-tests-reset-state" /// 登录后直达首页调试菜单项(下一参数为菜单标题)。 static let openMenuArgument = "-suixinkan-ui-tests-open-menu" /// 登录后直达个人中心二级页(下一参数为路由名)。 static let openProfileArgument = "-suixinkan-ui-tests-open-profile" /// 当前进程是否由 XCUITest 启动。 static var isRunningUITests: Bool { ProcessInfo.processInfo.arguments.contains(uiTestsArgument) } /// 待打开的首页调试菜单标题。 static var pendingMenuTitle: String? { argumentValue(following: openMenuArgument) } /// 待打开的个人中心路由标识。 static var pendingProfileRouteRawValue: String? { argumentValue(following: openProfileArgument) } /// 读取启动参数中紧跟在指定 flag 后的值。 private static func argumentValue(following flag: String) -> String? { let arguments = ProcessInfo.processInfo.arguments guard let index = arguments.firstIndex(of: flag), index + 1 < arguments.count else { return nil } let value = arguments[index + 1].trimmingCharacters(in: .whitespacesAndNewlines) return value.isEmpty ? nil : value } /// 按需在冷启动时清理 token、账号快照和偏好设置。 static func resetIfNeeded(arguments: [String] = ProcessInfo.processInfo.arguments) { guard arguments.contains(resetArgument) else { return } try? SessionTokenStore().clear() AccountSnapshotStore().clear() let preferences = AppPreferencesStore() preferences.clear() } }