苹果开发者账号入门:六个概念一张图看懂
读者:第一次接触 iOS 签名、Universal Link、推送配置的开发者;或者每次进 developer.apple.com 都被一堆名词绕晕的人。
目标:看完之后,你能独立解释
App ID、Profile、Certificate这些东西到底是干嘛的,以及它们怎么组合起来让一个 App 能装进 iPhone。
0. 一张图看完整个故事

把整件事想象成 「App 过 iOS 海关」 的过程,分三幕:
| 幕 | 场景 | 对应概念 |
|---|---|---|
| ① 出发前 | 小蓝方块 App 把 4 样东西装进黄色信封 | App ID + Services + Certificate + Devices → 装进 Profile |
| ② 海关检查 | iPhone 海关官员核对信封,盖章放行 | iOS 安装/启动时的签名校验 |
| ③ 后门通道 | 保险箱里的 .p8 钥匙交给后端和 CI | Keys 服务端使用,不进 IPA |
核心一句话:Profile = App ID(+能力) + Certificate + Devices,是把所有材料粘起来的"胶水"。
1. 六个角色逐个认识
1.1 Identifiers 标识符 —— App 的"身份证"
进苹果后台第一件事是给你的 App 一个唯一身份。
| 类型 | 作用 | 例子 |
|---|---|---|
| App IDs | App 的 Bundle ID,最常用 | com.example.myapp |
| Services IDs | Web 端 Sign in with Apple 用 | com.example.web.signin |
| Pass Type IDs | Apple Wallet 卡券 | pass.com.example.coupon |
| Merchant IDs | Apple Pay 收款 | merchant.com.example.shop |
关键认知:
- 一个 App 在苹果世界里,身份不是名字而是 Bundle ID。改名字没事,改 Bundle ID 等于换了个 App。
- 团队里的"测试包"、"灰度包"、"正式包"经常会用 不同的 Bundle ID(比如加
.dev后缀),这样可以同屏装多个版本。 - App ID 创建后不能改 Bundle ID,但可以勾选/取消能力(见下一节)。
1.2 Services / Capabilities —— 给身份证贴"能力贴纸"
App ID 创建后默认是个"光板身份证",需要在它上面 勾选能力:
| 能力 | 用途 |
|---|---|
| Push Notifications | APNs 推送通知 |
| Associated Domains | Universal Links / 网页与 App 关联(AASA) |
| Sign in with Apple | 苹果账号登录 |
| iCloud | iCloud 同步 / CloudKit |
| In-App Purchase | 应用内购买 / 订阅 |
| Background Modes | 后台任务、后台拉取、VoIP |
| HealthKit / HomeKit / CarPlay | 系统级 SDK 接入 |
| App Groups | 主 App 与扩展共享数据 |
关键认知:
- 勾选能力的动作发生在 App ID 上,但实际生效是通过 重新生成 Profile —— 描述文件会把这些能力写成
entitlements(权限清单),随 IPA 一起发到设备。 - 所以经典踩坑:"我后台勾了 Associated Domains,怎么 Universal Link 还是不工作?" —— 因为没重新下载/打 Profile。
- Xcode 项目里
Signing & Capabilities面板的能力 必须和 App ID 上勾的对得上,否则签名失败或安装后能力静默失效。
1.3 Certificates 证书 —— 团队的"签名印章"
证书证明 "这个包是 XXX 团队签的"。本质是一对公私钥:
- 私钥 留在签名机器(开发者的 Mac 钥匙串、或 CI 的 keychain)。
- 公钥 + 苹果的签名 =
.cer,下载到本地双击导入钥匙串后变成完整的签名身份。
| 类型 | 给谁用 |
|---|---|
| Apple Development | 开发机调试 |
| Apple Distribution | 上 App Store / Ad-Hoc 测试 / 企业内部分发 |
历史遗留的
iOS App Development/iOS Distribution是老类型,新建议用Apple Development/Apple Distribution,一张证书 iOS / macOS / tvOS 通吃。
关键认知:
- 证书数量有限制(Distribution 一般 2 张以内),不要随便 Revoke,会让仍在用旧证书的 Profile 全部失效。
- 跨电脑用证书,要导出
.p12(包含私钥),不要只传.cer(只是公钥)。 - CI 上用证书的标准做法:把
.p12Base64 后存成 CI Variable,跑流水线时解码到临时 keychain,构建结束销毁。
1.4 Devices 设备 —— 测试机的"白名单"
这一项很多人会困惑——不是所有 App 都需要它。
| Profile 类型 | 是否需要登记 Devices |
|---|---|
| Development(日常开发调试) | ✅ 需要 |
| Ad-Hoc(内部分发测试包) | ✅ 需要 |
| App Store(正式上架) | ❌ 不需要 |
| Enterprise(企业证书内部分发) | ❌ 不需要 |
关键认知:
- 登记的是设备的 UDID(25 位字符),不是 Apple ID、不是手机号。最快的拿法:用 Xcode 连真机 → Window → Devices and Simulators。
- 一个团队最多 100 台/类设备/年。注册了之后无法当年删除(只能"禁用",下个年度续费时才能清空)。
- 改了 Devices 列表后,受影响的 Profile 必须重新生成才能生效。
1.5 Keys 密钥 —— 后端 / CI 的"独立钥匙串"
这是最容易和 Certificates 混淆的概念。区别一句话:
Certificate 用来签 IPA,跟着包一起发到用户手里。 Key 留给服务端 / CI 使用,永远不进 IPA。
| 常见 Key | 谁用 | 干啥 |
|---|---|---|
APNs Auth Key (.p8) | 后端服务器 | 给客户端发推送 |
App Store Connect API Key (.p8) | CI / Fastlane | 自动化上传构建、查 TestFlight 状态 |
| DeviceCheck Key | 后端 | 防作弊设备指纹 |
| Sign in with Apple Key | 后端 | 验证 Apple 登录的 ID Token |
关键认知:
.p8文件只能下载一次,下完立刻找个安全的地方存好(密码管理器 / 加密保险箱)。丢了只能 Revoke 重新生成,一次性更换所有依赖它的服务。- APNs Auth Key 是 团队级的,一把钥匙覆盖团队所有 App,比老式的 APNs Push Certificate(按 App 一张、还要每年续)方便太多。
- 使用方式不是直接传文件,而是用它 签发 JWT(短期 token),再把 JWT 放进 HTTP 请求头里去访问苹果服务。
1.6 Profiles 描述文件 —— 把所有材料粘起来的"胶水"
这就是漫画里那个黄色信封。一份 Provisioning Profile 是一个签好名的 plist 文件(.mobileprovision),里面包含:
Profile = {
团队 ID,
关联的 App ID(Bundle ID + entitlements),
允许的 Certificate 列表,
允许的 Devices 列表(仅 Dev / Ad-Hoc),
过期时间,
Apple 自己的签名
}
打 IPA 时 Xcode/CI 会把它嵌入到 App.app/embedded.mobileprovision。iOS 安装时会校验:
- Profile 的签名是否被 Apple 认证。
- IPA 的签名证书是否在 Profile 允许列表里。
- 设备是否在允许列表里(Dev/Ad-Hoc)。
- Bundle ID 是否对得上。
- entitlements 有没有越权。
任何一项不对,安装/启动失败。
| Profile 类型 | 谁能装 | 用什么证书签 |
|---|---|---|
| Development | 已注册 UDID 的设备 | Apple Development |
| Ad-Hoc | 已注册 UDID 的设备 | Apple Distribution |
| App Store | 任意设备(通过 App Store 安装) | Apple Distribution |
| Enterprise | 任意设备(企业证书) | iOS Distribution (In-House) |
关键认知:
- Profile 有有效期(一般 1 年),到期后 IPA 还能装但不能新装。CI 应该定期重新生成 Profile 并替换。
- 改了 App ID 上的能力(比如新加 Associated Domains)→ 必须重新生成 Profile。
- 推荐勾选 Xcode 的 "Automatically manage signing",本地开发时它会自动建/续 Dev Profile,省心。但 CI 和正式发布必须用手动管理,避免不可控。
2. 这六个东西怎么串起来:一次完整签名流程
以"打一个上架 App Store 的 IPA"为例:
sequenceDiagram
participant 你 as 开发者
participant 苹果 as Apple Developer 后台
participant Mac as 本地 Mac / CI
participant 设备 as 用户 iPhone
你->>苹果: ① 创建 App ID (Bundle ID = com.example.myapp)
你->>苹果: ② 勾选能力:Push, Associated Domains, Sign in with Apple
你->>Mac: ③ 钥匙串生成 CSR
Mac->>苹果: 上传 CSR
苹果-->>Mac: ④ 返回 Apple Distribution 证书 (.cer)
Mac->>Mac: 双击导入钥匙串(私钥+证书 = 签名身份)
你->>苹果: ⑤ 创建 App Store Profile<br/>(选择 App ID + Distribution Cert)
苹果-->>Mac: ⑥ 下载 .mobileprovision
Mac->>Mac: ⑦ Xcode/Fastlane 用 Profile + 证书签名打包
Mac->>苹果: ⑧ 上传 IPA 到 App Store Connect
苹果->>设备: 用户从 App Store 下载安装
设备->>设备: ⑨ 校验签名 + entitlements + Bundle ID
注意:App Store 流程不涉及 Devices——你不用预登记任何 UDID。Devices 只在 Development / Ad-Hoc 流程里出现。
3. 实战剧本:常见场景怎么操作
剧本 A:给 App 加一个新能力(以 Universal Link 为例)
- 进 Identifiers → 找到你的 App ID。
- 勾选
Associated Domains→ 保存。 - 进 Profiles → 找到对应的 Profile → Edit → Save 一次(让它带上新的 entitlement)。
- 重新下载
.mobileprovision,替换 CI 上的(或本地 Xcode 重新下)。 - Xcode 项目
Signing & Capabilities→ 加Associated Domains→ 写applinks:你的域名。 - 服务端把
apple-app-site-association部署到https://你的域名/.well-known/,Content-Type: application/json,无重定向。 - 重新打包发版本。
新手最容易跳过的步骤是 3——只在 App ID 上勾,没重新出 Profile,entitlement 没进 IPA,能力永远不会被触发。这个套路适用于所有"加能力"场景:Push、iCloud、Sign in with Apple,全都一样。
剧本 B:新同事入职,要在他 Mac 上调试
- 苹果后台 → People → 邀请他加入团队(开发者 / 管理员)。
- 他登录 Xcode,加上 Apple ID。
- 不要给他你的
.p12证书——让他自己用 Xcode 自动生成 Apple Development 证书(每个开发者一张)。 - 他在 Xcode 连真机调试,自动 manage signing 会帮他登记 UDID + 出 Dev Profile。
剧本 C:上架 App Store
- 苹果后台用现成的 Distribution 证书(复用,不要每次新建)。
- App Store Profile 选 App Store Distribution 类型。
- CI 通过 App Store Connect API Key(
.p8)自动上传到 TestFlight / 提审,比传统的 Apple ID + 双因子方式更稳定。
剧本 D:证书过期 / 快过期
- Certificate 过期:旧 IPA 已经发出去的不受影响(Apple 在签的时候就把时间戳塞进去了)。但不能再签新包。提前 1 个月新建一张同类型证书 → 重新出 Profile → 替换 CI 即可。
- Profile 过期:会导致用户重启 App 后启动失败(罕见,主要影响企业证书 / 内测包)。App Store 包不受影响(App Store 会自动用最新签名重签)。
剧本 E:换设备 / 换电脑
- 老电脑还在 → 钥匙串导出
.p12(包含私钥)+ 密码 → 新电脑双击导入,钥匙串里就能继续用同一张证书。 - 老电脑没了 → 后台 Revoke 旧证书 → 新机器重新申请。注意 Revoke 会让所有用旧证的 Profile 失效。
4. 常见踩坑 FAQ
Q1:为什么我建的 Profile 一直显示 Invalid?
90% 的情况是其中一项被 Revoke 了:
- 关联的证书被 Revoke 了?
- 关联的 App ID 被删了?
- 关联的 Device 被禁用了?
进 Profile 详情页能看到具体是哪个红字。
Q2:.p12 和 .p8 有什么区别?
.p12(PKCS#12) | .p8(PKCS#8) | |
|---|---|---|
| 装的是什么 | 证书 + 私钥 | 只有私钥 |
| 用在哪 | 签 IPA / 桌面 / CI 钥匙串 | APNs / App Store Connect API |
| 有密码吗 | 有(导出时设的) | 没有(靠 Key ID + Issuer ID 校验) |
| 能下载几次 | 私钥只能在原机器导出 | 只能下载一次,错过重新生成 |
Q3:Sandbox / Production 环境的 APNs 推送 Key 要分开吗?
不需要。.p8 的 APNs Auth Key 一把通吃 sandbox 和 production,靠请求的 Host 区分(api.sandbox.push.apple.com vs api.push.apple.com)。这是它比老式 Push Certificate 好用的关键。
Q4:怎么查 IPA 用的是哪个 Profile / Certificate?
unzip -p YourApp.ipa Payload/YourApp.app/embedded.mobileprovision \
| security cms -D
会输出 plist,里面能看到关联的证书、过期时间、entitlements、UDID 列表。也可以解开后用文本编辑器看到 Bundle ID 和 Team ID。
Q5:Xcode 里勾了能力,但 App ID 上没勾,会怎样?
构建时不会立刻报错,但安装后该能力不工作或 App 启动直接 crash。原因是 IPA 里的 entitlements 文件声明了这个能力,但 Profile 没授权 → iOS 拒绝执行。修复方法:去 App ID 上补勾,重新出 Profile,重新打包。
Q6:免费账号能签 IPA 吗?
可以,但有三个硬限制:
- 只能签到自己注册的设备(最多 3 台)。
- Profile 7 天过期,到期后 App 在设备上无法启动,需要重新签。
- 不能上传 App Store、不能用大部分 Capabilities(Push / iCloud / Sign in with Apple 等都不行)。
正经做产品必须 99 美金/年的个人账号,或 99 美金/年的公司账号(公司账号能开 App Store Connect 多人协作)。
Q7:App ID 写错了 Bundle ID 怎么办?
不能改。只能新建一个正确的 App ID,老的留着不动(删了会影响历史 Profile)。如果代码里也写错了,趁版本还没上架赶紧改;已经上架的版本想换 Bundle ID 等于发新 App,老用户拿不到更新。
5. 一张速查表
┌─────────────────────────────────────────────────────────────┐
│ Apple Developer 速查表 │
├─────────────────┬───────────────────────────────────────────┤
│ Identifiers │ Bundle ID = App 在苹果世界的身份证 │
│ Services │ 在 App ID 上勾的能力 → 写入 entitlements │
│ Certificates │ 团队签名身份(Dev / Distribution) │
│ Devices │ Dev/Ad-Hoc 才用,App Store 用不到 │
│ Keys (.p8) │ 后端 / CI 专用,绝不进 IPA │
│ Profiles │ 把上面五个粘成一个文件 → 进 IPA │
└─────────────────┴───────────────────────────────────────────┘
签名失败排查口诀:先看 Profile,再看证书,最后看能力。
配置完能力没生效:99% 是 Profile 没重新生成。
推送 / 上传一直 401:检查 .p8 的 Key ID / Issuer ID / 过期时间。
6. 延伸阅读
- 苹果官方:Distributing Your App for Beta Testing and Releases
- 苹果官方:Code Signing Guide
- 苹果官方:Sending notification requests to APNs(APNs 推送)
- 苹果官方:App Store Connect API(自动化上架)