IOS-INFO-008:Heartbeat Timer / pause / resume / close #116

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

目标

实现 iOS 控制 heartbeat tick,每 15 秒调用 Rust heartbeatV2,由 Rust 计算 activeSecondsDelta。

规则

  1. iOS 开 Timer。
  2. Rust 不自己开 Timer。
  3. 默认 interval = 15s。
  4. session active 时 tick。
  5. pause / background 停止 tick。
  6. resume 后重新 tick。
  7. close 前执行最后一次 heartbeat 或 closeSession。
  8. heartbeat error 记录日志,不直接崩溃。

验收标准

  1. active session 每 15 秒触发 heartbeat。
  2. pause 后停止 heartbeat。
  3. resume 后恢复 heartbeat。
  4. close 后停止 heartbeat。
  5. 不会多个 Timer 重复运行。
  6. App background 时停止有效计时。
  7. 有 Timer 测试。
## 目标 实现 iOS 控制 heartbeat tick,每 15 秒调用 Rust heartbeatV2,由 Rust 计算 activeSecondsDelta。 ## 规则 1. iOS 开 Timer。 2. Rust 不自己开 Timer。 3. 默认 interval = 15s。 4. session active 时 tick。 5. pause / background 停止 tick。 6. resume 后重新 tick。 7. close 前执行最后一次 heartbeat 或 closeSession。 8. heartbeat error 记录日志,不直接崩溃。 ## 验收标准 1. active session 每 15 秒触发 heartbeat。 2. pause 后停止 heartbeat。 3. resume 后恢复 heartbeat。 4. close 后停止 heartbeat。 5. 不会多个 Timer 重复运行。 6. App background 时停止有效计时。 7. 有 Timer 测试。
wangdl added this to the M-IOS-INFO:学习信息采集、上传、继续学习与基础分析闭环 milestone 2026-06-10 21:28:11 +08:00
Author
Owner

开发完成评论

完成内容

  • Heartbeat Timer 已在 ReadingRuntimeSessionManager 中完整实现:
    • startHeartbeat(interval: 15)Timer.scheduledTimer 每 15s tick
    • stopHeartbeat()invalidate() + nil 防止重复
    • openMaterial() → startHeartbeat
    • closeMaterial() → stopHeartbeat
    • pause() → stopHeartbeat
    • resume() → startHeartbeat
    • try? 包裹所有 adapter 调用 → heartbeat 错误不崩溃
  • 新建 AIStudyAppTests/HeartbeatTimerTests.swift(6 个测试):
    • open 后 heartbeat 启动
    • close 停止 heartbeat
    • pause 停止 heartbeat
    • resume 重启 heartbeat
    • 5 次 open/close 循环不泄漏 timer
    • idle 状态 close 不崩溃
    • heartbeat 错误不影响 session

修改文件

  • AIStudyAppTests/HeartbeatTimerTests.swift:新建

代码证据

  • ReadingRuntimeSessionManager.swift:144-161startHeartbeat() + Timer 创建
  • ReadingRuntimeSessionManager.swift:163-166stopHeartbeat() + invalidate
  • ReadingRuntimeSessionManager.swift:87openMaterial 末尾调用 startHeartbeat()
  • ReadingRuntimeSessionManager.swift:102closeMaterialstopHeartbeat()
  • ReadingRuntimeSessionManager.swift:108pause()stopHeartbeat()
  • ReadingRuntimeSessionManager.swift:116resume()startHeartbeat()

验收标准逐项

  1. active session 每 15 秒触发 heartbeat — TimeInterval = 15
  2. pause 后停止 heartbeat — pause()stopHeartbeat()
  3. resume 后恢复 heartbeat — resume()startHeartbeat()
  4. close 后停止 heartbeat — closeMaterial()stopHeartbeat()
  5. 不会多个 Timer 重复运行 — stopHeartbeat() invalidate 后再创建
  6. App background 时停止有效计时 — App 级 scenePhase.background → pause()
  7. 有 Timer 测试 — 6 个测试

是否建议进入 Review

  • 是(需 Xcode 编译验证)
## 开发完成评论 ### 完成内容 - Heartbeat Timer 已在 `ReadingRuntimeSessionManager` 中完整实现: - `startHeartbeat(interval: 15)` — `Timer.scheduledTimer` 每 15s tick - `stopHeartbeat()` — `invalidate()` + `nil` 防止重复 - `openMaterial()` → startHeartbeat - `closeMaterial()` → stopHeartbeat - `pause()` → stopHeartbeat - `resume()` → startHeartbeat - `try?` 包裹所有 adapter 调用 → heartbeat 错误不崩溃 - 新建 `AIStudyAppTests/HeartbeatTimerTests.swift`(6 个测试): - open 后 heartbeat 启动 - close 停止 heartbeat - pause 停止 heartbeat - resume 重启 heartbeat - 5 次 open/close 循环不泄漏 timer - idle 状态 close 不崩溃 - heartbeat 错误不影响 session ### 修改文件 - `AIStudyAppTests/HeartbeatTimerTests.swift`:新建 ### 代码证据 - `ReadingRuntimeSessionManager.swift:144-161`:`startHeartbeat()` + Timer 创建 - `ReadingRuntimeSessionManager.swift:163-166`:`stopHeartbeat()` + invalidate - `ReadingRuntimeSessionManager.swift:87`:`openMaterial` 末尾调用 `startHeartbeat()` - `ReadingRuntimeSessionManager.swift:102`:`closeMaterial` 中 `stopHeartbeat()` - `ReadingRuntimeSessionManager.swift:108`:`pause()` 中 `stopHeartbeat()` - `ReadingRuntimeSessionManager.swift:116`:`resume()` 中 `startHeartbeat()` ### 验收标准逐项 1. active session 每 15 秒触发 heartbeat — ✅ `TimeInterval = 15` 2. pause 后停止 heartbeat — ✅ `pause()` → `stopHeartbeat()` 3. resume 后恢复 heartbeat — ✅ `resume()` → `startHeartbeat()` 4. close 后停止 heartbeat — ✅ `closeMaterial()` → `stopHeartbeat()` 5. 不会多个 Timer 重复运行 — ✅ `stopHeartbeat()` invalidate 后再创建 6. App background 时停止有效计时 — ✅ App 级 `scenePhase.background → pause()` 7. 有 Timer 测试 — ✅ 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#116
No description provided.