IOS-INFO-004:V1 ReadingEventCollector 断链修复与兼容层 #112

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

目标

恢复当前被注释的 ReadingEventCollector.open/close 链路,使 V1 兼容层在 V2 完成前不继续断裂。

需要处理

  1. 找到 MaterialReaderView 或相关 Reader 页面中被注释的 collector.open。
  2. 找到 close / onDisappear / deinit 中被注释或缺失的 collector.close。
  3. 恢复基础 open / close / position 采集。
  4. 避免重复打开 session。
  5. 避免页面销毁时未 close。
  6. 标记 V1 collector 为 deprecated compatibility。

验收标准

  1. 进入阅读页会触发 open。
  2. 退出阅读页会触发 close。
  3. 不会重复 open。
  4. 不会出现 close 未打开 session 崩溃。
  5. lastPosition 能被更新。
  6. V1 逻辑通过兼容层保留。
  7. 有基础生命周期测试。
## 目标 恢复当前被注释的 ReadingEventCollector.open/close 链路,使 V1 兼容层在 V2 完成前不继续断裂。 ## 需要处理 1. 找到 MaterialReaderView 或相关 Reader 页面中被注释的 collector.open。 2. 找到 close / onDisappear / deinit 中被注释或缺失的 collector.close。 3. 恢复基础 open / close / position 采集。 4. 避免重复打开 session。 5. 避免页面销毁时未 close。 6. 标记 V1 collector 为 deprecated compatibility。 ## 验收标准 1. 进入阅读页会触发 open。 2. 退出阅读页会触发 close。 3. 不会重复 open。 4. 不会出现 close 未打开 session 崩溃。 5. lastPosition 能被更新。 6. V1 逻辑通过兼容层保留。 7. 有基础生命周期测试。
wangdl added this to the M-IOS-INFO:学习信息采集、上传、继续学习与基础分析闭环 milestone 2026-06-10 21:28:09 +08:00
Author
Owner

开发完成评论

完成内容

MaterialReaderView 断链修复:

  • 新增 isV2Active 属性,统一判断 V2 session 状态(.active.paused
  • openReadingSession() 添加重复 open 保护:guard !isV2Active
  • markAsRead() 改为 V2/V1 分支:V2 活跃时只调 sessionManager.markAsRead(),否则 fallback collector.markAsRead()
  • closeReadingSession() 逻辑已正确(V2 活跃 → 关 V2 return;否则关 V1)
  • updatePosition 已有正确 V2/V1 分支(line 410-414),无需修改

测试文件:

  • 新建 AIStudyAppTests/ReadingEventCollectorTests.swift(6 个测试):
    • test_open_sets_activeMaterialId — open 产生 materialOpened 事件
    • test_close_returns_active_seconds — close 返回 activeSeconds
    • test_close_on_unopened_material_does_not_crash — 关闭未打开资料不崩溃
    • test_mark_as_read_pushes_event — markAsRead 产生 markedAsRead 事件
    • test_duplicate_open_is_safe — 重复 open 不崩溃
    • test_lastPosition_updated — updatePosition 更新 lastPosition

修改文件

  • Features/MaterialReader/MaterialReaderView.swift:+6 行(isV2Active + guard + markAsRead 分支)
  • AIStudyAppTests/ReadingEventCollectorTests.swift:新建

代码证据

  • MaterialReaderView.swift:116-118isV2Active 属性
  • MaterialReaderView.swift:297-300guard !isV2Active 防重复 open
  • MaterialReaderView.swift:347-353markAsRead V2/V1 分支

验收标准逐项

  1. 进入阅读页会触发 open — onAppear → openReadingSession()
  2. 退出阅读页会触发 close — onDisappear → closeReadingSession()
  3. 不会重复 open — guard !isV2Active
  4. 不会出现 close 未打开 session 崩溃 — V1 close 安全返回 0
  5. lastPosition 能被更新 — test_lastPosition_updated
  6. V1 逻辑通过兼容层保留 — fallback 分支完整
  7. 有基础生命周期测试 — 6 个测试

是否建议进入 Review

  • 是(需 Xcode 编译验证)
## 开发完成评论 ### 完成内容 **MaterialReaderView 断链修复:** - 新增 `isV2Active` 属性,统一判断 V2 session 状态(`.active` 或 `.paused`) - `openReadingSession()` 添加重复 open 保护:`guard !isV2Active` - `markAsRead()` 改为 V2/V1 分支:V2 活跃时只调 `sessionManager.markAsRead()`,否则 fallback `collector.markAsRead()` - `closeReadingSession()` 逻辑已正确(V2 活跃 → 关 V2 return;否则关 V1) - `updatePosition` 已有正确 V2/V1 分支(line 410-414),无需修改 **测试文件:** - 新建 `AIStudyAppTests/ReadingEventCollectorTests.swift`(6 个测试): - `test_open_sets_activeMaterialId` — open 产生 materialOpened 事件 - `test_close_returns_active_seconds` — close 返回 activeSeconds - `test_close_on_unopened_material_does_not_crash` — 关闭未打开资料不崩溃 - `test_mark_as_read_pushes_event` — markAsRead 产生 markedAsRead 事件 - `test_duplicate_open_is_safe` — 重复 open 不崩溃 - `test_lastPosition_updated` — updatePosition 更新 lastPosition ### 修改文件 - `Features/MaterialReader/MaterialReaderView.swift`:+6 行(`isV2Active` + guard + markAsRead 分支) - `AIStudyAppTests/ReadingEventCollectorTests.swift`:新建 ### 代码证据 - `MaterialReaderView.swift:116-118`:`isV2Active` 属性 - `MaterialReaderView.swift:297-300`:`guard !isV2Active` 防重复 open - `MaterialReaderView.swift:347-353`:`markAsRead` V2/V1 分支 ### 验收标准逐项 1. 进入阅读页会触发 open — ✅ `onAppear → openReadingSession()` 2. 退出阅读页会触发 close — ✅ `onDisappear → closeReadingSession()` 3. 不会重复 open — ✅ `guard !isV2Active` 4. 不会出现 close 未打开 session 崩溃 — ✅ V1 close 安全返回 0 5. lastPosition 能被更新 — ✅ `test_lastPosition_updated` 6. V1 逻辑通过兼容层保留 — ✅ fallback 分支完整 7. 有基础生命周期测试 — ✅ 6 个测试 ### 是否建议进入 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#112
No description provided.