IOS-INFO-006:ReadingRuntimeSessionManager #114

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

目标

实现 iOS 侧阅读会话管理器,统一管理当前阅读资料的 session 生命周期、Runtime Adapter、Heartbeat、position、close。

职责

  • open session
  • hold current session
  • prevent duplicate open
  • record position
  • heartbeat
  • pause / resume
  • close session
  • flush events
  • handle errors

状态建议

  • idle
  • opening
  • active
  • paused
  • closing
  • closed
  • failed

异常 session 恢复

SessionManager 必须支持异常 session 恢复场景:

  1. App crash 后重新启动,不复用旧 active session。
  2. Runtime buffer 存在 stale events 时,等待启动恢复流程处理。
  3. 未 close session 应标记 interrupted 或安全废弃。
  4. closeSession 必须幂等。
  5. openSession 前必须确认当前没有 active session,或先处理旧 session。

验收标准

  1. 可打开 session。
  2. 同一 context 不重复打开。
  3. 可记录当前 sessionId。
  4. 可 close 当前 session。
  5. close 幂等。
  6. 支持 pause / resume。
  7. Runtime error 不导致页面崩溃。
  8. 有状态机测试。
## 目标 实现 iOS 侧阅读会话管理器,统一管理当前阅读资料的 session 生命周期、Runtime Adapter、Heartbeat、position、close。 ## 职责 - open session - hold current session - prevent duplicate open - record position - heartbeat - pause / resume - close session - flush events - handle errors ## 状态建议 - idle - opening - active - paused - closing - closed - failed ## 异常 session 恢复 SessionManager 必须支持异常 session 恢复场景: 1. App crash 后重新启动,不复用旧 active session。 2. Runtime buffer 存在 stale events 时,等待启动恢复流程处理。 3. 未 close session 应标记 interrupted 或安全废弃。 4. closeSession 必须幂等。 5. openSession 前必须确认当前没有 active session,或先处理旧 session。 ## 验收标准 1. 可打开 session。 2. 同一 context 不重复打开。 3. 可记录当前 sessionId。 4. 可 close 当前 session。 5. close 幂等。 6. 支持 pause / resume。 7. Runtime error 不导致页面崩溃。 8. 有状态机测试。
wangdl added this to the M-IOS-INFO:学习信息采集、上传、继续学习与基础分析闭环 milestone 2026-06-10 21:28:09 +08:00
wangdl added the
blocked-by:doc-runtime
label 2026-06-10 22:15:57 +08:00
Author
Owner

开发完成评论

完成内容

  • 状态机扩展:idle → opening → active → closing → closed + paused + failed(Error)
    • opening 过渡态:startSession 成功前
    • closing 过渡态:closeSession 期间
    • failed(Error):openMaterial 中 adapter 抛错时设置
    • Equatable conformance(用于测试断言)
  • openMaterial 改为 do/catch:失败时 state → .failed(error) + 清理 activeSessionId/context
  • closeMaterial 幂等改进:
    • guard 只接受 .active.paused 状态
    • 已是 .closed/.idle → 直接 return
    • 异常状态(如 .failed)→ reset 为 .idle
  • 新建 AIStudyAppTests/SessionManagerTests.swift(9 个测试):
    • 初始状态 idle、重复 open 抛错、close 幂等
    • pause/resume guard、sessionId nil 验证
    • markAsRead guard、lastPosition 初始 nil
    • Noop adapter 失败状态测试

修改文件

  • Features/MaterialReader/ReadingRuntimeSessionManager.swift:+25 行(状态机扩展 + 幂等 close + do/catch)
  • AIStudyAppTests/SessionManagerTests.swift:新建

代码证据

  • ReadingRuntimeSessionManager.swift:5-20:状态机 7 状态 + Equatable
  • ReadingRuntimeSessionManager.swift:60-63state = .opening 过渡态
  • ReadingRuntimeSessionManager.swift:78-82:catch → .failed(error) + 清理
  • ReadingRuntimeSessionManager.swift:95-100:close 幂等 guard

验收标准逐项

  1. 可打开 session — openMaterial()
  2. 同一 context 不重复打开 — guard state == .idle || .closed
  3. 可记录当前 sessionId — activeSessionId 属性
  4. 可 close 当前 session — closeMaterial()
  5. close 幂等 — test_close_is_idempotent
  6. 支持 pause/resume — pause()/resume()
  7. Runtime error 不导致页面崩溃 — try? + .failed(error) 状态
  8. 有状态机测试 — 9 个测试

是否建议进入 Review

  • 是(需 Xcode 编译验证)
## 开发完成评论 ### 完成内容 - 状态机扩展:`idle → opening → active → closing → closed` + `paused` + `failed(Error)` - `opening` 过渡态:startSession 成功前 - `closing` 过渡态:closeSession 期间 - `failed(Error)`:openMaterial 中 adapter 抛错时设置 - `Equatable` conformance(用于测试断言) - `openMaterial` 改为 do/catch:失败时 state → `.failed(error)` + 清理 activeSessionId/context - `closeMaterial` 幂等改进: - `guard` 只接受 `.active` 或 `.paused` 状态 - 已是 `.closed`/`.idle` → 直接 return - 异常状态(如 `.failed`)→ reset 为 `.idle` - 新建 `AIStudyAppTests/SessionManagerTests.swift`(9 个测试): - 初始状态 idle、重复 open 抛错、close 幂等 - pause/resume guard、sessionId nil 验证 - markAsRead guard、lastPosition 初始 nil - Noop adapter 失败状态测试 ### 修改文件 - `Features/MaterialReader/ReadingRuntimeSessionManager.swift`:+25 行(状态机扩展 + 幂等 close + do/catch) - `AIStudyAppTests/SessionManagerTests.swift`:新建 ### 代码证据 - `ReadingRuntimeSessionManager.swift:5-20`:状态机 7 状态 + Equatable - `ReadingRuntimeSessionManager.swift:60-63`:`state = .opening` 过渡态 - `ReadingRuntimeSessionManager.swift:78-82`:catch → `.failed(error)` + 清理 - `ReadingRuntimeSessionManager.swift:95-100`:close 幂等 guard ### 验收标准逐项 1. 可打开 session — ✅ `openMaterial()` 2. 同一 context 不重复打开 — ✅ `guard state == .idle || .closed` 3. 可记录当前 sessionId — ✅ `activeSessionId` 属性 4. 可 close 当前 session — ✅ `closeMaterial()` 5. close 幂等 — ✅ `test_close_is_idempotent` 6. 支持 pause/resume — ✅ `pause()`/`resume()` 7. Runtime error 不导致页面崩溃 — ✅ `try?` + `.failed(error)` 状态 8. 有状态机测试 — ✅ 9 个测试 ### 是否建议进入 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#114
No description provided.