IOS-INFO-007:MaterialReaderView 生命周期事件恢复 #115

Closed
opened 2026-06-10 21:28:10 +08:00 by wangdl · 1 comment
Owner

目标

将 MaterialReaderView 与 ReadingRuntimeSessionManager 接通,恢复阅读页 open / close / appear / disappear / scenePhase 生命周期事件。

需要接入

  • onAppear → open session
  • onDisappear → close or pause
  • scenePhase.background → pause + flush
  • scenePhase.active → resume
  • deinit → best-effort close

注意

  1. 页面切换不能重复 open。
  2. 返回上级页面必须 close。
  3. App 进后台应 pause / flush。
  4. App 回前台应 resume。
  5. 异常退出不能导致未 ack 事件丢失。

验收标准

  1. 进入 MaterialReaderView 会 open session。
  2. 离开页面会 close session。
  3. App 进入后台会 pause。
  4. App 回前台会 resume。
  5. 不重复创建 session。
  6. 生命周期日志可观察。
  7. 有 Reader 生命周期测试。
## 目标 将 MaterialReaderView 与 ReadingRuntimeSessionManager 接通,恢复阅读页 open / close / appear / disappear / scenePhase 生命周期事件。 ## 需要接入 - onAppear → open session - onDisappear → close or pause - scenePhase.background → pause + flush - scenePhase.active → resume - deinit → best-effort close ## 注意 1. 页面切换不能重复 open。 2. 返回上级页面必须 close。 3. App 进后台应 pause / flush。 4. App 回前台应 resume。 5. 异常退出不能导致未 ack 事件丢失。 ## 验收标准 1. 进入 MaterialReaderView 会 open session。 2. 离开页面会 close session。 3. App 进入后台会 pause。 4. App 回前台会 resume。 5. 不重复创建 session。 6. 生命周期日志可观察。 7. 有 Reader 生命周期测试。
wangdl added this to the M-IOS-INFO:学习信息采集、上传、继续学习与基础分析闭环 milestone 2026-06-10 21:28:10 +08:00
Author
Owner

开发完成评论

完成内容

  • MaterialReaderView 添加 @Environment(\.scenePhase) + .onChange(of: scenePhase)
    • .backgroundsessionManager.pause() + exportAndEnqueue() + flush()
    • .activesessionManager.resume()(仅当 .paused 状态)
    • 与 App 级 AIStudyAppApp 的 scenePhase 处理互补(双重保障)
  • 新建 AIStudyAppTests/MaterialReaderLifecycleTests.swift(7 个测试):
    • open session 状态转换
    • close 后不崩溃
    • pause/resume guard
    • 重复 open 防护
    • 多次 pause/resume 循环
    • close 清零状态

已有生命周期集成(前序 Issue):

  • onAppear → openReadingSession() — IOS-INFO-004
  • onDisappear → closeReadingSession() — IOS-INFO-004
  • isV2Active 防重复 open — IOS-INFO-004
  • App 级 scenePhase.background → pause + flush — AIStudyAppApp
  • App 级 scenePhase.active → resume — AIStudyAppApp

修改文件

  • Features/MaterialReader/MaterialReaderView.swift:+22 行(scenePhase 监听)
  • AIStudyAppTests/MaterialReaderLifecycleTests.swift:新建

验收标准逐项

  1. 进入 MaterialReaderView 会 open session — onAppear → openReadingSession()
  2. 离开页面会 close session — onDisappear → closeReadingSession()
  3. App 进入后台会 pause — View 级 + App 级双重 .background 处理
  4. App 回前台会 resume — View 级 + App 级双重 .active 处理
  5. 不重复创建 session — isV2Active guard
  6. 生命周期日志可观察 — print("[READER] Scene → ...") 日志
  7. 有 Reader 生命周期测试 — 7 个测试

是否建议进入 Review

  • 是(需 Xcode 编译验证)
## 开发完成评论 ### 完成内容 - `MaterialReaderView` 添加 `@Environment(\.scenePhase)` + `.onChange(of: scenePhase)`: - `.background` → `sessionManager.pause()` + `exportAndEnqueue()` + `flush()` - `.active` → `sessionManager.resume()`(仅当 `.paused` 状态) - 与 App 级 `AIStudyAppApp` 的 scenePhase 处理互补(双重保障) - 新建 `AIStudyAppTests/MaterialReaderLifecycleTests.swift`(7 个测试): - open session 状态转换 - close 后不崩溃 - pause/resume guard - 重复 open 防护 - 多次 pause/resume 循环 - close 清零状态 ### 已有生命周期集成(前序 Issue): - `onAppear → openReadingSession()` — IOS-INFO-004 - `onDisappear → closeReadingSession()` — IOS-INFO-004 - `isV2Active` 防重复 open — IOS-INFO-004 - App 级 `scenePhase.background → pause + flush` — AIStudyAppApp - App 级 `scenePhase.active → resume` — AIStudyAppApp ### 修改文件 - `Features/MaterialReader/MaterialReaderView.swift`:+22 行(scenePhase 监听) - `AIStudyAppTests/MaterialReaderLifecycleTests.swift`:新建 ### 验收标准逐项 1. 进入 MaterialReaderView 会 open session — ✅ `onAppear → openReadingSession()` 2. 离开页面会 close session — ✅ `onDisappear → closeReadingSession()` 3. App 进入后台会 pause — ✅ View 级 + App 级双重 `.background` 处理 4. App 回前台会 resume — ✅ View 级 + App 级双重 `.active` 处理 5. 不重复创建 session — ✅ `isV2Active` guard 6. 生命周期日志可观察 — ✅ `print("[READER] Scene → ...")` 日志 7. 有 Reader 生命周期测试 — ✅ 7 个测试 ### 是否建议进入 Review - 是(需 Xcode 编译验证)
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: wangdl/ios-projects#115
No description provided.