IOS-DOC-004 实现继续阅读/上次位置恢复 #21

Open
opened 2026-05-30 19:56:07 +08:00 by wangdl · 1 comment
Owner

首页继续上次学习需要知道用户上次读到哪里。

目标:支持资料阅读恢复。

支持:Markdown 恢复到 blockId 或 scrollProgress、PDF 恢复到 pageNumber、TXT 恢复到 lineNumber 或 scrollProgress、图片恢复缩放状态可后移

验收标准:退出资料后再次进入能恢复上次位置、没有历史位置时从顶部开始、恢复失败时不崩溃、首页可读取最近阅读资料

首页继续上次学习需要知道用户上次读到哪里。 目标:支持资料阅读恢复。 支持:Markdown 恢复到 blockId 或 scrollProgress、PDF 恢复到 pageNumber、TXT 恢复到 lineNumber 或 scrollProgress、图片恢复缩放状态可后移 验收标准:退出资料后再次进入能恢复上次位置、没有历史位置时从顶部开始、恢复失败时不崩溃、首页可读取最近阅读资料
wangdl added this to the M3:iOS 主 App 资料阅读闭环 milestone 2026-05-30 19:56:07 +08:00
wangdl added the
priority:p0
type:implementation
area:ios
area:progress
labels 2026-05-30 19:56:07 +08:00
Author
Owner

实现完成 (2026-06-02)

新增文件

Features/MaterialReader/ReadingPositionStore.swift (~90 行)

单例 ReadingPositionStore,UserDefaults 持久化:

  • save(materialId:position:) — 退出时保存,支持全部 6 种 ReadingPosition 变体
  • load(materialId:) → ReadingPosition? — 进入时恢复
  • remove(materialId:) — 资料删除时清除
  • hasPosition(materialId:) → Bool — 首页判断"继续阅读"入口

修改文件

ReadingEventCollector.swift — 暴露 lastPosition 属性供 save-on-exit

MaterialReaderView.swift — 位置恢复流程:

  • .onAppearhasRestoredPosition = false(重置状态)
  • onChange(of: loadingState) → 加载完成后调 restorePosition()
  • restorePosition() → 从 Store 加载位置 → 设置 restoreBlockId
  • ScrollViewReader.onChange(of: restoreBlockId)scrollTo(id:anchor: .top) 滚动到目标 block(0.3s 延迟确保布局完成)
  • .onDisappear → 保存 collector.lastPosition → Store

支持格式

  • Markdown:恢复到 blockId → ScrollViewReader 精准滚动
  • TXT:恢复到 lineNumber → 映射到对应 block → 滚动
  • PDF/Image/EPUB:位置已保存但恢复需要平台能力(后续补充)
## 实现完成 (2026-06-02) ### 新增文件 **`Features/MaterialReader/ReadingPositionStore.swift`** (~90 行) 单例 `ReadingPositionStore`,UserDefaults 持久化: - `save(materialId:position:)` — 退出时保存,支持全部 6 种 ReadingPosition 变体 - `load(materialId:) → ReadingPosition?` — 进入时恢复 - `remove(materialId:)` — 资料删除时清除 - `hasPosition(materialId:) → Bool` — 首页判断"继续阅读"入口 ### 修改文件 **`ReadingEventCollector.swift`** — 暴露 `lastPosition` 属性供 save-on-exit **`MaterialReaderView.swift`** — 位置恢复流程: - `.onAppear` → `hasRestoredPosition = false`(重置状态) - `onChange(of: loadingState)` → 加载完成后调 `restorePosition()` - `restorePosition()` → 从 Store 加载位置 → 设置 `restoreBlockId` - `ScrollViewReader.onChange(of: restoreBlockId)` → `scrollTo(id:anchor: .top)` 滚动到目标 block(0.3s 延迟确保布局完成) - `.onDisappear` → 保存 `collector.lastPosition` → Store ### 支持格式 - Markdown:恢复到 blockId → ScrollViewReader 精准滚动 - TXT:恢复到 lineNumber → 映射到对应 block → 滚动 - PDF/Image/EPUB:位置已保存但恢复需要平台能力(后续补充)
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: wangdl/zhixi-document-runtime#21
No description provided.