IOS-INFO-008 P0 | Heartbeat Timer / pause / resume 【审计: Timer已有,需接V2】 #73

Closed
opened 2026-06-07 11:55:22 +08:00 by wangdl · 1 comment
Owner

审查

15s Timer 已存在。需接入新 session manager。

页面可见→每15s heartbeat。后台→pause+flush。前台→resume。关闭→close。无 retain cycle。

## 审查 15s Timer 已存在。需接入新 session manager。 页面可见→每15s heartbeat。后台→pause+flush。前台→resume。关闭→close。无 retain cycle。
wangdl added this to the M-IOS-INFO:学习信息采集、上传、继续学习与基础分析闭环 milestone 2026-06-07 11:55:22 +08:00
wangdl changed title from IOS-INFO-007 P0 | Heartbeat Timer / pause / resume / close to IOS-INFO-008 P0 | Heartbeat Timer / pause / resume 【审计: Timer已有,需接V2】 2026-06-07 12:10:07 +08:00
Author
Owner

完成报告(已在 #71 实现)

ReadingRuntimeSessionManager 已包含:

1. Heartbeat Timer

private func startHeartbeat(interval: TimeInterval = 15) {
    heartbeatTimer = Timer.scheduledTimer(withTimeInterval: interval, repeats: true) { [weak self] _ in
        Task { @MainActor [weak self] in
            guard let self, self.state == .active,   // 防 close 后 heartbeat
                  let sid = self.activeSessionId, let ctx = self.activeContext else { return }
            _ = try? self.adapter.pushHeartbeat(
                sessionId: sid, materialId: ctx.materialId,
                delta: UInt32(interval), position: self.lastPosition,
                timestampMs: self.nowMs()
            )
        }
    }
}

2. Pause/Resume

func pause()   stopHeartbeat() + flushPosition() + adapter.pauseSession()
func resume()  adapter.resumeSession() + startHeartbeat()

3. App 生命周期(由 #79 App 前后台 flush/pause/resume 调用)

  • appDidEnterBackground → sessionManager.pause() + export+flush
  • appWillEnterForeground → sessionManager.resume() + reloadStale

代码位置: ReadingRuntimeSessionManager.swift:100-126

## 完成报告(已在 #71 实现) `ReadingRuntimeSessionManager` 已包含: **1. Heartbeat Timer** ```swift private func startHeartbeat(interval: TimeInterval = 15) { heartbeatTimer = Timer.scheduledTimer(withTimeInterval: interval, repeats: true) { [weak self] _ in Task { @MainActor [weak self] in guard let self, self.state == .active, // 防 close 后 heartbeat let sid = self.activeSessionId, let ctx = self.activeContext else { return } _ = try? self.adapter.pushHeartbeat( sessionId: sid, materialId: ctx.materialId, delta: UInt32(interval), position: self.lastPosition, timestampMs: self.nowMs() ) } } } ``` **2. Pause/Resume** ```swift func pause() → stopHeartbeat() + flushPosition() + adapter.pauseSession() func resume() → adapter.resumeSession() + startHeartbeat() ``` **3. App 生命周期**(由 #79 App 前后台 flush/pause/resume 调用) - `appDidEnterBackground` → sessionManager.pause() + export+flush - `appWillEnterForeground` → sessionManager.resume() + reloadStale **代码位置:** `ReadingRuntimeSessionManager.swift:100-126`
Sign in to join this conversation.
No description provided.