用 SwiftUI 重写的 E-Hentai / ExHentai 画廊客户端,支持 iPhone、iPad 和 Mac。
功能与交互对齐 Android 端的 EhViewer_CN_SXJ,网络层、解析器、下载引擎均为对照其实现重写,而非套壳。
本项目没有 TestFlight,也不会上架 App Store。 内容形态不符合审核指南,请不要等待邀请。
| 平台 | 安装包 | 做法 | 有效期 |
|---|---|---|---|
| Mac | .dmg |
双击打开,拖进「应用程序」 | 1 年 |
| iPhone / iPad | .ipa |
用你自己的 Apple ID 签名后安装,见下文 | 免费账号 7 天,付费账号 1 年 |
安装包见 Releases。iPhone 和 iPad 用的是同一个通用包。
完整的安装步骤、签名工具直达链接与常见卡点,见 Wiki:安装与签名。
DMG 已用 Developer ID 签名并通过 Apple 公证,票据已植入,断网也能正常安装,不会出现 「无法打开,因为无法验证开发者」。双击挂载后把 App 拖进「应用程序」即可。
本项目不收集设备 UDID。 请用你自己的 Apple ID 给安装包签名——你的设备信息不需要 交给任何人,也不受开发者账号每年 100 台设备的限制。
常用工具,任选其一:
| 工具 | 运行环境 | 说明 |
|---|---|---|
| Sideloadly | Windows / macOS | 连数据线,填 Apple ID,选 IPA,点开始 |
| AltStore / SideStore | Windows / macOS | 装一次后可在设备上自助续签,不必每周接电脑 |
签名用的 Apple ID 建议单独注册一个,不要用主力账号。
免费账号签出的 App 7 天后失效,重签即可,数据不会丢。付费开发者账号($99/年)为 1 年。
关于重签的几点实测:
- 本项目的 entitlements 只有
application-identifier和team-identifier,没有用 App Group、 推送或关联域名。这类权限在免费账号下无法申请,会被签名工具剥离并导致功能残缺——本项目不受影响。 - 下载进度的灵动岛显示走 ActivityKit,数据经 Live Activity 传递而非共享容器,重签后照常工作。
- widget 扩展会额外占用一个 App ID。免费账号每 7 天有 App ID 数量配额,正常使用够用; 如果你短时间内反复重签多个 App 可能撞到上限,等配额恢复即可。
没有 Mac 也能装:Sideloadly 和 AltStore 都有 Windows 版本,签名在你自己的电脑上完成。 只有从源码编译才需要 macOS。
浏览与搜索:首页、热门、排行榜、订阅标签列表;高级搜索支持分类、评分下限、页数范围与命名空间;标签选择器可按分组浏览并自动拼装搜索语法;标签中文翻译由 EhTagDatabase 提供。
阅读器:横向翻页与纵向滚动,双页排版(iPad / Mac),双指缩放,点击分区翻页,GIF 动图,键盘与外置蓝牙翻页器,音量键翻页,护眼色彩滤镜。
下载:后台下载、断点续传、标签分组、通知与灵动岛进度、阅读时同步下载、按标题或标签搜索、打包为 zip 分享。
账号:网页登录、Cookie 粘贴登录、访客浏览;收藏夹云端同步;评论发表与编辑;图片配额查看与重置;我的标签管理。
资源:归档下载与 H@H 派发、种子列表、站内公告。
网络容灾:内置 IP 表与自定义 Hosts、域名前置回退、DNS over HTTPS、H@H 节点自动切换。
| 项目 | 版本 |
|---|---|
| Xcode | 26.0+ |
| Swift | 6.0 |
| iOS / iPadOS | 18.0+ |
| macOS | 26.0+ |
构建需要 Xcode 26 / Swift 6,但产物的最低运行版本是 iOS 18.0。代码里没有 iOS 26 独占 API,
实际用到的最高版本 API 是 onScrollGeometryChange(iOS 18);@Observable、scrollPosition、
ContentUnavailableView 都是 iOS 17 起就有的。
iOS 18 / 19 尚未经过真机或模拟器测试。 已验证的只是「以 18.0 为最低版本全量编译通过, 无可用性错误与警告」,SwiftUI 在旧系统上的实际布局与交互行为没有验证过。 遇到问题请开 issue 并附上系统版本。
iOS 17 及更早暂不支持:@Observable 需要 iOS 17,且降到 17 需要为浮动 TabBar 的滚动隐藏写降级路径。
macOS 侧仍要求 26.0+,未随本次一起下调。
git clone https://github.com/felixchaos/EhViewer-Apple.git
cd EhViewer-Apple
open "ehviewer apple.xcodeproj"首次打开会自动解析 Swift Package 依赖,可能需要几分钟。
选择 ehviewer apple scheme,目标设备选 My Mac,按 ⌘R。
需要一个 Apple ID(免费即可)和一根数据线。
- 用数据线连接设备,在设备上选择「信任此电脑」
- Xcode → Settings → Accounts,添加你的 Apple ID
- 选中项目 → Signing & Capabilities,Team 选你的账号
- Bundle Identifier 改成唯一值(例如
com.yourname.ehviewer),否则会和他人冲突 - 目标设备选你的设备,按
⌘R
首次安装后,设备上前往 设置 → 通用 → VPN 与设备管理,信任你的开发者描述文件。
免费账号签名的应用 7 天后失效,需要重新连接 Mac 安装。付费账号($99/年)为 1 年。
distribute_mac.sh 会完成签名、公证、打包全流程,产出一个可直接分发、不触发 Gatekeeper 警告的 .dmg。需要付费开发者账号。
准备 App 专用密码 — 公证服务不接受 Apple ID 登录密码:
- 登录 appleid.apple.com → 登录和安全 → App 专用密码
- 生成一个(标签随意,如
ehviewer-notarize) - 记下形如
xxxx-xxxx-xxxx-xxxx的密码,只会显示一次
查找 Team ID — 在 developer.apple.com/account 的 Membership Details 里,是一串 10 位字母数字。或者:
security find-identity -v -p codesigning | grep "Developer ID"确认证书 — Xcode → Settings → Accounts → Manage Certificates,确保有 Developer ID Application,没有就点左下角 + 创建。
配置凭据 — 在仓库根目录建 .env(已在 .gitignore 中):
APPLE_ID=your-email@example.com
TEAM_ID=HWZEUNLCY6
APP_SPECIFIC_PASSWORD=xxxx-xxxx-xxxx-xxxx运行:
cd "ehviewer apple"
./distribute_mac.sh脚本依次执行 Release 归档、Developer ID 导出、Hardened Runtime 深度签名、创建 DMG、提交 Apple 公证并等待结果、植入公证票据。完成后 .dmg 在 build/ 目录下。
Developer ID 证书有效期 1 年,到期在 Xcode 里续签后重新运行即可。
App 层只放视图,业务逻辑全部下沉到 Packages/ 下的本地 Swift Package,各模块可独立编译和测试。
EhViewer-Apple/
├── ehviewer apple/ # 主 App:SwiftUI 视图层
├── Packages/
│ ├── EhCore/
│ │ ├── EhModels/ # 数据模型、URL 构建器
│ │ ├── EhDatabase/ # GRDB 持久化
│ │ └── EhSettings/ # 全局配置、标签数据库
│ ├── EhNetwork/
│ │ ├── EhAPI/ # 请求引擎,对照 Android EhEngine
│ │ ├── EhCookie/ # Cookie 管理
│ │ └── EhDNS/ # 内置 Hosts 与域名前置
│ ├── EhParser/ # HTML / JSON 解析器
│ ├── EhSpider/ # 图片抓取与本地存储
│ ├── EhDownload/ # 下载队列
│ └── EhUI/ # 复用组件
└── ehviewer apple.xcodeproj/
跑测试:
xcodebuild test -project "ehviewer apple.xcodeproj" -scheme "ehviewer apple" \
-destination 'platform=iOS Simulator,name=iPhone 17 Pro'提 issue 时请附上设备型号、系统版本和复现步骤;如果是网络问题,说明你的代理方式会更好定位。
当前界面是过渡性的,未来会重做,见路线图。对界面的具体意见(哪一屏别扭、哪个操作路径太绕)在这个阶段尤其有价值。
提 PR 前请确认 iOS 和 macOS 两个目标都能编译,并跑通测试。详见 CONTRIBUTING.md。
- 文档见 Wiki:安装与签名、路线图、架构说明
- 更新记录见 CHANGELOG.md
- 安全问题请勿开公开 issue,走私密漏洞报告,详见 SECURITY.md
- 开源协议 Apache License 2.0
致谢 EhViewer、EhViewer_CN_SXJ 与 GRDB.swift。
本项目仅供学习与技术交流。使用者需遵守所在地法律法规,开发者不对使用本软件产生的后果负责。