优化冷启动流程:Launch Screen 对齐 Splash,仅阻塞 rolePermissions。

移除 SplashCoordinator,bootstrap 期间用 SplashView 覆盖避免空白闪屏,其余账号数据改为后台补充刷新。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-30 09:56:49 +08:00
parent d2fe5d71e4
commit 258c438f9a
15 changed files with 545 additions and 223 deletions

View File

@ -30,27 +30,26 @@ App 模块负责应用入口、根视图切换、全局状态注入、主导航
1. `suixinkanApp` 创建 `RootView`
2. `RootView` 初始化共享依赖,并把它们注入 Environment。
3. iOS 系统 Launch Screen 展示白底 + `SplashLogo`
4. `SplashView` 覆盖根视图,展示与 Android 对齐的品牌启动页
5. `SplashCoordinator.start` 并行执行 `SessionBootstrapper.restore`Splash 以 bootstrap 完成为准,无固定最短展示时长
6. `APIClient` 绑定 `AppSession.token` 作为默认 token provider
7. `SessionBootstrapper.restore` 尝试从 UserDefaults 读取正式 token
8. token 时保持 `loggedOut`Splash 结束后展示 `LoginView`
9. 有 token 时进入 `restoring`,先恢复本地账号快照
10. `AccountContextLoader` 并行请求用户资料和角色权限,再补全景区与门店
11. 校验成功后进入 `loggedIn`Splash 结束后展示 `MainTabsView`
12. `ScenicSpotContext` 按当前景区懒加载景点/打卡点
13. 明确 token 失效时清空 token 和账号快照,回到登录页
14. 普通网络失败时保留本地登录态,使用账号快照进入主界面
15. 冷启动 bootstrap 不使用 Lottie 全局 LoadingSplash 即启动等待层
16. `LoginView` 首屏出现后调用 `/api/app/config` 加载远程配置(如 `enable_register`),失败静默。
3. iOS 系统 Launch Screen 展示品牌页白底、Logo、文案
4. `RootView` 挂载后在 bootstrap 完成前以 `SplashView` 覆盖根视图,避免空白或登录页闪屏
5. `APIClient` 绑定 `AppSession.token` 作为默认 token provider
6. `SessionBootstrapper.restore` 尝试从 UserDefaults 读取正式 token
7. 无 token 时保持 `loggedOut`,展示 `LoginView`
8. token 时进入 `restoring`,先恢复本地账号快照
9. 阻塞请求 `rolePermissions` 成功后立即 `markLoggedIn` 并展示 `MainTabsView`
10. `userInfo``scenicListAll``storeAll` 在后台补充刷新,不阻塞首屏
11. `ScenicSpotContext` 按当前景区懒加载景点/打卡点
12. 明确 token 失效时清空 token 和账号快照,回到登录页
13. 普通网络失败时保留本地登录态,使用账号快照进入主界面
14. 冷启动 bootstrap 不使用 Lottie 全局 Loading`.restoring` 期间展示 `SplashView`
15. `LoginView` 首屏出现后调用 `/api/app/config` 加载远程配置(如 `enable_register`),失败静默
## 初始化分层
| 阶段 | 职责 | 主要对象 |
|------|------|----------|
| App 入口 | UI Test 状态清理、后续可扩展 SDK 初始化 | `suixinkanApp``AppUITestLaunchState` |
| Splash | 品牌展示 + 登录态恢复 | `SplashView``SplashCoordinator``SessionBootstrapper` |
| 冷启动恢复 | Launch Screen + Splash 覆盖 bootstrap | `SplashView``SessionBootstrapper``AccountContextLoader` |
| 首屏出现后 | 页面级远程配置 | `LoginView``AppConfigAPI` |
| 登录后 | 推送、景点列表、排队 WebSocket | `PushNotificationManager``ScenicSpotContext` |