为什么 iPhone 自带图书 App 不支持音量键翻页?我写了一个开源解决方案

简介: SwiftBook是一款开源iOS EPUB阅读器(MIT协议),专为“躺着看书党”优化:首创音量键翻页(KVO+静音音频黑科技)、CSS多栏分页、内置思源宋体,支持主题/字号/断点续读等。仅需Mac+Xcode即可安装体验。

问题的起点

如果你用过 iPhone 自带的"图书"App,或者微信读书、网易蜗牛等主流阅读器,你可能注意到一件事——

这些 App 没有一个能让你用手机侧边的音量键来翻页。

而这件事在 Android / 鸿蒙 / 其他系统上,几乎是阅读器的标配。

原因很简单:苹果没有开放音量键翻页的系统级 API。开发者没法像调用系统相机那样,直接唤起一个翻页行为。音量键的底层事件被系统拦截并用于调节音量,第三方 App 拿不到对应的回调。

这对大多数人来说不是什么大事。但如果你和我一样,喜欢窝在被窝里、侧躺着单手拿手机看书,每翻一页都要伸手指去戳屏幕右侧——体验确实很糟。

我做了什么

我花了一段时间,用 SwiftUI + WKWebView 实现了一款 iOS EPUB 阅读器:

SwiftBook

  • 完全开源(MIT)
  • 最小支持 iOS 16.0
  • UI 仿 Apple Books,交互逻辑尽量贴合原生体验

阅读器界面展示

阅读器界面展示

音量键翻页效果展示

核心特性

音量键翻页
通过 KVO 监听 AVAudioSession.outputVolume,结合静音音频循环播放来保持音频会话活跃,间接捕获音量键事件。同时用 MPVolumeView 抑制系统音量 HUD,并把音量复位到固定基准值,确保上下按键始终能触发变化量。

这个方法不算优雅(苹果没给正经 API),但经过真机实测,稳定可用。音量+ → 上一页,音量- → 下一页,系统音量不会被改变。

CSS 多栏分页
整本书的 spine 章节拼成单个 HTML,通过 CSS column-width 实现分页。翻页由 JS 控制 container.scrollLeft,而不是依赖 WKWebView 的原生滚动——这避免了手势冲突,也让翻页行为完全可预测。

中文字体
iOS 只内置了苹方一种中文字体。项目通过 Git LFS 打包了开源的思源宋体(Source Han Serif SC,OFL 协议),提供 Regular / SemiBold / Bold 三个字重。想用宋体读中文书的人不用自己折腾字体文件。

其他功能:四种阅读主题(白/暖黄/暗黑/护眼绿)、字号/行距/页边距/对齐自由调节、EPUB 目录跳转、断点续读。

目前的功能覆盖

功能 状态
EPUB 导入(文件 App → .epub)
分页翻页(点击/滑动/进度条)
音量键翻页(真机验证)
字号/字体/主题/行距/页边距
断点续读(进度持久化)
EPUB 内嵌图片/封面渲染
目录跳转 ✅(部分 EPUB 目录解析不完美)
书签/笔记/全文搜索/TTS 暂未实现

如何安装

项目目前没有上架 App Store(个人开发者年费 99 美元/年,暂时没付)。

安装方式:需要一台 Mac,将项目 Clone 到本地 → Xcode 打开工程 → 连接 iPhone → 选自己的 Apple ID 签名 → 运行到真机。

git clone git@github.com:KevinLeeeee323/SwiftBookApp.git
cd SwiftBookApp
open SwiftBook/SwiftBook.xcodeproj

中文字体使用了 Git LFS 管理(思源宋体约 75MB),如需该字体执行 git lfs pull;不需要可跳过,苹方仍可正常使用。

详细步骤见项目 README


写在最后

这是我第一次完整地从零写一个 iOS App 并开源出来。代码有不少可以优化的地方(WKWebView 与 SwiftUI 的桥接、CSS 分页在超大 EPUB 上的性能等),但核心体验已经可以日常使用了。

如果你也是"躺着看书党",或者对 iOS WebView 分页 / 音量键 Hack 的实现感兴趣,欢迎:

  • 去 GitHub 点个 ⭐️
  • Fork 或提 Issue
  • 推荐给同样受"戳屏幕翻页"困扰的朋友

🔗 GitHub:https://github.com/KevinLeeeee323/SwiftBookApp

相关文章
|
6天前
|
缓存 人工智能 安全
GPT-5.6 Terra与GPT-5.5性能实测:成本减半后的跑分对比与快速迁移指南
GPT-5.6 Terra 的定价为每百万 token 输入 2.50/输出 15。GPT-5.5 则是 5/ 30。Terra 的每一项费率,包括 $0.25/M 的缓存读取,都恰好是 GPT-5.5 的一半,因此在任何工作负载组合下,Terra 都固定 便宜 2.0x。以每天 10 万次请求、3K token 提示词计算,大约是 Terra 每天 2,000,GPT−5.5每天 4,000,即每月约 60,000对 120,000。问题在于:OpenAI 没有发布任何针对 Terra 的编码基准。那个著名的 91.9% Terminal-Bench 数字是 Sol 在 Ul
|
1天前
|
数据采集 机器学习/深度学习 人工智能
田间杂草定位与检测4200张YOLO智慧农业数据集分享
本数据集含4200张真实农田图像,YOLO格式,单类别(杂草)高质量标注,覆盖多作物、多光照、多生长阶段等复杂场景,专为智慧农业杂草检测与智能除草设备研发设计,支持YOLOv5/v8/v10等主流模型训练。
326 93
|
3天前
|
缓存 UED 开发者
Codex109天重置23次,明天还要再送一次
Codex近109天完成23次额度重置,7月14日将迎来第24次。Tibo高频响应用户反馈:优化GPT-5.6高消耗问题、补发失效福利、调整重置时间——形成“反馈→回应→修复→补偿”正向闭环,彰显以用户为中心的产品哲学。(239字)
496 11
|
6天前
|
人工智能 缓存 JSON
刚刚 GPT-5.6 发布,吊打 Claude 5 和 Grok 4.5?一手实测来啦!
GPT-5.6 刚发布,跑分号称超越 Fable 5,真的假的?附一手实测,让 3 个最强 AI 编程模型 GPT-5.6 Sol、Claude Fable 5、Grok 4.5 在 Cursor 里同时一把梭开发网页游戏,看看最新模型到底谁更能打。
335 0
|
6天前
|
存储 人工智能 JSON
Qwen 本地部署搭配 ComfyUI 生成 AI 漫剧完整实操指南(小白零基础可落地,零成本无限生成+角色一致性天花板)
2026全网最优本地漫剧流水线:零成本、离线运行、角色统一、低配(8G显卡)可跑。融合Qwen本地大模型+ComfyUI双引擎,实现剧本生成→分镜绘图→动态成片全自动,隐私安全、无审核限流,新手30分钟上手,日更无忧。(239字)