Bundle ID 和 App ID 是什么关系?证书、描述文件与 Team ID 一张表讲清
Bundle ID 是工程里 App 的唯一标识,App ID 是后台登记的 Team ID 加 Bundle ID 加能力,证书证明谁签的名,描述文件把它们和设备绑在一起。签名报错多是这几样对不上,附四类描述文件对比和报错对照表。
Bundle ID 和 App ID 的关系一句话说清:Bundle ID 是工程里 App 的唯一标识;App ID 是在 Apple 后台登记的「Team ID + Bundle ID + 允许的能力」;Team ID 标识你的开发团队;证书证明是谁签的名;描述文件把 App ID、证书、设备和能力绑在一起,决定这个包能用哪张证书签、能装到哪些手机。签名报错几乎都是这几样之间对不上,先看懂下面的总表,再按报错对照表排查。Apple 规则截至 2026 年 10 月。
Team ID、Bundle ID、App ID、证书和描述文件各是什么?
| 名称 | 是什么 | 长什么样 | 在哪里看 | 文件 |
|---|---|---|---|---|
| Team ID | Apple 给开发者计划会员分配的团队标识 | 10 个字符,如 ABCDE12345 |
开发者网站 Account 页的 Membership details | 无单独文件 |
| Bundle ID | App 在工程里的唯一标识 | 反向域名,如 com.example.myapp |
工程的 PRODUCT_BUNDLE_IDENTIFIER |
写在 Info.plist 里 |
| App ID | 后台登记的 App 标识,带能力清单 | ABCDE12345.com.example.myapp 或 ABCDE12345.com.example.* |
Certificates, Identifiers & Profiles 的 Identifiers 页 | 无单独文件 |
| 证书 | 证明签名者身份,私钥在你手里 | Apple Development、Apple Distribution | Certificates 页 | .cer(不含私钥)、.p12(含私钥) |
| 描述文件 | 把 App ID、证书、设备、能力绑在一起的授权文件 | Development、Ad Hoc、App Store Connect、In-House | Profiles 页 | .mobileprovision |
Team ID 的定义见 Apple 词汇表 Team ID。
Bundle ID 和 App ID 谁包含谁?
1描述文件 (.mobileprovision)
2├─ Team ID
3├─ App ID ─────── Team ID 前缀 + Bundle ID(或通配 com.example.*)
4│ └─ 开通的能力:推送、App Groups、iCloud……
5├─ 证书 ───────── 一张或多张,签名时要用其中一张对应的 .p12
6├─ 设备 UDID ──── 只有 Development 和 Ad Hoc 类型有
7└─ 到期时间
记住三条对应关系,签名问题就有了方向。
- 工程的 Bundle ID 要和描述文件里的 App ID 匹配。精确 App ID 要一字不差,通配 App ID 要前缀相同。
- 签名用的 .p12 要在描述文件勾选的证书里。换了证书,描述文件要重新生成。
- 安装的手机要在描述文件的设备列表里,只对 Development 和 Ad Hoc 类型有效。
描述文件在生成那一刻就把这些固定下来。之后注册新设备、给 App ID 开新能力、换证书,都要回到 Profiles 页编辑描述文件,保存并重新下载。Apple 的编辑、下载或删除描述文件写明,开关了 App 服务或描述文件过期时,都要重新生成。
每一样具体怎么查、怎么用?
Team ID
Team ID 是 10 个字符的字符串,属于付费的 Apple Developer Program 或 Apple Developer Enterprise Program 会员。登录 developer.apple.com/account,在 Membership details 里能看到。免费 Apple ID 没有这一项。
工程里对应的构建设置是 DEVELOPMENT_TEAM。描述文件里的 TeamIdentifier、App ID 的前缀通常也是它。一个人加入多个团队时,每个团队各有一个 Team ID,签名要用同一个团队下的证书和描述文件。
Bundle ID
Bundle ID 写在工程里,构建后成为 Info.plist 的 CFBundleIdentifier。App Store Connect 里的 App 记录也绑定了它,上传过构建之后就不能再改,新建 App 记录前先定好。
扩展 target 有自己的 Bundle ID,并且要以主 App 的 Bundle ID 加点开头,例如主 App 是 com.example.myapp,小组件是 com.example.myapp.widget。每个扩展在后台都要有自己的 App ID 和描述文件。
App ID:显式与通配
Apple 的注册 App ID 帮助页写明,App ID 分两种:显式(Explicit)App ID 用于单个 App,通配(Wildcard)App ID 用于一组 App。App ID 上开通的能力是一份允许清单,App 只能用清单里的能力。
| 显式 App ID | 通配 App ID | |
|---|---|---|
| 写法 | com.example.myapp |
com.example.* |
| 覆盖 | 一个 Bundle ID | 前缀相同的所有 Bundle ID |
| 能力 | 可以开通推送、App Groups、iCloud、Sign in with Apple 等 | 需要显式 App ID 的能力在注册页上是灰的,不能勾选 |
| 上传 App Store Connect | 可以 | 不行,Apple 要求 App 记录使用显式 App ID |
| 适合 | 上架的 App、用到能力的 App | 开发阶段、不用任何特殊能力的小工具 |
上架要求见 Apple 的创建 App Store 描述文件:上传到 App Store Connect 需要用显式 App ID 注册的 App 记录。所以打算上架的 App,从一开始就注册显式 App ID。
证书
证书分开发和发布两类。Apple 的证书概览写明,开发证书属于个人,发布证书属于团队,只有账号持有人(Account Holder)或管理员(Admin)能创建发布证书。
- Apple Development:在设备上运行和调试 App。团队里每人可以有自己的一张。
- Apple Distribution:上传 App Store Connect,或签名后装到指定的测试设备上(Ad Hoc)。团队共用,不要每人申请一张。
签名需要的是带私钥的 .p12。从后台下载的 .cer 只有证书没有私钥,单独拿它签不了名。在 Windows 上生成 CSR、合成 .p12 的完整步骤见在 Windows 上申请 iOS 开发证书、描述文件和 p12。
推送用的 Apple Push Notification service SSL 证书是给服务器发推送用的,不用来签 App,和本文的签名证书是两回事。
四类描述文件有什么区别?
| Development | Ad Hoc | App Store Connect | In-House | |
|---|---|---|---|---|
| 用途 | 开发调试 | 把测试包直接发给少量测试人员 | 上传 App Store Connect,经 TestFlight 和 App Store 安装 | 企业内部员工使用 |
| 证书 | 一张或多张开发证书 | 一张发布证书 | 一张发布证书 | 企业账号的发布证书 |
| 设备列表 | 有,要注册 UDID | 有,要注册 UDID | 没有 | 没有 |
| 能直接装到手机 | 能,限列表内设备 | 能,限列表内设备 | 不能 | 只限本机构内部 |
| 账号 | Apple Developer Program | Apple Developer Program | Apple Developer Program | 仅 Apple Developer Enterprise Program |
依据分别是 Apple 的创建开发描述文件、创建 Ad Hoc 描述文件和上文的 App Store 描述文件页面。
几点补充。
- 在后台手动创建前三类描述文件,需要账号持有人或管理员角色。
- Development 描述文件可以勾选团队所有人的开发证书,一份文件大家共用。
- Ad Hoc 和 Development 都占用设备名额,每类设备每个会员年度最多 100 台。测试人员多时改用 TestFlight,不用收集 UDID。
- In-House 类型只属于企业开发者计划,Apple 只允许用于本机构员工内部使用,不能面向公众分发,本文不展开。
签名报错是哪两样对不上?
| 哪两样对不上 | 典型报错 | 处理 |
|---|---|---|
| Bundle ID 和描述文件的 App ID | Provisioning profile "…" has app ID "…", which does not match the bundle ID "…" |
按报错里的 Bundle ID 生成描述文件,见 138 篇 |
| 扩展的 Bundle ID 没有描述文件 | No profiles for 'com.example.myapp.widget' were found |
给扩展注册 App ID、生成描述文件,见 138 篇 |
| 证书和描述文件 | Provisioning profile "…" doesn't include signing certificate "…" |
编辑描述文件改选当前证书,见 138 篇 |
| 工程要求的证书类型或团队 | No signing certificate matching '…' found |
放入对应团队、对应类型的 .p12,见 138 篇 |
| entitlements 和 App ID 的能力 | doesn't include the Push Notifications capability |
App ID 开通能力后重新生成描述文件,见 138 篇 |
| 手机和描述文件的设备列表 | 0xe8008015 或 doesn't include the currently selected device |
注册 UDID 后重新下载描述文件,见设备未注册 |
| 手机上旧版本的团队和新包 | MismatchedApplicationIdentifierEntitlement |
删除旧版本后再装,见 138 篇 |
| 描述文件类型和安装方式 | App Store 描述文件签的包直接装真机失败 | 测试用 Development 或 Ad Hoc,或走 TestFlight |
在 Windows 上核对描述文件内容
用 Git for Windows 自带的 OpenSSL 解出描述文件,对照上面的关系逐项核对。
1& "C:\Program Files\Git\mingw64\bin\openssl.exe" smime -inform DER -verify -noverify -in .\keychain\MyApp_Dev.mobileprovision -out profile.plist
| 要核对的 | profile.plist 里的键 |
|---|---|
| Team ID | TeamIdentifier |
| App ID 是否匹配 Bundle ID | Entitlements → application-identifier |
| 开通的能力 | Entitlements 里的其余键,如 aps-environment |
| 设备 | ProvisionedDevices |
| 到期时间 | ExpirationDate |
工程里每个 target 解析后的 Bundle ID,用下面的命令查看。
1kxbuild project info .\MyApp.xcodeproj
证书和描述文件在 KXBuild 里怎么放?
在 Windows、Linux 上用 KXBuild 构建时,把 .p12、.mobileprovision 和密码文件 password.properties 放进 keychain 证书目录,规则以证书与签名为准。
工程目录/keychain/:只对这个工程生效。KXBUILD_HOME/keychain/:所有工程共用。Windows 默认是%USERPROFILE%\kxbuild\keychain\,WSL、Linux、macOS 是~/kxbuild/keychain/。
两处的文件会合并使用。一个带小组件的 App,开发和上架两套文件放在一起的样子如下。
1keychain\
2├─ development.p12
3├─ distribution.p12
4├─ MyApp_Dev.mobileprovision
5├─ MyAppWidget_Dev.mobileprovision
6├─ MyApp_AppStore.mobileprovision
7├─ MyAppWidget_AppStore.mobileprovision
8└─ password.properties
password.properties 每行一张证书,格式为「文件名=密码」。
1development.p12=你的密码
2distribution.p12=你的密码
构建时按工程的签名设置自动挑选。CODE_SIGN_IDENTITY 决定用开发证书还是发布证书,DEVELOPMENT_TEAM 决定团队,自动签名按 Bundle ID 和团队匹配描述文件,手动签名按 PROVISIONING_PROFILE_SPECIFIER 填的描述文件名查找,见证书选择规则。这几项都在工程设置编辑器 General 页的 Identity 和 Signing 分组里。
常见问题
Bundle ID 和 App ID 是一回事吗?
不是。Bundle ID 写在工程里,标识这个 App;App ID 是在 Apple 后台登记的记录,由 Team ID 前缀加 Bundle ID 组成,还带着开通的能力清单。描述文件引用的是 App ID,它要和工程的 Bundle ID 匹配。
Team ID 在哪里查?
登录 Apple 开发者网站,在 Account 页的 Membership details 里查看,是 10 个字符的字符串。也可以解开描述文件,看 TeamIdentifier 字段。
通配 App ID 能上架 App Store 吗?
不能。Apple 要求上传到 App Store Connect 的 App 记录使用显式 App ID,通配 App ID 也不能开通推送、App Groups 等多数能力,只适合开发阶段。
描述文件里包含哪些东西?
包含团队、App ID、允许签名的证书、开通的能力和到期时间,Development 和 Ad Hoc 类型还包含允许安装的设备 UDID。其中任何一项变了,都要重新生成并下载描述文件。
换了一台电脑,证书要重新申请吗?
不用。把带私钥的 .p12 和对应的 .mobileprovision 复制到新电脑的证书目录,再写好 password.properties 即可。只有 .cer 没有私钥时才需要重新申请。