问题的起点
如果你用过 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
- 推荐给同样受"戳屏幕翻页"困扰的朋友