项目能在模拟器里运行,却不知道交作业时该交什么文件。
最快解法:先检查项目,再用 Product > Archive 创建归档,最后按“只交文件、给同学安装,还是准备 TestFlight”选择导出或上传方式。没有兼容 Mac 时,代码可以在 Windows 或 Chromebook 上准备,但最终的 iOS 构建与 Archive 必须进入真实或远程 Mac 环境。
这篇教程适合刚完成第一个 SwiftUI 项目的学生:你需要把练习项目交给老师,或让同学实际测试。 如果你没有本地 Mac,或者能运行模拟器却分不清 Debug、Archive、导出文件和 TestFlight,也可以按下面的时间线操作。
第 1 步:先确定你真正要交付的结果
很多新手一打开 Xcode,就直接点击左上角的运行按钮。这个动作适合看界面和调试代码,却不一定能生成老师或同学需要的文件。
你可以先按下面的方式判断:
| 你的场景 | 应该使用的动作 | 最终可能交付的内容 | 新手评分 |
|---|---|---|---|
| 课堂上演示页面 | 点击 Run | 模拟器或设备上的运行结果、截图、演示视频 | ★★★★★ |
| 老师检查代码结构 | 保存源码并提交版本记录 | .xcodeproj、Swift 文件、资源和说明文档 | ★★★★☆ |
| 让同学安装测试 | Archive 后导出测试版本 | .ipa 或官方测试分发方式 | ★★★☆☆ |
| 准备 TestFlight | Archive 后上传 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 失败,不要直接认定代码没问题;模拟器和归档使用的构建目标并不完全相同。
再检查项目身份信息
在项目设置中确认以下内容:
- App 的显示名称是否正确。
Bundle Identifier是否是你自己的唯一标识。- Version 是否符合课程要求。
- Build 是否准备在下一次提交时递增。
- App 图标是否已经放入正确的资源目录。
- 当前 Scheme 的 Archive 动作是否启用。
- 项目使用的 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 动作,并重新查看构建日志。
第 4 步:在 Archives organizer 中选择交付路线
归档成功后,先不要急着点击所有按钮。你要根据交付对象选择路线。
只交给老师查看项目
如果课程要求是源码检查,通常不需要导出安装包。你应当提交:
- 项目源码;
- 使用的 Xcode 版本;
- 运行方式;
- 课程要求的截图或演示视频;
- 已知问题和未完成部分。
导出给老师或同学安装
如果老师明确要求在 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、签名能力和设备条件组合起来的配置文件。
如果你只是提交课程项目,优先使用自己的账号和自动签名;只有当学校、团队或课程明确要求时,才进入手动签名流程。官方证书类型和用途可以参考证书类型说明。
第 6 步:没有本地 Mac 时,用双轨方式完成打包
没有 Mac 不代表你不能学习 SwiftUI。你可以在 Windows 或 Chromebook 上完成代码编辑、素材整理、Git 提交和文档编写,但最终的 Xcode 构建仍然要在兼容的 Mac 环境中执行。
目前 Xcode 27 的官方要求包括 Apple silicon Mac;具体 macOS 兼容范围应以你实际安装的 Xcode 27 版本对应的系统要求页面为准。不同的 27.x 版本或预览版可能存在差异,不要只根据网上旧教程判断。
推荐采用下面的双轨流程:
- 在本地保存完整项目,不要只保存几段 Swift 代码。
- 提交一次“模拟器能运行”的版本。
- 准备项目说明、资源文件和测试账号说明。
- 通过安全方式把项目同步到远程 Mac。
- 在远程 Mac 上打开 Xcode 27,确认项目能加载。
- 选择正确 Scheme,先执行一次 Build 或 Run。
- 确认运行目标不是普通模拟器后,执行
Product > Archive。 - 在 Archives organizer 中验证归档,再决定导出或上传。
- 将导出的文件、日志和源码同步回本地保存。
如果你只是临时完成一次课程打包,可以先了解 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 的处理状态和版本关联 |
| 同学能安装但功能异常 | 分发成功,不等于真实测试完成 | 收集设备型号、系统版本和崩溃信息 |
常见问题
生成 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 版本和交付目标,通常是风险更低的做法。