项目能在模拟器里运行,却不知道交作业时该交什么文件。

最快解法:先检查项目,再用 Product > Archive 创建归档,最后按“只交文件、给同学安装,还是准备 TestFlight”选择导出或上传方式。没有兼容 Mac 时,代码可以在 Windows 或 Chromebook 上准备,但最终的 iOS 构建与 Archive 必须进入真实或远程 Mac 环境。

这篇教程适合刚完成第一个 SwiftUI 项目的学生:你需要把练习项目交给老师,或让同学实际测试。 如果你没有本地 Mac,或者能运行模拟器却分不清 Debug、Archive、导出文件和 TestFlight,也可以按下面的时间线操作。

第 1 步:先确定你真正要交付的结果

很多新手一打开 Xcode,就直接点击左上角的运行按钮。这个动作适合看界面和调试代码,却不一定能生成老师或同学需要的文件。

你可以先按下面的方式判断:

<
你的场景应该使用的动作最终可能交付的内容新手评分
课堂上演示页面点击 Run模拟器或设备上的运行结果、截图、演示视频★★★★★
老师检查代码结构保存源码并提交版本记录.xcodeproj、Swift 文件、资源和说明文档★★★★☆
让同学安装测试Archive 后导出测试版本.ipa 或官方测试分发方式★★★☆☆
准备 TestFlightArchive 后上传 App Store Connect上传后的 build、测试说明和邀请方式★★☆☆☆
准备正式上架Archive、上传并完成商店资料App Store Connect 中的版本与审核材料★☆☆☆☆
Run 可以理解为“课堂草稿”:它帮助你确认代码暂时能跑。Archive 更像“交付成品”:它把项目整理成可以继续验证、导出或上传的归档。

官方文档明确说明,创建归档时需要在项目窗口中选择目标、Scheme 和运行目标,然后使用 Product > Archive;模拟器构建不能直接作为提交到商店的归档。可参考官方常见归档问题说明。

第 2 步:把 SwiftUI 项目整理到可构建状态

在创建 Archive 之前,不要先处理复杂的签名问题。先让项目处于“能够稳定打开和编译”的状态,否则后面看到的错误很难判断来源。

先运行一次模拟器

打开项目后,检查左上角选择的 Scheme 是否是你的 App,而不是测试目标、示例目标或其他扩展。Scheme 可以理解为一张“施工单”,它告诉 Xcode 本次要构建哪个目标、使用什么配置以及如何运行。官方对 Scheme 的作用有详细说明。

选择一个已安装的 iPhone 模拟器,点击 Run,观察结果:

  • 如果出现 Swift 编译错误,先修复代码。
  • 如果提示图片、颜色或字体找不到,检查资源是否加入正确的 Target Membership。
  • 如果 App 能打开但页面空白,检查入口视图、预览数据和本地资源路径。
  • 如果模拟器能运行,但后续 Archive 失败,不要直接认定代码没问题;模拟器和归档使用的构建目标并不完全相同。

再检查项目身份信息

在项目设置中确认以下内容:

  1. App 的显示名称是否正确。
  2. Bundle Identifier 是否是你自己的唯一标识。
  3. Version 是否符合课程要求。
  4. Build 是否准备在下一次提交时递增。
  5. App 图标是否已经放入正确的资源目录。
  6. 当前 Scheme 的 Archive 动作是否启用。
  7. 项目使用的 Team 是否是你有权限使用的开发团队。
Bundle Identifier 可以理解为 App 的身份证号。它不是随便填写的备注,而是系统和分发平台识别这个 App 的重要信息。官方准备分发文档列出了 Bundle ID、版本号、Build 字符串和图标等准备项,具体可查看[项目分发前准备说明](https://developer.apple.com/documentation/Xcode/preparing-your-app-for-distribution)。

先复制项目,或把当前可运行版本提交到 Git。这样即使你在远程 Mac 上修改签名、版本号或资源,也能回退到原本能运行的版本。

第 3 步:从 Debug 运行切换到 Archive

你已经完成一次模拟器运行,现在进入真正的打包步骤。

选择正确的 Scheme 和运行目标

在 Xcode 顶部工具栏中,确认选择的是你的 App Scheme。然后打开运行目标菜单,不要继续选普通 iPhone Simulator。

如果你有连接的真实 iPhone,可以选择它;如果只是创建归档,也可以选择适合 Archive 的真实设备或 build-only 目标。官方技术说明指出,使用模拟器 SDK 构建的 App 不能归档,也不能直接提交到 App Store。

这一步的停止条件是:

  • Product > Archive 可点击;
  • Scheme 对应的是你的 App;
  • 运行目标不是普通模拟器;
  • 项目没有未解决的编译错误。

执行 Product > Archive

点击菜单栏中的 Product > Archive。Xcode 会进行一次面向归档的构建,完成后打开或更新 Archives organizer。

这里不要把“等待时间较长”直接当成失败。首次归档可能需要重新编译依赖、处理资源和生成符号文件。你应该观察构建日志:

  • 出现红色错误:停止,回到错误所在文件排查。
  • 只有警告:先记录警告内容,再判断是否影响课程要求。
  • 成功生成 Archive:进入 Archives organizer,不要立即关闭 Xcode。
  • Archive 没有出现在列表中:检查 Scheme 是否启用了 Archive 动作,并重新查看构建日志。
归档文件不是一个普通的源码压缩包。它是 Xcode 为后续验证、导出或上传准备的项目产物,通常需要在 Archives organizer 中继续操作。

第 4 步:在 Archives organizer 中选择交付路线

归档成功后,先不要急着点击所有按钮。你要根据交付对象选择路线。

只交给老师查看项目

如果课程要求是源码检查,通常不需要导出安装包。你应当提交:

  • 项目源码;
  • 使用的 Xcode 版本;
  • 运行方式;
  • 课程要求的截图或演示视频;
  • 已知问题和未完成部分。
这种交付的重点是“老师能复现你的项目”,而不是把 App 安装到老师的手机上。

导出给老师或同学安装

如果老师明确要求在 iPhone 上安装,你可以在 Archives organizer 中选择归档,然后点击 Distribute App,再按照界面提供的方式导出。

导出后的目录可能包含多个文件,其中 iOS App 文件通常带有 .ipa 扩展名。官方文档说明,导出后的 App 文件可以通过 Xcode 或 Apple Configurator 2 安装到设备,但设备、签名、配置文件和开发者权限必须匹配,不能把 .ipa 当成普通压缩包直接双击安装。具体步骤可参考注册设备与导出 App 的官方说明。

让同学通过 TestFlight 测试

TestFlight 适合多人测试和持续收集反馈,但它不是“只要点击上传就能马上安装”。

你需要先在 App Store Connect 中创建 App 记录,再上传 build。官方流程要求在上传 build 前先建立对应的 App record,详见创建 App 记录的官方说明。

上传后,还要等待处理,再建立测试组并邀请测试者。外部测试通常还涉及测试资料和审核流程,详细边界可查看TestFlight 测试流程。

TestFlight 构建最多可测试 90 天;官方当前说明外部测试者上限为 10,000 人,内部测试者上限为 100 名具备相应 App Store Connect 权限的用户。这些数字会随官方规则变化,准备课程项目时不要把它们当成你必须使用的目标。

第 5 步:处理签名、设备和账号边界

新手最容易在这里走偏:项目能编译,并不等于任何设备都能安装。

自动签名适合第一次打包

在项目的 Signing & Capabilities 中,你通常会看到自动管理签名的选项。它可以根据你选择的 Team,帮助 Xcode 生成或更新部分开发配置。

官方文档说明,自动签名可以由 Xcode 管理配置文件;如果采用手动签名,则需要在开发者账号中选择 App ID、证书和设备,并生成对应的配置文件。可查看官方签名与设备配置说明。

你只需要掌握这几个概念:

  • 签名:证明这个 App 是由某个开发团队构建的。
  • Bundle Identifier:标识你的 App。
  • 设备注册:告诉分发系统哪些设备可以安装某些测试版本。
  • Provisioning Profile:把 App、签名能力和设备条件组合起来的配置文件。
不要使用他人的 Apple 账号、证书或私钥,也不要从不明来源下载配置文件。这样做可能让项目暂时“能装上”,但你无法确认文件是否安全,也会给后续提交和账号管理留下问题。

如果你只是提交课程项目,优先使用自己的账号和自动签名;只有当学校、团队或课程明确要求时,才进入手动签名流程。官方证书类型和用途可以参考证书类型说明。

第 6 步:没有本地 Mac 时,用双轨方式完成打包

没有 Mac 不代表你不能学习 SwiftUI。你可以在 Windows 或 Chromebook 上完成代码编辑、素材整理、Git 提交和文档编写,但最终的 Xcode 构建仍然要在兼容的 Mac 环境中执行。

目前 Xcode 27 的官方要求包括 Apple silicon Mac;具体 macOS 兼容范围应以你实际安装的 Xcode 27 版本对应的系统要求页面为准。不同的 27.x 版本或预览版可能存在差异,不要只根据网上旧教程判断。

推荐采用下面的双轨流程:

  1. 在本地保存完整项目,不要只保存几段 Swift 代码。
  2. 提交一次“模拟器能运行”的版本。
  3. 准备项目说明、资源文件和测试账号说明。
  4. 通过安全方式把项目同步到远程 Mac。
  5. 在远程 Mac 上打开 Xcode 27,确认项目能加载。
  6. 选择正确 Scheme,先执行一次 Build 或 Run。
  7. 确认运行目标不是普通模拟器后,执行 Product > Archive。
  8. 在 Archives organizer 中验证归档,再决定导出或上传。
  9. 将导出的文件、日志和源码同步回本地保存。
远程桌面适合操作 Xcode 图形界面;SSH 更适合查看目录、同步文件和执行你明确知道作用的命令。SSH 本身不是 iOS 构建工具,也不能绕过 Xcode、签名或账号规则。

如果你只是临时完成一次课程打包,可以先了解 MACGPU 的远程 Mac 使用入口,再确认需要的 Xcode 版本、项目同步方式和文件交接流程。不要在没有测试项目的情况下直接把整晚时间押在正式提交上,先用一个最小 SwiftUI 项目完成“打开、编译、Archive”三项验证。

第 7 步:提交前完成课程级验收

最后一次检查不要只看“我的电脑能不能运行”。你需要区分三种结果:

  • 自己电脑能运行:说明本地开发环境暂时正常。
  • 模拟器能运行:说明当前调试构建可以启动。
  • 同学设备能安装:说明导出、签名、设备或测试分发链路也成立。
提交前可以逐项勾选:
  • [ ] 项目源码已经复制或提交,能够回退到可运行版本。
  • [ ] 使用的是正确的 App Scheme,而不是测试目标。
  • [ ] 模拟器运行正常,主要页面没有明显崩溃。
  • [ ] Bundle Identifier、Version 和 Build 已按课程要求填写。
  • [ ] App 图标、资源文件和本地数据都已包含。
  • [ ] Archive 已成功生成,并出现在 Archives organizer。
  • [ ] 导出文件能够打开或被后续安装流程识别。
  • [ ] 如果使用 TestFlight,App Store Connect 中的 App 记录已经创建。
  • [ ] 已写清老师或同学的安装方法。
  • [ ] 已说明需要的设备类型、系统版本和账号条件。
  • [ ] 已保存源码、Archive、导出文件和提交说明。
  • [ ] 没有共享账号、证书、私钥或来源不明的配置文件。

用两张表快速判断你的路线

<
交付目标需要 Archive 吗需要签名或账号吗推荐结果
只交源码不一定通常不需要源码加运行说明
课堂演示通常不需要视设备而定Run、截图或录屏
老师在设备上测试建议需要通常需要Archive 后导出测试版本
同学多人测试需要需要相应分发条件上传 TestFlight
正式提交商店需要需要完整分发资格上传后选择版本并提交审核
<
检查结果代表什么下一步
Run 成功,Archive 失败调试构建可用,但归档条件未满足检查运行目标、Scheme、Archive 配置和构建日志
Archive 成功,导出失败项目产物存在,但签名或分发条件不完整检查 Team、证书、配置文件和分发方式
导出成功,设备无法安装文件存在,但设备或系统条件不匹配核对设备注册、系统版本和安装方法
上传成功,TestFlight 看不到build 仍在处理或 App 记录不完整查看 App Store Connect 的处理状态和版本关联
同学能安装但功能异常分发成功,不等于真实测试完成收集设备型号、系统版本和崩溃信息
如果你经常遇到“项目能打开,但 Archive 总失败”,可以先选择一个兼容的 [MACGPU 远程 Mac 方案](https://macgpu.com/zh/m4-dinggou.html),用最小项目验证 Xcode 版本、连接方式和文件同步,再决定是否把完整课程项目迁移过去。

常见问题

生成 iOS App 归档时,应该从哪里开始?

先选择正确的 App Scheme,再选择真实设备或适合归档的 build-only 运行目标。确认 Product > Archive 可用后执行归档,成功结果会出现在 Archives organizer。普通模拟器能够运行,并不代表它可以直接生成可提交的 iOS App 归档。

SwiftUI 项目交给老师测试时,应该准备哪些文件?

先确认老师要的是源码、模拟器演示,还是能够安装到 iPhone 的测试版本。需要安装时,从 Archives organizer 选择归档并点击 Distribute App,再根据签名、设备和账号条件选择导出方式,同时把版本号、安装方法和已知问题写进提交说明。

没有本地 Mac,完成 iOS App 构建有哪些办法?

代码、素材和项目文档可以在 Windows 或 Chromebook 上准备,但 Xcode 27 的 iOS 构建和 Archive 需要在兼容的 Mac 上完成。你可以使用学校 Mac、本地 Mac 或远程 Mac;远程连接只负责操作,真正的构建仍由 Mac 上的 Xcode 执行。

为什么 Run 成功后,Archive 仍然可能失败?

Run 面向开发调试,主要把 Debug 构建运行在模拟器或设备上。Archive 面向交付,会生成可在 Archives organizer 中继续验证、导出或上传的归档。前者回答“代码现在能不能跑”,后者回答“项目能不能进入分发流程”。

课程作业只要求提交项目时,哪些步骤可以省略?

先保存源码并提交可运行版本,再检查 Scheme、Bundle Identifier、Version、Build、图标和资源。之后根据老师要求决定是否 Archive;如果只看代码,可以不做完整分发。如果需要设备测试,再继续处理导出、签名、安装或 TestFlight,并附上清晰的测试说明。

给没有兼容 Mac 的学生的最后判断

如果你当前只是提交源码或课堂截图,继续使用现有电脑通常更省事;如果老师要求真实 iPhone 测试,而你只能在 Windows 上运行模拟器,那么当前方案的缺点会很明显:无法直接打开 Xcode、无法执行 Archive、签名问题难以验证,临近截止日期时还容易把代码同步和构建排错混在一起。

完成“项目能打开、能编译、能归档”这三个验收点后,临时租用 MACGPU 的远程 Mac 会更适合一次性课程任务:你可以把本地项目带进去,在真实 macOS 环境完成 Xcode 27 的构建,再把源码和导出文件带回本地。若你需要长期高频开发、持续运行大型项目,购买或长期使用自己的 Mac 可能更合适;但对只想完成一次课程打包、又不想立即购买设备的学生,先验证远程 Mac 是否匹配你的 Xcode 版本和交付目标,通常是风险更低的做法。