优化冷启动流程: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

@ -2,32 +2,36 @@
## 模块职责
Splash 模块负责冷启动时的品牌启动页展示,对齐 Android `SplashActivity` + `activity_splash.xml` 的视觉规范
Splash 模块负责冷启动品牌展示,与系统 Launch Screen 保持相同视觉,并在 bootstrap 完成前避免空白页或登录页闪屏
该模块不处理登录、隐私协议或远程配置,只承担启动阶段的品牌展示和时序控制
冷启动恢复登录态由 `SessionBootstrapper` 负责;`SplashView` 仅覆盖 bootstrap 阻塞阶段,不做固定时长品牌停留
## 核心对象
- `SplashView`展示白底、180pt Logo、「随心瞰 / 商家版」文案
- `SplashCoordinator`:并行执行 `SessionBootstrapper.restore`bootstrap 完成后结束 Splash无固定最短展示时长
- `SplashLogo` / `LaunchBackground`:启动页图片与背景色资源,同时用于系统 `UILaunchScreen`
- `SplashView`冷启动 bootstrap 期间展示的品牌页,与 Launch Screen 布局一致
- `SplashTypography`:启动页标题/副标题字号与 UIKit 字体,供 `SplashView``Launch Screen.storyboard` 对齐
- `SplashLogo` / `LaunchBackground`:启动页图片与背景色资源。
- `SessionBootstrapper`:冷启动恢复登录态,阻塞等待 `rolePermissions`,其余数据后台刷新。
- `AccountContextLoader.restorePermissions` / `refreshSupplementalContext`:拆分阻塞阶段与后台补充阶段。
## 展示规则
- 背景色:白色 `#FFFFFF`
- Logo`SplashLogo`180×180 pt
- 标题:`随心瞰`40ptbold + italic`AppDesign.primary`
- 副标题:`商家版`20ptbold距底 32pt
- 系统 Launch Screen白底、180×180 Logo、「随心瞰 / 商家版」文案。
- 应用内 `SplashView`bootstrap 完成前覆盖根视图,避免 `.restoring` 空白或登录页闪现。
- bootstrap 结束后淡出 Splash进入 `LoginView``MainTabsView`
- 无固定最短展示时长。
## 启动时序
1. iOS 系统 Launch Screen 展示白底 + Logo
2. `RootView` 挂载后立即显示 `SplashView`
3. `SplashCoordinator.start` 并行执行 `SessionBootstrapper.restore` 静默恢复登录态。
4. bootstrap 完成后淡出 Splash进入 `LoginView``MainTabsView`
5. 冷启动期间不显示 Lottie 全局 Loading
1. iOS 系统 Launch Screen 展示品牌页
2. `RootView` 挂载后立即显示 `SplashView` 覆盖层
3. `SessionBootstrapper.restore` 并行恢复登录态。
4. 无 tokenbootstrap 完成后进入 `LoginView`
5. 有 token恢复 `AccountSnapshot` → 阻塞请求 `rolePermissions``markLoggedIn` → 进入 `MainTabsView`
6. `userInfo``scenicListAll``storeAll` 在后台补充刷新,不阻塞首屏。
7. 冷启动期间不显示 Lottie 全局 Loading。
## 与 Android 的差异
- Android 首启隐私弹窗在 Splash 上iOS 仍在登录页勾选协议。
- Android 系统 Launch Screen 与应用内 Splash 使用同一 XMLiOS 系统 Launch Screen 仅展示 Logo文案由 SwiftUI Splash 补齐
- Android 系统 Launch Screen 与应用内 Splash 使用同一 XMLiOS 系统 Launch Screen 与应用内 `SplashView` 保持相同布局,但应用内 Splash 仅在 bootstrap 期间展示