01MVP 早鸟价限时开放中,产品还在打磨中,感谢信任

00 / 00

Apple 与 iOS 配置

Apple 开发者账号、Bundle ID、Capabilities 和 iOS 发布前的完整配置路径

你将学到

  • iOS 发布链路中 5 层身份是怎么串联的
  • Apple Developer 账号该选 Individual 还是 Organization
  • Bundle ID 注册和 Capabilities 开启的完整步骤
  • Widget、App Group、Deep Link 和 Universal Links 的区别与适用场景

iOS 发布链路概览

从代码到 App Store,有 5 层身份必须逐一对齐。

代码层 — app.json

写入 App name、scheme、bundleIdentifier。这里定义了「这个 App 叫什么」。

账号层 — Apple Developer

决定谁拥有这个 App 身份。Individual 显示个人姓名,Organization 显示公司法律实体。

能力层 — Capabilities

开启登录、推送、Universal Links、App Group 等系统能力。只开当前需要的。

签名层 — EAS Build

准备证书和 provisioning profile,生成可安装的 .ipa 包。

分发层 — App Store Connect

TestFlight 内测、审核、正式发布。

只记一个判断标准:app.json 里的 expo.ios.bundleIdentifier、Apple Developer 里的 App ID、App Store Connect 里的 Bundle ID,必须是同一个值。

{
  "expo": {
    "name": "Your App",
    "slug": "your-app-mobile",
    "scheme": "yourapp",
    "ios": {
      "bundleIdentifier": "com.yourcompany.yourapp"
    },
    "android": {
      "package": "com.yourcompany.yourapp"
    }
  }
}

scheme 要和 EXPO_PUBLIC_APP_SCHEME 一致。服务端还要配置 NATIVE_APP_SCHEME,让 Better Auth 知道移动端回跳地址是可信的。这部分在 登录与 API 里会讲到。

Apple Developer 账号

iOS 真机分发、TestFlight、App Store 上架都需要 Apple Developer Program。免费 Apple Account 只适合本机调试,不能正式发布。

Individual — 个人开发者。App Store 里显示个人姓名,适合还没有公司主体的独立开发者。注册流程相对简单。

Organization — 公司或工作室。App Store 里显示公司法律实体名称,需要 D-U-N-S Number 和组织验证。

普通产品上架 App Store,个人选 Individual,公司选 Organization。中文里经常把 Organization 叫「企业账号」,但它和 Apple Developer Enterprise Program(大型组织内部分发,不做 App Store 上架)不是一回事。

Organization 要准备什么

材料用途
公司英文法律名称和 D-U-N-S、营业执照主体对应
公司英文注册地址用于组织验证
D-U-N-S NumberD&B 提供的九位组织编号
企业邮箱建议使用公司域名邮箱
公司官网页面里能看出公司主体和产品关系
申请人身份和职位Apple 可能核验你是否能代表公司签约
营业执照、身份证明、在职证明Apple 要求补材料时使用

中国大陆公司可以先在 D&B 的企业信息入口核验资料,再在 Apple 的 D-U-N-S 流程里查编号。填写时尽量使用英文公司名和英文注册地址,避免同一公司出现多套拼写。

账号通过后记录这些信息

这些信息不要放进 App 包,也不要写到公开环境变量里。建议放在团队内部文档或密码管理工具中:

  • Apple Developer Team ID
  • Account Holder 是谁
  • App Store Connect 里谁有 Admin / App Manager 权限
  • App Store Connect API Key 的保存位置
  • EAS project 使用哪个 Apple team
  • 证书、profile 和设备管理由谁负责

app.json 里不需要写 Apple 账号密码。EAS 构建时会通过登录流程或 API Key 处理签名和上传。

权限分工

操作需要谁能做
注册 App ID / App GroupApple Developer 后台有权限的成员
管理证书和 profileAccount Holder、Admin 或具备证书权限的成员
创建 App Store Connect app recordApp Store Connect Admin / App Manager
上传 TestFlight buildEAS Submit 或 Transporter 所用账号 / API Key
提交审核App Manager 或更高权限

如果你让 EAS 自动管理签名,第一次交互式构建最好由有足够 Apple Developer 权限的人来跑。

注册 Bundle ID

在 Apple Developer 后台注册 App ID 的步骤:

https://developer.apple.com/account/resources/identifiers/list
  1. 点击 Identifiers 旁的加号
  2. 选择 App IDsApp
  3. 选择 Explicit App ID(比 Wildcard 更适合正式产品,因为登录、推送、内购都需要明确绑定到具体 App 身份)
  4. 填入和 app.json 一致的 Bundle ID,例如 com.yourcompany.yourapp
  5. 勾选当前需要的 Capabilities
  6. 点 Register

注册完成后回到 app.json 确认 expo.ios.bundleIdentifier 完全一致。

开启 Capabilities

每个 Capability 都意味着一组系统权限、额外的签名要求和审核关注点。只开当前真正需要的能力。

能力什么时候接文档提醒
Sign in with AppleApp 内要支持 Apple 原生登录还要在 Better Auth / OAuth 配置里接回调
Push Notifications服务端要给 App 发远程推送Expo Go 无法完整验证,应该用 development build
Associated Domains要做 Universal Links,从网页自然打开 App还要配置网站端的 association 文件
App Groups主 App 和 Widget / extension 要共享数据主 App 和 Widget target 都要绑定同一个 group
In-App PurchaseApp Store 内购和订阅RevenueCat、商店产品和服务端会员权益要对齐

每多开一个 capability,都会增加签名、测试、审核和隐私说明的工作量。

Widget 与 App Group

默认 mobile 模板不带 Widget。如果你要加 iOS 小组件,至少需要三类 identifier:

com.yourcompany.yourapp          # 主 App
com.yourcompany.yourapp.widgets  # Widget
group.com.yourcompany.yourapp    # 共享容器

配置顺序:

  1. 注册主 App ID,勾选 App Groups
  2. 注册 Widget App ID,也勾选 App Groups
  3. 注册 group.com.yourcompany.yourapp
  4. 回到主 App ID 和 Widget App ID,把这个 App Group 都绑定上
  5. app.json 的相关 Expo plugin 里写入 Widget Bundle ID 和 group identifier

主 App 和 Widget 是两个 target,Bundle ID 不能共用。App Group 是它们之间的共享数据容器。

scheme 和 Universal Links 是两套不同的机制。

类型示例适合
Custom schemeyourapp://auth/callbackApp 内跳转、OAuth 回跳、开发期更容易跑通
Universal Linkhttps://yourapp.com/app/invite从网页、邮件、短信点击后自然打开 App

01MVP mobile 默认先用 EXPO_PUBLIC_APP_SCHEME 处理移动端回跳。等你需要从网页自然打开 App 时,再接 Associated Domains 和 Universal Links。

检查清单

  • Apple Developer Program 已开通,协议和付款状态正常
  • app.jsonexpo.ios.bundleIdentifier 和 Apple Developer App ID 完全一致
  • EXPO_PUBLIC_APP_SCHEMEapp.jsonexpo.scheme 一致
  • 服务端部署了对应的 NATIVE_APP_SCHEME
  • 只开启了当前需要的 Capabilities
  • Widget 有独立 Bundle ID(如果有的话)
  • App Group 已绑定到所有需要共享数据的 target(如果有的话)
  • 改 Capabilities 后重新做了 development build 或 preview build

参考资料

下一步

Bundle ID 和 Capabilities 就位后,下一步是 iOS 签名与 EAS 凭据 —— 理解 certificate、provisioning profile,让 EAS 生成可安装的包。

这篇文档有问题?