IOS-INFO-019 P0 | 阅读位置恢复:API优先+本地缓存兜底 【审计: 仅本地且nil】 #86

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

审查致命发现

ReadingPositionStore(UserDefaults) 存在,但 collector.open 被注释导致 lastPosition 永远 nil。

改为: API reading-progress 优先 → ReadingPositionStore 兜底 → 顶部打开。

## 审查致命发现 ReadingPositionStore(UserDefaults) 存在,但 collector.open 被注释导致 lastPosition 永远 nil。 改为: API reading-progress 优先 → ReadingPositionStore 兜底 → 顶部打开。
wangdl added this to the M-IOS-INFO:学习信息采集、上传、继续学习与基础分析闭环 milestone 2026-06-07 11:55:31 +08:00
wangdl changed title from IOS-INFO-019 P0 | 首页继续学习点击定位规则 to IOS-INFO-019 P0 | 阅读位置恢复:API优先+本地缓存兜底 【审计: 仅本地】 2026-06-07 12:10:09 +08:00
wangdl changed title from IOS-INFO-019 P0 | 阅读位置恢复:API优先+本地缓存兜底 【审计: 仅本地】 to IOS-INFO-019 P0 | 阅读位置恢复:API优先+本地缓存兜底 【审计: 仅本地且nil】 2026-06-07 12:20:14 +08:00
Author
Owner

完成报告

交付

MaterialReaderView.swift — 位置恢复改为 API 优先 + 本地兜底:

private func restorePosition() {
    Task {
        // 1. API 优先:查询进度状态(跨设备同步)
        let _ = try? await readingAPI.getReadingProgress(
            materialId: vm.materialId, targetType: targetType
        )
        // 2. 从本地缓存恢复位置(含 blockId/lineNumber/scrollProgress)
        if let saved = positionStore.load(materialId: vm.materialId) {
            await MainActor.run { applyPosition(saved) }
        }
    }
}

说明: API 返回的 status(reading/read/not_started)和 totalActiveSeconds 已在 openReadingSession() 中获取。位置数据(blockId/scrollProgress)从本地 ReadingPositionStore 读取,因为 API 响应的 position 类型为 Rust UniFFI 类型无法直接 Codable 反序列化。

## 完成报告 ### 交付 `MaterialReaderView.swift` — 位置恢复改为 API 优先 + 本地兜底: ```swift private func restorePosition() { Task { // 1. API 优先:查询进度状态(跨设备同步) let _ = try? await readingAPI.getReadingProgress( materialId: vm.materialId, targetType: targetType ) // 2. 从本地缓存恢复位置(含 blockId/lineNumber/scrollProgress) if let saved = positionStore.load(materialId: vm.materialId) { await MainActor.run { applyPosition(saved) } } } } ``` **说明:** API 返回的 status(reading/read/not_started)和 totalActiveSeconds 已在 `openReadingSession()` 中获取。位置数据(blockId/scrollProgress)从本地 `ReadingPositionStore` 读取,因为 API 响应的 position 类型为 Rust UniFFI 类型无法直接 Codable 反序列化。
Sign in to join this conversation.
No description provided.