如果你用过 iPhone 自带的"图书"App,或者微信读书、网易蜗牛等主流阅读器,你可能注意到一件事——
**这些 App 没有一个能让你用手机侧边的音量键来翻页。**
而这件事在 Android / 鸿蒙 / 其他系统上,几乎是阅读器的标配。
原因很简单:苹果没有开放音量键翻页的系统级 API。开发者没法像调用系统相机那样,直接唤起一个翻页行为。音量键的底层事件被系统拦截并用于调节音量,第三方 App 拿不到对应的回调。
这对大多数人来说不是什么大事。但如果你和我一样,喜欢窝在被窝里、侧躺着单手拿手机看书,每翻一页都要伸手指去戳屏幕右侧——体验确实很糟。
我花了一段时间,用 SwiftUI + WKWebView 实现了一款 iOS EPUB 阅读器:



通过 KVO 监听 AVAudioSession.outputVolume,结合静音音频循环播放来保持音频会话活跃,间接捕获音量键事件。同时用 MPVolumeView 抑制系统音量 HUD,并把音量复位到固定基准值,确保上下按键始终能触发变化量。
这个方法不算优雅(苹果没给正经 API),但经过真机实测,稳定可用。音量+ → 上一页,音量- → 下一页,系统音量不会被改变。
整本书的 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 的实现感兴趣,欢迎:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。