4.9 KiB
4.9 KiB
ReadViewSDK
这是什么
ReadViewSDK 是一个 iOS 阅读 SDK(RDReaderView),提供 EPUB/TXT 的打开、分页与阅读器 UI,并包含一个用于演示集成的 Demo 工程(ReadViewDemo)。当前项目面向 brownfield(已有代码),目标是对现有 reflowable EPUB 阅读内核做一次直接重构:在旧引擎基础上演进为参考微信读书(WXRead)的原生渲染方案,而不是保留并行的第二套原生引擎。
核心价值
稳定可用的 EPUB/TXT 阅读体验。
需求
已验证(现有能力)
- ✓ 支持通过
RDURLReaderController以 URL 打开.epub/.txt并进入阅读器(现有) - ✓ 具备
RDEPUBReaderController作为主阅读器控制器,负责加载/分页/状态管理(现有) - ✓ 具备
RDReaderView作为分页容器视图,支持翻页/滚动等呈现模式(现有) - ✓ reflowable EPUB 当前主路径已是基于
DTCoreText/NSAttributedString/ CoreText 的原生文本渲染与分页;但其样式分层、资源解析与分页策略仍较基础,本次将增强为更接近 WXRead 的实现(现有实现;本次将改造) - ✓ 固定版式(Fixed Layout)与交互式内容存在
WKWebView相关能力与桥接(现有) - ✓ TXT 通过
RDPlainTextBookBuilder/RDEPUBTextBook路径进入同一阅读器 UX(现有) - ✓ 默认使用
UserDefaults进行部分阅读器状态/设置持久化(现有)
进行中(本次范围)
- 将 reflowable EPUB 的现有旧引擎直接重构为参考
Doc/WXRead/的“微信读书(WXRead)原生渲染方案”,覆盖 CSS 分层、自定义 DTCoreText 属性体系、页面级元数据、复杂分页与 reader 集成能力,并在 SDK 内稳定落地且可回归验证
不做(明确排除)
- Fixed Layout EPUB:继续使用
WKWebView,不切换到 WXRead 渲染方式 - 交互式 EPUB(含 JS / 音视频 / 表单 / iframe / 外链 / 脚本桥接等):继续使用
WKWebView,不切换到 WXRead 渲染方式 - 直接拷贝使用微信读书私有 JS/CSS/私有实现代码:不做
- 同时保留两套 reflowable 原生引擎:不做
背景与上下文
- 仓库形态:iOS SDK + Demo App;Demo 通过 CocoaPods 以本地
:path引入 SDK。 - 当前分层:
EPUBCore(解析/分页/状态)、EPUBUI(阅读器 UX)、EPUBTextRendering(TXT/TextBook / reflowable 原生文本渲染)、以及LegacyRDReaderController(历史实现并存)。 - WXRead 参考资料位于
Doc/WXRead/,包含对微信读书 EPUB 阅读器的逆向分析文档与相关符号/源码片段。 - 当前
.textReflowable主路径已基于DTCoreText/NSAttributedString/ CoreText 分页,但分页能力、页面语义、自定义属性体系与复杂块元素处理仍远弱于 WXRead。
约束
- 平台:iOS 15+(Podspec 声明 iOS 15.0;工程中常见 15.6)— 现有基线
- 语言与风格:代码标识符保持英文;文档/计划使用中文(见
CONTEXT.md)— 项目约束 - 依赖管理:CocoaPods 为主(
RDReaderView.podspec、Podfile、ReadViewDemo/Podfile)— 现状约束 - 引擎策略:必须基于现有旧引擎直接演进,不新增并行原生引擎 — 本次关键约束
- 范围控制:仅重构 reflowable EPUB 原生渲染内核;Fixed Layout 与交互式内容保持
WKWebView— 本次目标边界 - 兼容性:阅读位置映射、高亮/选区、搜索结果定位、字号/行高/主题切换后的重新分页必须继续可用 — 核心功能约束
- 稳定性优先:任何改造需以“可回归验证、不破坏现有打开/阅读主流程”为前提 — 核心价值驱动
关键决策
| 决策 | 原因 | 结果 |
|---|---|---|
| reflowable EPUB 旧引擎直接重构为 WXRead 风格原生渲染 | 需要页面级排版能力,而不是继续在轻量 renderer 外壳上打补丁 | — Pending |
Fixed Layout 与交互式 EPUB 继续使用 WKWebView |
降低风险与范围,避免破坏既有能力 | — Pending |
| 不保留并行 reflowable 原生引擎 | 避免双引擎长期维护成本,把演进压力集中在现有主路径上 | — Pending |
演进
本文件会在阶段切换与里程碑完成时持续演进。
每个 Phase 完成后(通过 $gsd-transition):
- 有需求被证伪 → 移到“不做”并说明原因
- 有需求被验证 → 移到“已验证”并记录来源 Phase
- 出现新需求 → 加到“进行中”
- 产生关键决策 → 追加到“关键决策”
- “这是什么”是否仍准确 → 如有漂移及时更新
每个 Milestone 完成后(通过 $gsd-complete-milestone):
- 全面复查所有章节
- 核心价值是否仍是最高优先级
- “不做”是否需要调整边界与理由
- 更新背景与上下文到当前真实状态
Last updated: 2026-05-21 after initialization