[分享创造] 分享一个 iOS 阅读记录工具:微信读书同步、本地图书管理员和多模型切换

·

做了一个 iOS 阅读记录工具,叫 myLibrarian 。

testflight 测试连接: https://testflight.apple.com/join/CrsdBU97

起因是我长期用微信读书看书、划线、写想法,但时间久了以后,很多阅读痕迹很难再被重新利用。想找某句话、某本书的想法、某一年读过什么,经常要翻很久。

所以我做了一个偏个人资料库的 App:把微信读书里的阅读痕迹同步回来,再和本地阅读记录、金句、小组件、图书管理员放在一起。

目前大概做到了这些:

– SwiftUI + SwiftData 原生 iOS App
– CloudKit 做多设备同步
– 支持从微信读书同步书架、最近阅读、阅读进度、划线和想法
– 本地保存书籍、阅读轮次、摘录、评分、阅读状态等数据
– 支持本地电子书导入和阅读记录关联
– 从摘录中筛选比较值得收藏的金句
– iOS 小组件轮询展示收藏金句
– 内置“图书管理员”,可以用自然语言查询自己的阅读记录、书籍、摘录和微信读书资料
– 支持配置多个 AI 服务和模型,可以随时切换使用
– AI 功能优先支持 Gemini API ,同时也兼容 OpenAI 风格接口

微信读书同步不是官方接口产品,需要用户自己填写微信读书 API Key 。AI 功能也不是绑定某一家服务,目前优先支持 Gemini API ,也可以配置 OpenAI 兼容接口。图书管理员和金句扫描可以分别设置默认模型,避免所有功能都挤在一个模型配置里。

图书管理员这块目前是我比较想打磨的部分。它不是简单把整个书库塞进 prompt 里聊天,而是做成了一个本地资料查询入口:

– App 会把 SwiftData 里的 Book 、ReadingSession 、Quote 等数据整理成结构化阅读工作区
– 模型需要数据时,先规划要查什么,再通过工具读取本地工作区
– 支持按书名、作者、年份、阅读状态、评分、摘录内容等条件查
– 支持语义检索,比如“我读过哪些关于孤独/自由/死亡的句子”
– 支持查看本地记忆,比如用户希望它记住自己的回答偏好或阅读偏好
– 明确进入 `/微信读书` 模式时,可以读取微信读书书架、笔记、进度和统计
– 工具调用过程会展示给用户,避免黑盒式回答
– 当前对话使用哪个模型会在聊天页底部显示,切换模型后下一条消息就会使用新模型

我想要的效果不是“AI 随便评价我的书”,而是更像一个能翻自己书桌的助手。比如可以问:

– 我去年读完了哪些书?
– 帮我找一下我摘录过的关于自由的句子
– 我最近微信读书读到哪里了?
– 哪些书我评分很高但没有写评价?
– 总结一下我最近读书偏好的变化

技术上遇到的一些点:

1. SwiftData + CloudKit
CloudKit 对模型默认值和 Optional 关系要求比较严格,这块踩了不少坑。

2. 微信读书同步
同步时先把远端结果整理成临时快照,全部请求完成后再一次性写入 SwiftData ,减少同步中 UI 反复重绘。

3. 本地资料工具层
图书管理员不会默认拿到完整书库,而是通过 `inspect_workspace`、`read_workspace`、`search_workspace`、`semantic_search` 等工具按需读取。

4. 多模型配置
AI 服务配置是独立的,目前优先支持 Gemini API ,也兼容 OpenAI 风格接口。图书管理员和金句扫描可以分别指定默认模型,也可以在聊天时切换当前模型。这样方便对比不同模型在中文摘录理解、总结、检索跟随上的差异。

5. 金句和去重
微信读书划线、本地电子书划线、手动摘录都会进入本地摘录体系,后续再做金句提取、收藏和小组件展示。

6. Widget
WidgetKit + App Group 保存金句快照,小组件可以轮询展示收藏金句,也支持手动刷新和收藏切换。

现在还在测试阶段,还没有正式上架。想听听大家对这个方向的看法:

– 阅读记录类 App 里加一个本地图书管理员,有没有实际价值?
– 你们会希望它更偏统计查询,还是偏摘录/回顾/总结?
– 这种“工具读取本地资料”的 AI 交互,是否比直接聊天更可信?
– 多模型切换对这类个人资料工具是否有必要?
– Gemini API 在中文阅读资料整理上,大家有没有比较推荐的模型或参数?
– 微信读书同步和本地阅读档案结合,大家会不会有隐私顾虑?
– SwiftData + CloudKit + WidgetKit 这套组合还有什么坑?

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *