使用Xcode把应用发布到TestFlight和App Store,通常涉及开发者账号权限、Bundle ID配置、证书与描述文件、Xcode中的Archive和Upload、App Store Connect中的测试与提审信息。整条链路较长,任何一处标识不一致或构建号重复,都会导致上传失败或构建版本无法选择。所以下文按照实操顺序拆开说明,并将高频错误归到对应步骤。

一、证书、Bundle ID与描述文件准备
发布前先确认在Apple Developer后台的Identifiers中已经注册了与Xcode项目完全一致的Bundle ID。显式Bundle ID不能使用通配符,否则推送、应用内购买等能力无法使用。进入App Store Connect同样要创建对应Bundle ID的App记录,如果两边不存在匹配记录,后续上传就会出现匹配不到应用的错误。
签名建议优先使用自动签名。在Xcode中打开项目的Signing & Capabilities面板,勾选Automatically manage signing,选择正确的Team。Xcode会依据当前设备的开发证书和发布证书自动生成Development或Distribution描述文件。只有在自动签名无法满足企业级或特殊能力需求时,才切换为手动签名,手动导入iOS Distribution证书和对应的App Store类型描述文件。
如果应用包含推送通知、HealthKit、Apple登录、Siri、银行卡读取等能力,必须同时在Identifiers中开启并更新描述文件。Xcode中未开启对应能力而服务器端或代码中使用了该能力,上传后可能不会立即报错,但在真机测试或审核阶段会暴露问题。
二、Archive与上传到TestFlight
真机运行只能验证开发环境,发布测试包必须先生成归档。选择Any iOS Device(arm64)作为目标设备,使用Product菜单下的Archive。完成后Xcode Organizer会显示归档记录,点击Distribute App,选择App Store Connect作为分发方式,再选择Upload。Xcode会先进行签名与包结构校验,校验通过后开始上传。
如果团队使用自动化流程,也可以在终端中用xcodebuild生成归档并导出IPA。下面命令先生成xcarchive,再通过Organizer或Transporter上传,适合CI环境。
xcodebuild archive -workspace MyApp.xcworkspace -scheme MyApp -archivePath ./build/MyApp.xcarchive
上传完成后不要急着刷新TestFlight页面。App Store Connect需要处理构建,通常几分钟到半小时不等。处理成功后,构建会出现在TestFlight标签下。若长时间不出现,先检查开发者账号邮箱是否收到构建处理失败邮件。内部测试员添加后无需Beta审核,外部测试员则必须进行一次Beta App Review,审核通过后才能邀请外部用户。
每次向同一个App Store版本上传新构建时,构建号必须递增。版本号可以保持相同,但构建号不能重复。例如CFBundleShortVersionString为1.0.0,CFBundleVersion可以从1依次增加到2、3。重复构建号会被服务端直接拒绝。
三、App Store提交与元数据配置
TestFlight测试稳定后,进入App Store Connect中对应App的App Store标签进行正式提审。这里要准备应用名称、副标题、描述、关键词、分类、年龄分级、版权信息、支持网址和隐私政策网址。截图需要按照苹果要求的尺寸上传,不同设备尺寸的截图缺失会导致提交按钮不可用。
在构建版本区域选择一个已经完成处理且通过TestFlight内部测试的构建。注意这里不能选择正在处理中的构建。选择后系统会要求填写出口合规信息、广告标识符使用声明、审核备注等。审核备注不是给最终用户看的,可以写清楚测试账号、演示路径、特殊功能说明,这对审核通过率帮助很大。
如果应用使用加密,需要正确回答出口合规问题。对于使用HTTPS、系统标准加密库、仅用于身份验证的场景,通常可以按苹果给出的豁免条件选择无需提供特殊文件。填写广告标识符时,只要使用了AdSupport、AppLovin、Google Mobile Ads等SDK获取IDFA,都需要如实申报。
四、高频错误与排查思路
上传阶段最常见的错误包括证书不受信任、描述文件缺少设备或Bundle ID不一致。证书不受信任通常发生在更换Mac或重新生成证书后,可打开Keychain Access查看iOS Distribution证书是否显示为有效,必要时删除过期证书并重新从Developer后台下载中间证书。描述文件问题可重新生成,并在Xcode中重新选择。
ITMS开头的错误码大多来自上传后的包结构或签名校验。例如ITMS-90034表示签名无效或缺失,ITMS-90683提示Info.plist缺少用途描述字符串。遇到类似错误时,先打开错误详情中的字段名,再回到Xcode搜索对应配置。与其反复猜测,不如用codesign命令直接查看包内签名信息。
codesign -dv --verbose=4 Payload/MyApp.app
构建版本不显示、选择不到构建、上传成功但App Store Connect找不到,这类问题多数与服务端处理时间、构建号冲突、以及App记录与上传Bundle ID不一致有关。先等待半小时,再检查构建号是否递增,最后确认App Store Connect中创建的App记录Bundle ID是否与Xcode工程完全一致。部分账号还需要修改App Store Connect的访问权限,只有开发者、管理员等角色有上传和提审权限。
最后要注意不要在Info.plist中遗漏隐私权限用途说明。iOS要求访问相机、相册、麦克风、位置、通讯录、跟踪等能力时提供NS开头的用途字符串,否则上传时可能被拦截,也可能在真机运行或审核时崩溃。建议上传前做一次完整检查,把权限声明、签名、构建号、元数据截图四项放在同一份上线检查清单里,能够显著减少TestFlight和App Store提审的往返次数。

