> ## Documentation Index
> Fetch the complete documentation index at: https://docs.devinenterprise.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 使用 Devin 构建 iOS 应用

> 在 macOS VM 上使用 Devin 构建 iOS 应用：构建、测试与 TestFlight

在本教程中，Devin 将从一个空的代码仓库开始，构建一个小型 SwiftUI 习惯打卡应用。Devin 会编写代码、用 Xcode 构建、在 iOS 模拟器 中运行，并提交一个 pull request。你可以全程观察它的工作、审查结果，然后让 Devin 把 beta 版本发布到 TestFlight。

<Frame>
  <img src="https://mintcdn.com/cognitionai-enterprise/U1cPD7hedYbOv-HZ/images/onboard-devin/macos-ios-app.gif?s=b5ea4c9e343894faddc9ca8ea7ce8121" alt="Devin 在 macOS VM 上构建 iOS 游戏" width="1864" height="1080" data-path="images/onboard-devin/macos-ios-app.gif" />
</Frame>

<div id="before-you-start">
  ## 开始之前
</div>

* **macOS VM**：Devin 的会话需要在 macOS 上运行。如果你使用的是 Dedicated SaaS 部署，请联系你的账户团队启用 macOS VM。参见 [macOS 支持](/zh/onboard-devin/environment/macos-support)。
* **一个代码仓库**：创建一个空的代码仓库 (例如 `habit-tracker`) ，并通过你的 [Git integration](/zh/onboard-devin/environment#before-you-start) 授予 Devin 访问权限。
* **Desktop mode**：在 [Settings > Customization](https://app.devin.ai/customization) 中开启 **Enable desktop mode**，这样 Devin 才能与模拟器交互并录制测试过程。参见 [Computer Use](/zh/work-with-devin/computer-use)。

<Info>
  macOS 会话与 Linux 会话消耗的用量相同，不会额外收取 macOS 费用。
</Info>

<div id="step-1-prompt-devin-to-build-the-app">
  ## 步骤 1：提示 Devin 构建应用
</div>

在你选择的代码仓库中启动一个新会话，并在提示输入框下方的平台菜单中选择 **macOS**。Xcode、iOS 模拟器 和 Homebrew 均已预装，无需任何前期配置。

<Note>
  在 Slack 中，请在消息里加上 `!mac` [bang 命令](/zh/integrations/slack)。通过 [API](/zh/api-reference/overview) 创建会话时，设置 `platform: "macos"`。
</Note>

给 Devin 一个具体的提示，说明应用要具备哪些功能、使用什么工具，以及如何验证它能正常运行。下面是一个示例：

```text theme={null}
在这个代码仓库中构建一个名为 HabitTracker 的 SwiftUI iOS 应用。

需求：
- 目标平台为 iOS 17+。使用 SwiftUI 和 Observation 框架。
- 主界面：习惯列表，每项包含名称、一个 SF Symbol 图标，以及
  一个用于标记今天已完成的勾选按钮。
- 在每个习惯旁显示当前连续天数（连续完成的天数）。
- 工具栏上的 "+" 按钮打开添加习惯的 sheet。支持滑动删除。
- 暂时将习惯保存在内存中，先不做持久化。

项目配置：
- 使用 Homebrew 安装 xcodegen、swiftlint 和 xcbeautify。
- 使用 XcodeGen 在 project.yml 中定义项目。提交 project.yml，
  并将生成的 .xcodeproj 添加到 .gitignore。
- 添加一个单元测试 target，用 XCTest 测试连续天数的计算。
- 确保 swiftlint 检查通过。

验证：
- 在 iPhone 17 模拟器上构建并运行测试。
- 在模拟器中安装并启动应用。添加两个习惯，将其中一个标记为
  已完成，再删除一个。记录这一过程，并发给我主界面的截图。
- 提交一个 PR，附上简短的总结和截图。
```

一个优秀的 iOS 提示应当:

* **明确平台版本和框架**,这样 Devin 就不必猜测部署目标或架构。
* **明确模拟器设备**,这样构建命令使用的目标设备在 VM 上确实存在。
* **描述具体的验证流程**,这样 Devin 会测试你真正关心的行为,而不是只检查能否编译通过。

<div id="step-2-watch-devin-build-and-test">
  ## 步骤 2:观察 Devin 构建与测试
</div>

Devin 处理这个任务的方式和 iOS 开发者差不多:

1. **搭建项目骨架**:编写 `project.yml`、SwiftUI 视图、习惯数据模型以及测试 target,然后运行 `xcodegen generate`。

2. **构建并修复错误**:在 shell 中运行 `xcodebuild`,读取编译器输出,不断修复错误,直到构建和测试全部通过。

3. **在模拟器中运行应用**:启动设备,然后安装并启动构建产物:

   ```bash theme={null}
   xcrun simctl boot "iPhone 17"
   xcrun simctl install booted <path-to-HabitTracker.app>
   xcrun simctl launch booted <bundle-id>
   ```

4. **测试你描述的流程**:借助 [Computer Use](/zh/work-with-devin/computer-use) 在应用里逐步点击操作,在屏幕上核对结果,并[录制](/zh/work-with-devin/testing-and-recordings)整个过程。

5. **提交 pull request**,附上摘要和截图。

在会话工作区中打开 **iOS 模拟器** 选项卡,即可实时查看 Devin 点击操作应用时模拟器的画面。

<Tip>
  如果构建找不到目标设备,可以让 Devin 运行 `xcrun simctl list devices available`,并使用 VM 中实际存在的设备和系统版本。
</Tip>

<div id="step-3-review-and-iterate">
  ## 步骤 3：审查并迭代
</div>

像审查其他 pull request 一样审查它。检查截图和录屏是否符合你的要求。然后在同一会话中通过后续提示继续开发：

```text theme={null}
使用 SwiftData 持久化习惯和完成记录，使其在应用重启后依然保留。添加一个测试，
将一个习惯插入内存中的模型容器并验证连续天数。在模拟器中重启应用，确认习惯已持久化，
然后推送到同一个 PR。
```

```text theme={null}
添加一个 UI 测试 target，其中包含一个 XCUITest：添加一个习惯，将其标记为已完成，
并检查连续天数是否显示为 1。在 iPhone 17 模拟器上运行该测试。
```

```text theme={null}
支持深色模式和动态字体。在模拟器中检查主界面在深色外观下以及最大
无障碍字号下的显示效果，并发送两种情况的截图。
```

你也可以在 pull request 上留下 review comments，只要会话处于活跃状态，Devin 就会对这些评论作出响应。参见 [GitHub 集成](/zh/integrations/gh) 和 [Devin Review](/zh/work-with-devin/devin-review)。

<div id="step-4-ship-a-beta-to-testflight">
  ## 步骤 4：将测试版发布到 TestFlight
</div>

app 能在模拟器中正常运行后，Devin 可以对其进行归档、签名，并将构建产物上传到 TestFlight，让测试人员在真机上安装。

这需要你自己完成一些一次性设置。[将 iOS 构建上传到 TestFlight](/zh/onboard-devin/environment/testflight) 逐步介绍了这些操作：

1. **配置 App Store Connect**：接受协议、注册 bundle ID、创建 app 记录、创建 beta 组，并回答出口合规问题。
2. **创建 App Store Connect API 密钥**，并下载其 `.p8` 文件。
3. **添加 Devin secrets**：`ASC_KEY_ID`、`ASC_ISSUER_ID`、`ASC_PRIVATE_KEY` 和 `APPLE_TEAM_ID`。
4. 如果你的组织启用了受限的 网络策略，请**允许**访问 Apple 服务器的网络。

<Note>
  在 `project.yml` 和 App Store Connect 中使用相同的 bundle ID。如果 Devin 在步骤 1 中选用了占位的 bundle ID，请先让它更新项目。
</Note>

然后启动一个新会话，使 secrets 生效，并向 Devin 发出提示：

```text theme={null}
归档 HabitTracker scheme 并上传到 TestFlight。构建号要高于 App Store Connect
中最新的构建版本，把该构建添加到 "QA" beta 组，
完成后把构建号发给我。
```

Devin 会将 API 密钥写入磁盘，使用 `xcodebuild archive` 归档应用，并通过 `xcodebuild -exportArchive` 上传。随后它会将处理完成的构建添加到 beta 组。若想复用这些步骤，而不必在每次提示中重复说明，可在蓝图的 `knowledge` 部分添加一个 `testflight` 条目。参见[在蓝图中保存这些步骤](/zh/onboard-devin/environment/testflight#save-the-steps-in-your-blueprint)。

<div id="tips">
  ## 提示
</div>

* **固定工具链**：macOS 镜像包含多个 Xcode 版本，可在蓝图中使用 `DEVELOPER_DIR` 或 `xcode-select` 指定所需版本。参见[选择 Xcode 版本](/zh/onboard-devin/environment/macos-support#selecting-an-xcode-version)。
* **将凭据存为 secrets**：App Store Connect API 密钥、签名证书以及私有包注册表令牌都应存放在 [Secrets](/zh/product-guides/secrets) 中，Devin 会以环境变量的形式读取。
* **放行包注册表**：如果你的组织启用了受限网络策略，请确保 macOS 允许列表中包含 Swift Package Manager、CocoaPods 以及应用所需的任何私有包注册表。参见[网络访问](/zh/onboard-devin/environment/macos-support#network-access)。
* **唤醒后重启模拟器**：会话休眠再唤醒后，文件会保留，但运行中的进程不会。请让 Devin 在测试前重新启动模拟器。
* **索取证据**：要求提供特定界面的截图或录屏，这样你无需亲自运行应用即可检查 UI。

<div id="limitations">
  ## 限制
</div>

* Devin 在模拟器上运行应用，而非真实的 iPhone 或 iPad。若需在真机上测试，请安装 [TestFlight](#step-4-ship-a-beta-to-testflight) 构建版本。
* 在 VM 内得到的计时和性能分析结果无法反映真机的实际性能。
* 在 macOS VM 上，容器通过软件模拟运行，因此大量依赖容器的工作会很慢。

详见 [macOS 支持的限制](/zh/onboard-devin/environment/macos-support#limitations)。

<div id="next-steps">
  ## 后续步骤
</div>

<CardGroup cols={2}>
  <Card title="TestFlight 上传" icon="paper-plane" href="/zh/onboard-devin/environment/testflight">
    上传构建版本所需的 App Store Connect 配置、API 密钥和 secrets
  </Card>

  <Card title="macOS 支持" icon="apple" href="/zh/onboard-devin/environment/macos-support">
    macOS 会话的蓝图选项、预装工具与问题排查
  </Card>

  <Card title="测试与录制" icon="video" href="/zh/work-with-devin/testing-and-recordings">
    Devin 如何测试你的应用并记录测试结果
  </Card>
</CardGroup>
