iOS 签名与 EAS 凭据
理解 iOS certificate、provisioning profile、Ad Hoc、TestFlight 和 EAS 自动签名
Bundle ID 只是说明 App 叫什么。iOS 设备还要确认,这个安装包来自哪个 Apple Developer 团队,它被允许装到哪些设备、使用哪些能力、走哪种分发方式。
这就是签名、证书和 provisioning profile 的作用。
三个核心概念
Certificate
团队的签字笔,证明这个包由哪个开发团队签出。
Private Key
签字笔的笔芯。丢了它,这张证书就没法继续签包。
Provisioning Profile
Apple 的批准书,写明哪个 App、哪些设备、哪些能力、哪种分发可用。
如果你用 EAS Build,很多签名细节可以交给 EAS 管理。但你仍然要知道 profile 为什么会失效、为什么 iOS preview 包不是任何手机都能装、为什么改 capability 后要重新构建。
profile 和分发方式
| 场景 | 常见 profile | 用途 |
|---|---|---|
| 本机开发 | development profile | 自己调试和开发版 App |
| Preview 内测 | Ad Hoc profile | 只允许登记过 UDID 的设备安装 |
| TestFlight / App Store | App Store profile | 上传到 App Store Connect |
Ad Hoc 是很多新手最容易踩坑的地方。你把 preview 链接发给朋友,如果他的 iPhone 没登记进设备列表,包就装不上。新增设备后通常要刷新 profile 并重新构建或重新签名。
EAS 会做什么
当你运行:
vpr @01mvp/mobile#eas:build:development
vpr @01mvp/mobile#eas:build:preview
vpr @01mvp/mobile#eas:build:productionEAS 会读取 products/01mvp/apps/mobile/app.json 和 eas.json,再根据 profile 准备构建环境和签名凭据。
如果你选择让 EAS 管理凭据,它通常会处理:
- 创建或复用 Apple Distribution Certificate。
- 创建或复用 provisioning profile。
- 读取和注册 Ad Hoc 测试设备。
- 为 production build 准备 App Store 分发所需凭据。
正式项目建议先在 Apple Developer 里手动注册 App ID 和 capabilities,再让 EAS 处理证书和 profile。这样身份是你先定好的,EAS 只负责签名和构建。
什么时候需要重新签名或重建
| 改动 | 需要什么 |
|---|---|
| 只改 JS 页面、文案、样式 | 可以走本地开发或 EAS Update |
| 新增原生依赖或 Expo plugin | 重新 development / preview / production build |
| 修改 Bundle ID、scheme、图标、启动页 | 重新 build |
| 开启 Push、Associated Domains、App Groups | 更新 capabilities 和 profile,再重新 build |
| iOS preview 新增测试设备 | 刷新 Ad Hoc profile,再重新 build 或 resign |
| 证书过期或被撤销 | 更新证书,再重新 build |
EAS 凭据要怎么管
小团队可以先用 EAS 自动管理。等产品稳定、团队变大,再考虑更严格的证书流程。
适合 EAS 自动管理:
- 你用 Expo / EAS Build 构建 iOS。
- 团队愿意让 EAS 托管 signing credentials。
- 没有单独的企业证书管理要求。
适合手动管理:
- 公司安全策略不允许第三方托管私钥。
- 多个构建系统要共用同一套证书。
- 需要精细控制证书创建、吊销和权限。
无论哪种方式,都要记录证书由谁管理、EAS project 属于哪个 Expo 账号、Apple team 是哪个团队。
常见错误
| 错误 | 可能原因 |
|---|---|
| iOS preview 安装失败 | 设备 UDID 没登记,或 profile 没刷新 |
| EAS 构建时找不到 Bundle ID | Apple Developer 没注册 App ID,或账号权限不足 |
| 开启能力后 App 仍然不可用 | capabilities 改了但没有重新 build |
| TestFlight 上传失败 | App Store Connect app record、Bundle ID 或签名 profile 不匹配 |
| 换人构建后签名异常 | 证书私钥、EAS credentials 或 Apple team 权限不一致 |
官方参考
这篇文档有问题?