IOS-INFO-010:MarkedAsRead Runtime 事件接入 #118

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

目标

将 iOS 的"标记已读"行为接入 Rust Runtime V2,生成 marked_as_read 事件。

触发场景

  • 用户点击标记已读
  • 阅读进度达到完成阈值并用户确认
  • 资料详情页标记完成

规则

  1. marked_as_read activeSecondsDelta = 0。
  2. 必须附带当前 position。
  3. 不应重复生成过多 marked_as_read。
  4. UI 状态和 Runtime 事件都要更新。
  5. 如果 Runtime 失败,UI 需有 fallback 状态。

验收标准

  1. 点击标记已读会调用 recordMarkedAsRead。
  2. 事件进入 Rust buffer。
  3. export 后可映射为 UploadItem。
  4. UI 状态更新。
  5. 重复点击有防抖或幂等。
  6. 有测试。
## 目标 将 iOS 的"标记已读"行为接入 Rust Runtime V2,生成 marked_as_read 事件。 ## 触发场景 - 用户点击标记已读 - 阅读进度达到完成阈值并用户确认 - 资料详情页标记完成 ## 规则 1. marked_as_read activeSecondsDelta = 0。 2. 必须附带当前 position。 3. 不应重复生成过多 marked_as_read。 4. UI 状态和 Runtime 事件都要更新。 5. 如果 Runtime 失败,UI 需有 fallback 状态。 ## 验收标准 1. 点击标记已读会调用 recordMarkedAsRead。 2. 事件进入 Rust buffer。 3. export 后可映射为 UploadItem。 4. UI 状态更新。 5. 重复点击有防抖或幂等。 6. 有测试。
wangdl added this to the M-IOS-INFO:学习信息采集、上传、继续学习与基础分析闭环 milestone 2026-06-10 21:28:11 +08:00
Author
Owner

开发完成评论

完成内容

  • MarkedAsRead 已在多个层次完整实现:
    • UI 层:MaterialReaderView.markAsRead() + isMarkedRead 幂等 guard + V2/V1 分支
    • Session 层:SessionManager.markAsRead()adapter.pushMarkedAsRead()
    • V1 fallback:ReadingEventCollector.markAsRead()pushReadingEvent(.markedAsRead)
    • Mapper 层:ReadingEventMapper.apiEventType(.markedAsRead) → "marked_as_read"
  • 新建 AIStudyAppTests/MarkedAsReadTests.swift(6 个测试):
    • idle 状态不崩溃
    • open 后标记不崩溃
    • 5 次重复标记幂等
    • 标记后 close 不崩溃
    • V1 collector 产生 markedAsRead 事件
    • mapper 事件类型映射"marked_as_read"

修改文件

  • AIStudyAppTests/MarkedAsReadTests.swift:新建

验收标准逐项

  1. 点击标记已读会调用 recordMarkedAsRead — SessionManager.markAsRead()
  2. 事件进入 Rust buffer — adapter.pushMarkedAsRead()
  3. export 后可映射为 UploadItem — apiEventType(.markedAsRead) → "marked_as_read"
  4. UI 状态更新 — isMarkedRead = true(optimistic)
  5. 重复点击有防抖或幂等 — guard !isMarkedRead + 5x 重复测试
  6. 有测试 — 6 个测试

是否建议进入 Review

  • 是(需 Xcode 编译验证)
## 开发完成评论 ### 完成内容 - MarkedAsRead 已在多个层次完整实现: - UI 层:`MaterialReaderView.markAsRead()` + `isMarkedRead` 幂等 guard + V2/V1 分支 - Session 层:`SessionManager.markAsRead()` → `adapter.pushMarkedAsRead()` - V1 fallback:`ReadingEventCollector.markAsRead()` → `pushReadingEvent(.markedAsRead)` - Mapper 层:`ReadingEventMapper.apiEventType(.markedAsRead) → "marked_as_read"` - 新建 `AIStudyAppTests/MarkedAsReadTests.swift`(6 个测试): - idle 状态不崩溃 - open 后标记不崩溃 - 5 次重复标记幂等 - 标记后 close 不崩溃 - V1 collector 产生 markedAsRead 事件 - mapper 事件类型映射"marked_as_read" ### 修改文件 - `AIStudyAppTests/MarkedAsReadTests.swift`:新建 ### 验收标准逐项 1. 点击标记已读会调用 recordMarkedAsRead — ✅ `SessionManager.markAsRead()` 2. 事件进入 Rust buffer — ✅ `adapter.pushMarkedAsRead()` 3. export 后可映射为 UploadItem — ✅ `apiEventType(.markedAsRead) → "marked_as_read"` 4. UI 状态更新 — ✅ `isMarkedRead = true`(optimistic) 5. 重复点击有防抖或幂等 — ✅ `guard !isMarkedRead` + 5x 重复测试 6. 有测试 — ✅ 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#118
No description provided.