为什么 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 内嵌图片/封面渲染
目录跳转(href 匹配,章节准确)
脚注点击跳转 + 返回原文
阅读统计(时长/连续天数/目标/读完数)
书签/笔记/全文搜索/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

相关文章
|
23天前
|
人工智能 算法 测试技术
独家揭秘:拼多多测试团队如何用AI把回归时间从3天压到2小时
拼多多测试团队借AI重构回归流程:代码提交即启动智能分析,精准筛选高风险用例,将大促前回归从3天压缩至2小时内,告别通宵等待——瓶颈不在执行速度,而在决策智能。
|
23天前
|
域名解析 存储 弹性计算
海宝云-阿里云服务器续费太贵?这有一份不同机型降配与省钱方案的“榨干”测评!
本文由阿里云官方服务商海宝云撰写,直击云服务器续费痛点:新客低价、老客高价。详解三大省钱策略——“续费降配”“跨代降配”“数据迁移”,辅以节省计划、停机模式等隐藏技巧,并提醒缩容、IP变更、共享型风险等避坑要点,助你合法合规砍掉50%~80%续费成本。
|
23天前
|
Web App开发 数据采集 人工智能
|
23天前
|
人工智能 安全 测试技术
|
23天前
|
存储 监控 对象存储
基于YOLO11的道路积水视觉检测:从数据集构建到云上训练实践
本文介绍基于YOLO11的道路积水视觉检测实践,涵盖数据集构建(5275张图片、7155个标注框)、云上训练部署及工程化落地要点,适用于城市内涝预警与智慧交通场景,助力开发者快速实现鲁棒、可复现的积水识别系统。(239字)
基于YOLO11的道路积水视觉检测:从数据集构建到云上训练实践
|
23天前
|
人工智能 弹性计算 API
【AI 尝鲜实验室】上新 | New API:一个入口打通全网大模型的统一网关
New API 是 QuantumNous 开源的下一代大模型网关与 AI 资产管理系统(GitHub 42k+ Stars,AGPL-3.0 协议)。它将 OpenAI、Claude、Gemini、DeepSeek、通义 Qwen、Midjourney、Suno 等全网主流大模型聚合到一个统一的 OpenAI 兼容接口,内置多渠道分组、加权随机分发、失败自动重试、完整的用户/令牌/额度管理和在线充值能力。 本次实验通过阿里云计算巢一键部署 New API 到云端,几分钟即可拥有一套专属大模型网关。部署完成后你可以在后台集中管理所有模型渠道、给团队成员分发独立令牌和额度,并通过格式互转让 Cl
321 2
|
23天前
|
SQL 存储 关系型数据库
【SQLite】SQLite3下载、安装、数据库操作保姆级教程(2026最新,超详细)
SQLite 是全球最流行的嵌入式关系数据库引擎,无需安装服务、零配置、单文件(.db)存储,直接以 C 库形式嵌入应用。广泛用于移动App、桌面软件、IoT设备及开发测试,支持标准SQL与ACID事务,跨平台、轻量高效。(239字)
|
23天前
|
运维 监控 网络协议
阿里云国际站(云老大)DDoS攻击后服务器仍卡顿?
不少运维团队经历过这样的场景:阿里云安全中心显示 DDoS 攻击已结束,黑洞解除,但服务器依旧响应缓慢,甚至比攻击期间更难定位。问题不在于带宽,而在于攻击遗留下的“暗伤”——连接表膨胀、端口耗尽、内核参数变动,这些因素让卡顿在攻击停歇后持续数小时甚至数天。要真正恢复业务,就得从连接残留与系统资源层面着手排查。
124 4
|
24天前
|
人工智能 自然语言处理 云计算
2026阿里云大使招募:抢占AI先机,轻松赚取最高35%返佣,享官方全程陪跑支持!
阿里云2026云大使计划全新升级!无门槛加入,覆盖个人与企业。推广400+款产品(含热门MAAS产品,如秒悟、百炼等),享高额返佣+长周期收益。官方提供培训、方案落地、客户陪跑全链路支持,助你成为AI时代超级连接者。会分享,就能赚!
|
23天前
|
数据采集 人工智能 测试技术
我亲手训练了一个AI来测Bug,结果它发现了CTO十年前留下的“屎山”
两周前,我用历史缺陷数据训练AI“闻”代码坏味道,首次扫描便揪出一段CTO十年前写的高风险对账函数——硬编码、浮点误差容忍、无测试覆盖,却在线上隐匿十年。它不替代人工,而是揭示被遗忘的“未知未知”,让技术债务无可遁形。

热门文章

最新文章