苹果开发者账号入门:六个概念一张图看懂

14 阅读10分钟

apple-developer-concepts-comic.png

苹果开发者账号入门:六个概念一张图看懂

读者:第一次接触 iOS 签名、Universal Link、推送配置的开发者;或者每次进 developer.apple.com 都被一堆名词绕晕的人。

目标:看完之后,你能独立解释 App IDProfileCertificate 这些东西到底是干嘛的,以及它们怎么组合起来让一个 App 能装进 iPhone。


0. 一张图看完整个故事

苹果开发者账号六大概念关系图转存失败,建议直接上传图片文件

把整件事想象成 「App 过 iOS 海关」 的过程,分三幕:

场景对应概念
① 出发前小蓝方块 App 把 4 样东西装进黄色信封App ID + Services + Certificate + Devices → 装进 Profile
② 海关检查iPhone 海关官员核对信封,盖章放行iOS 安装/启动时的签名校验
③ 后门通道保险箱里的 .p8 钥匙交给后端和 CIKeys 服务端使用,不进 IPA

核心一句话Profile = App ID(+能力) + Certificate + Devices,是把所有材料粘起来的"胶水"。


1. 六个角色逐个认识

1.1 Identifiers 标识符 —— App 的"身份证"

进苹果后台第一件事是给你的 App 一个唯一身份。

类型作用例子
App IDsApp 的 Bundle ID,最常用com.example.myapp
Services IDsWeb 端 Sign in with Apple 用com.example.web.signin
Pass Type IDsApple Wallet 卡券pass.com.example.coupon
Merchant IDsApple 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 NotificationsAPNs 推送通知
Associated DomainsUniversal Links / 网页与 App 关联(AASA)
Sign in with Apple苹果账号登录
iCloudiCloud 同步 / 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 上用证书的标准做法:把 .p12 Base64 后存成 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 安装时会校验:

  1. Profile 的签名是否被 Apple 认证。
  2. IPA 的签名证书是否在 Profile 允许列表里。
  3. 设备是否在允许列表里(Dev/Ad-Hoc)。
  4. Bundle ID 是否对得上。
  5. 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 为例)

  1. Identifiers → 找到你的 App ID。
  2. 勾选 Associated Domains → 保存。
  3. Profiles → 找到对应的 Profile → Edit → Save 一次(让它带上新的 entitlement)。
  4. 重新下载 .mobileprovision,替换 CI 上的(或本地 Xcode 重新下)。
  5. Xcode 项目 Signing & Capabilities → 加 Associated Domains → 写 applinks:你的域名
  6. 服务端把 apple-app-site-association 部署到 https://你的域名/.well-known/Content-Type: application/json,无重定向。
  7. 重新打包发版本。

新手最容易跳过的步骤是 3——只在 App ID 上勾,没重新出 Profile,entitlement 没进 IPA,能力永远不会被触发。这个套路适用于所有"加能力"场景:Push、iCloud、Sign in with Apple,全都一样。

剧本 B:新同事入职,要在他 Mac 上调试

  1. 苹果后台 → People → 邀请他加入团队(开发者 / 管理员)。
  2. 他登录 Xcode,加上 Apple ID。
  3. 不要给他你的 .p12 证书——让他自己用 Xcode 自动生成 Apple Development 证书(每个开发者一张)。
  4. 他在 Xcode 连真机调试,自动 manage signing 会帮他登记 UDID + 出 Dev Profile。

剧本 C:上架 App Store

  1. 苹果后台用现成的 Distribution 证书(复用,不要每次新建)。
  2. App Store Profile 选 App Store Distribution 类型。
  3. 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. 延伸阅读