App Bundle ID — 是 Apple 和 Google 生态系统中用于注册、签名和分发软件产品的唯一应用标识符。每个应用在创建项目时都会获得自己的 Bundle ID,并且该标识符在整个生命周期内保持不变。根据 Apple Developer Documentation,Bundle ID 用于绑定服务、证书和签名配置文件。
要点
Bundle Identifier — 是在操作系统和应用商店中唯一标识应用的字符串。在 iOS 和 macOS 中称为 Bundle ID,在 Android 中称为 Package Name,尽管功能上两者扮演相同的角色:确保应用在设备和商店中的唯一性。
操作系统使用 Bundle ID 来区分设备上的应用。两个具有相同标识符的应用无法同时安装 — 系统将它们视为同一产品。应用商店在发布时也会检查 Bundle ID 的唯一性。
Apple 在 2008 年随着 iOS SDK 的发布引入了 Bundle ID。反向域名表示法格式借鉴自 Java(包命名约定),用于防止类名冲突。Google 为 Android 采纳了这一做法,确保了两种移动生态系统的一致性。
| 平台 | 字段名称 | 示例 |
|---|---|---|
| iOS/macOS | Bundle Identifier | com.example.myapp |
| Android | Package Name | com.example.myapp |
| watchOS | Bundle Identifier | com.example.myapp.watchkit |
| tvOS | Bundle Identifier | com.example.myapp.tvos |
Bundle ID 由多个用点分隔的段组成。第一部分 — 开发者或公司的标识符(com、org、net)。第二部分 — 公司域名(example、google、apple)。后续段指定应用和平台的名称。
典型的 Bundle ID 看起来像 com.company.appname。Apple 建议使用域名的反向表示法以确保全局唯一性。如果公司没有域名,允许使用电子邮件:com.example.myapp 或 org.example.myapp。
Apple 支持 通配符 Bundle ID — 带星号的标识符模板:com.example.*。此类模板允许一家公司的多个应用使用一个 App ID。通配符 ID 在开发阶段很方便,但不建议用于生产环境,因为它限制了一些 Apple 服务的使用。
通配符限制:推送通知、CloudKit、应用内购买和 Game Center 需要精确(explicit)Bundle ID。使用 com.example.* 模板时,这些服务不可用。对于生产应用,请始终使用显式 Bundle ID 以确保所有 Apple 服务的完整功能。
除了通配符,Apple 还支持 前缀标识符,这些标识符在注册 Apple Developer Program 时分配给开发团队。前缀(Team ID)自动添加到所有 App ID 和签名配置文件中。两个不同的 Team ID 可以创建相同的 Bundle ID,但在设备上它们被视为不同的应用。
注册 Bundle ID — 发布应用前的必经阶段。在 Apple 生态系统中,注册通过 Apple Developer Portal 的 Certificates, Identifiers & Profiles 部分完成。在 Google Play 中,Bundle ID 在开发者控制台创建应用时指定。
在 Apple Developer 门户上,选择 Identifiers 部分,单击 Register 按钮并指定 App ID 类型。输入 Bundle ID 的确切名称并选择所需的功能:推送通知、CloudKit、Sign in with Apple。注册后,标识符可用于创建签名配置文件。
// 在应用代码中检查 Bundle ID
let bundleID = Bundle.main.bundleIdentifier
print("当前 Bundle ID:\(bundleID ?? "unknown")")
// 检查编译条件的 Bundle ID
if bundleID == "com.example.app.production" {
// 生产配置
Analytics.shared.configure(.production)
}
Google Play Console 不要求事先注册 Bundle ID。标识符在应用模块的 build.gradle 文件中指定,并且在整个 Google Play 中必须是唯一的。创建应用后,Package Name 无法更改,因此请仔细选择标识符并通过在 Google Play 中搜索来检查其唯一性。Google 不会释放已删除应用的标识符,因此一旦被占用的 Bundle ID 对其他开发者将保持不可用。
在 App Store Connect 中注册时,必须从现有已注册标识符集中指定一个 Bundle ID。如果标识符尚未在 Apple Developer 门户上注册,系统将建议自动创建它。注册后,Bundle ID 绑定到团队,并且无法在未联系 Apple 支持的情况下转移到其他开发者帐户。每个 Bundle ID 可以有多个用于不同环境的签名配置文件:Development、Ad Hoc、App Store。
为带有扩展的 iOS 应用注册 Bundle ID 时,每个组件必须单独注册。小部件、键盘、Notification Service 和 Watch App 的扩展拥有自己从主要标识符派生的标识符。App Store Connect 在创建 App Record 时将它们组合到一组中,从而允许将所有组件作为一个应用发布。
配置 Bundle ID 在 Xcode 中在多个位置进行:Info.plist、Build Settings 和 Signing & Capabilities。中心字段 — 应用目标中的 Bundle Identifier。从推送通知到 CloudKit 的所有 Apple 服务都绑定到此标识符。错误指定的 Bundle ID 会导致签名错误和无法在 App Store 中发布。
<!-- Info.plist — 项目的基本 Bundle ID -->
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<!-- Build Settings — PRODUCT_BUNDLE_IDENTIFIER 变量 -->
<!-- Debug: com.example.app.dev -->
<!-- Release: com.example.app -->
Xcode 在 Build Settings 中使用 PRODUCT_BUNDLE_IDENTIFIER 变量。对于不同的编译配置可以设置不同的值:Debug 为 com.example.app.dev,Release 为 com.example.app。这便于在同一设备上并行安装开发版本和生产版本进行测试。
如果应用有扩展(Notification Service、Widget、Watch App),每个扩展都会获得带有后缀的自己的 Bundle ID。主应用:com.example.app。小部件扩展:com.example.app.widget。Watch App:com.example.app.watchkit。每个标识符在 Apple Developer Portal 中单独注册并获取单独的签名配置文件。Xcode 在编译时自动管理这些依赖关系。
App Bundle ID(Apple)和 Package Name(Google)— 是具有相同目的但不同使用规则的类似实体,分别用于 iOS 和 Android 生态系统。两个标识符都使用反向域名表示法,并且在官方应用商店发布后无法更改。
在 Apple 生态系统中,Bundle ID 与签名配置文件和证书相关联。更换开发团队时,Bundle ID 可以通过 App Store Connect 在帐户之间转移。在 Android 中,Package Name 严格绑定到 Google Play 中的应用,无法在开发者帐户之间转移。
| 特性 | iOS Bundle ID | Android Package Name |
|---|---|---|
| 最大长度 | 无限制 | 150 个字符 |
| 段分隔符 | 点 (.) | 点 (.) |
| 允许的字符 | A-Z、a-z、0-9、点、连字符 | A-Z、a-z、0-9、点、下划线 |
| 通配符 | 支持 (*) | 不支持 |
| 在代码中的使用 | Bundle.main.bundleIdentifier | BuildConfig.APPLICATION_ID |
尽管存在差异,这两个标识符都起着关键作用:没有它们,就无法在官方商店中发布应用。建议对于跨平台项目 — 在 iOS 和 Android 版本中使用相同的标识符,以简化与 Firebase、Analytics 和其他服务的集成。这也方便了开发团队的导航:两个项目使用一个标识符减少了在配置 CI/CD 和环境设置时的混乱。
在使用 Flutter 或 React Native 进行开发时,统一的标识符尤为重要,因为代码库是共享的,许多自动编译工具期望两个平台使用相同的包名。Firebase 项目也绑定到 iOS 和 Android 的一个标识符,这简化了分析和错误报告的配置。
常见问题
更改 Bundle ID 在 App Store 或 Google Play 发布后是不可能的。系统会将新标识符视为完全不同的应用。要更新现有产品,Bundle ID 必须在应用的整个生命周期内保持不变。
iOS 或 Android 设备不允许安装具有相同标识符的第二个应用覆盖第一个。系统将显示错误并建议删除现有应用。在商店中,使用重复 Bundle ID 的发布也将被阻止。
使用您公司的 反向域名表示法:com.公司名.应用名。避免连字符和特殊字符。如果应用有扩展,通过点添加后缀。确保标识符唯一且未被其他开发者占用。
是的,每个扩展 — 小部件、Watch App、Notification Service — 都需要自己的 Bundle ID。标识符形成层次结构:com.example.app 为基础,com.example.app.widget 为小部件,com.example.app.watchkit 为 Watch。它们都在 Apple Developer Portal 中单独注册,并与父应用使用共同的 App ID。
Bundle ID — 是应用代码中的标识符字符串。App ID — 是 Apple Developer Portal 中的对象,它将 Bundle ID 与一组已启用的服务(capabilities)组合在一起。App ID 基于 Bundle ID 创建,用于生成签名配置文件。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。