教程 / 发布与基础设施 / 使用应用专用密码上传
📝 文字 ● 初级 更新于 2026-05-25

使用应用专用密码上传至 TestFlight 或 App Store

上传构建版本不需要 App Store Connect API 密钥。LingCode 的归档与分发面板仅凭 Apple ID 和应用专用密码即可完成上传——配置最简单,体验最接近 Xcode Organizer 的一键操作。

为什么需要密码——Organizer 不是直接可用吗?

0

Xcode 的 Organizer 之所以看起来无需凭据,是因为它悄悄复用了你登录 Xcode 时使用的 Apple ID 账户(Settings > Accounts),并在内部维持了该认证会话。Xcode 之外的任何工具——包括 LingCode 所驱动的 xcrun altool 上传器——都无法借用这个会话,必须提供自己的凭据。Apple 为此提供了两种选择:

  • App Store Connect API 密钥——一个 .p8 文件,附带 Key ID 和 Issuer ID。用于自动化流程非常可靠,但需要先在开发者门户中创建。(详见设置 App Store Connect API 密钥。)
  • Apple ID + 应用专用密码——一次性生成、与你的普通 Apple ID 绑定的专属密码。这正是本教程所介绍的方式。

为什么不能直接输入真实的 Apple ID 密码?因为你的账户启用了双重认证,而命令行上传工具无法响应 2FA 验证提示。应用专用密码是 Apple 的解决方案:它是一个有限范围、可随时撤销的密码,可绕过单一工具的 2FA 验证。它并不降低安全性——你可以随时撤销,而且它无法用于在浏览器中登录你的账户。

如何选择?如果只是从自己的 Mac 上发布,用应用专用密码就够了——配置更简单。如果要接入 CI 或共享构建机器,则使用 API 密钥——不依赖个人 Apple ID。

第 1 步——生成应用专用密码

1

整个过程大约一分钟,只需操作一次:

  • 前往 account.apple.com,用与 Apple Developer 账户相同的 Apple ID 登录。
  • 打开登录与安全部分,选择应用专用密码
  • 点击生成应用专用密码(即 +),输入一个便于识别的标签(如 LingCode upload),然后确认。
  • 复制显示的密码——格式类似 xxxx-xxxx-xxxx-xxxx此密码只显示一次。请立即复制。
必须启用双重认证。"应用专用密码"选项仅在 Apple ID 开启 2FA 后才会显示。每个 Apple Developer 账户都已默认启用,如果你看不到该选项,说明你登录的 Apple ID 有误。Apple 官方参考:support.apple.com/102654

第 2 步——归档

2

在 LingCode 中,打开文件菜单 > 归档与导出…。弹出的面板名为归档与分发,结构与 Xcode Organizer 一致:从上到下分为三个步骤。

点击 1 · 归档。此步骤会执行 Release 构建,生成 .xcarchive——一个持久的、自包含的构建产物。这是最耗时的步骤(完整的优化编译),因此只需执行一次。如果之前已经生成过归档,LingCode 会在打开时自动检测到,按钮会显示为重新归档——你可以直接跳到导出步骤。

为什么要单独归档:一个归档可以被多次导出和分发。今天上午导出 Ad Hoc 版给测试人员,下午再将同一归档上传至 TestFlight——无需第二次编译。只有在代码真正发生变化时才需要重新归档。

第 3 步——使用 App Store 方式导出

3

2 · 导出下,将方式设置为 App Store,然后点击导出。此步骤将归档转换为实际可上传的产物——iOS 的已签名 .ipa 或 macOS 的 .pkg——并按 App Store Connect 的要求打包。

只有 App Store 方式产生的包才会被 TestFlight 接受。Development 和 Ad Hoc 导出仅用于直接安装到设备;App Store Connect 会拒绝它们。因此,下方的上传步骤只有在完成 App Store 导出后才会激活。

"归档 vs 导出"一句话总结:归档是构建应用;导出是针对特定目标签名并打包。两者都完成后才能上传——仅有归档只会得到一个 .xcarchive,任何设备都无法安装。

第 4 步——上传

4

App Store 导出完成后,3 · 上传至 App Store Connect 面板将变为可用状态。保持身份验证选项为 Apple ID(默认),然后:

  • 输入你的 Apple ID 邮箱——与第 1 步使用的账户相同。
  • 粘贴你生成的应用专用密码。LingCode 会将其存储到 Keychain 中,只需粘贴一次。
  • 点击上传至 App Store Connect

LingCode 会对刚才导出的产物运行 xcrun altool --upload-app——无需第二次归档或重新导出。上传成功后,构建版本将出现在 App Store Connect 的 TestFlight 下,Apple 处理通常需要 5–30 分钟。

上传后去哪找?上传成功不会立即发送邮件通知。请打开 App Store Connect > 你的应用 > TestFlight,等待构建版本从"处理中"变为就绪状态。

上传失败时怎么办

5

LingCode 会解析 altool 的输出并给出具体原因。以下是最常见的几种:

  • "Redundant Binary Upload" / ITMS-90189——该版本的此构建号已存在于 App Store Connect。请递增构建号并重新归档。(此处必须重新归档,因为构建号已编入二进制文件中。)
  • 身份验证失败——应用专用密码输入有误、已被撤销,或误用了真实的 Apple ID 密码。请重新生成一个应用专用密码(第 1 步)并重新粘贴。
  • "No matching profiles found" / 签名错误——应用记录尚未创建,或该 Bundle ID 没有对应的发布配置文件。请先在 App Store Connect 中创建应用记录;参见首次提交 iOS 应用至 App Store
  • Info.plist 缺少值 / ITMS-90713——Apple 会指明具体缺少的键(例如某个使用说明字符串)。将其添加到目标的 Info.plist 中,然后重新导出。

完整的 xcodebuild 和 altool 日志会写入项目目录下的 build/export.log,面板上的查看日志按钮可直接跳转至该文件——当单行错误信息不够详细时非常有用。

更倾向于使用 API 密钥?

6

如果你将身份验证选项切换为 API 密钥 (.p8),上述所有步骤同样适用——此时需要输入 Key ID、Issuer ID、Team ID,并选择你的 AuthKey_*.p8 文件,而不是 Apple ID。当你不希望绑定个人 Apple ID(CI 环境、共享构建机器),或者已经在为 LingCode Agent 管理密钥时,建议使用这种方式。一次性密钥创建流程详见设置 App Store Connect API 密钥

获取 LingCode →

下一步