开发 iOS 应用,不一定非要一台 Mac

认识 EAS Simulator——Expo 推出的新服务,让每位开发者和每个编码 agent 都能在云端拥有一台 iPhone。

中文
复制
Rami looking surprised beside an iPhone marked Live, a Windows logo, and the words Running on Windows

全世界近四分之三的桌面设备都不是 Mac。借助 Expo,你本来就可以通过 EAS Build 在任意一台设备上构建 iOS 应用。但在 agentic 开发时代,我们遇到了另一个瓶颈:agent 需要即时反馈,才能持续迭代代码改动。iOS Simulator 只随 Xcode 提供,而 Xcode 只能在 macOS 上运行,所以没有 Mac,你或你的 agent 做的每一次改动都只能拿到真机 iPhone 上验证。EAS Simulator 让这一切不再必要。

从功能上说,EAS Simulator 在云端运行一个模拟器会话,并将其串流到浏览器标签页。这项服务所解锁的东西将改变移动软件的构建方式:任何一台笔记本都能变成 iOS 开发机,任何编码 agent 都能拿到一台真实设备来验证自己的工作,而任何拿到 URL 的人都能和你一起操控同一部手机。

我们的工程师 Keith Kurak 把 EAS Simulator 带到了一个我们谁都没试过的地方:在一台 Windows on ARM 笔记本上运行带 Fast Refresh 的 iOS Simulator。本文介绍 Keith 演示的内容,以及我一直在用来开发应用的五项能力。

更想看视频?精简版在这里:

Keith 演示了什么:在 Windows 机器上做 iOS 开发

以下是 Keith 发布的内容:

X 上的帖子

Windows on ARM 跑不了 Android Studio,而微软在 Snapdragon X 上砍掉了 Windows Subsystem for Android。那台笔记本上没有任何模拟器或仿真器。现在它有了一个浏览器标签页里的 iPhone,VS Code 里的改动通过 Fast Refresh 直接落到上面。

只需要两条命令。你需要一个面向模拟器的开发构建,因为 release 构建不会热重载:它的 JavaScript 在构建时就固定了。然后用隧道启动 Metro,再启动指向它的会话:

EXPO_UNSTABLE_TUNNEL_V2=1 npx expo start --tunnel

eas simulator:start --platform ios --type agent-device \
  --build-id <your-build-id> \
  --open-url "<your-scheme>://expo-development-client/?url=<encoded-metro-url>" \
  --name "windows hot reload" --non-interactive

这条命令会给你一个 webPreviewUrl。打开它,你的应用就跑在云端 iPhone 上了。改一个文件、保存,改动就出现在设备上。Keith 是在 WSL 里跑的。完整的操作步骤,包括 Expo Go 的版本,都在运行与控制文档里。

光这一点就改变了你能从 Windows 或 Linux 机器上构建什么。但 EAS Simulator 还有五件事你应该知道:

1. 在模拟器上测试相机应用

我正在做一个叫 OpenMulticam 的相机应用。它同时从多个 iPhone 摄像头录制,而测试它一直需要真机,因为模拟器从来没有摄像头。EAS Simulator 的网页预览改变了这一点。它的工具面板里有一个 Camera 区域,打开之后,应用就会收到模拟的摄像头画面。

OpenMulticam 在 EAS Simulator 网页预览中的云端 iPhone 上运行,模拟摄像头画面正在显示,角标写着 Simulated Camera Back(serve-sim)

按下录制、停止,然后打开这条素材。整条相机采集流水线都跑在云端的一台设备上,而你只需在浏览器标签页里操作它。

在云模拟器上,OpenMulticam 正在录制,计时器正在计时
OpenMulticam 中已保存的拍摄:2026 年 9 月 3 日上午 8:04,1080 × 1920,30 fps,带有 Share 和 Save to Photos 按钮

有两点需要注意。默认画面源是一段动画测试图案,你也可以把电脑里的视频或照片拖进面板当作画面源。你的 app 必须使用标准的 AVFoundation 采集 API,注入才能生效,大多数相机库都是这么做的。

有一个限制需要说明:目前相机面板还是要在浏览器里点击操作,尚未开放给 agent,所以 agent 无法自行注入相机。本文提到的其他功能,agent 都能做。

2. 让 agent 自己验证工作成果

云端 agent 或你本地的编码 agent 可以通过 agent-device 驱动模拟器。Argent 也可以,如果你更习惯 computer use,同样能用。

最快的配置方式是 eas-simulator skill。把它装进 Claude Code、Cursor 或 Codex,告诉 agent 要检查什么,剩下的它全包了:构建 app、启动云端会话、逐个点击页面,然后把截图发回来。完成后你只需查看会话回放,不必自己拉分支再测一遍。

3. 用 URL 把手机分享给团队

预览本身就是一个网站。把 URL 发给同事,他们就能实时看到你在做什么,也能操作模拟器。你、你的同事、你的云端 agent 和本地 agent 可以同时操作同一台设备。

如果你只需要可分享的视图、不需要 agent 控制,有一种会话类型正好满足:

eas simulator:start --platform ios --type web-preview-only --name "design review"

预览还有一个全屏按钮,点开后只留下设备本身。

4. 回放每一次会话,包括 agent 的操作

每次会话都会出现在 expo.dev 上你项目的页面里。

expo.dev 上的 Simulator sessions 页面,列出了 open-multicam 项目的十个 session,包含名称、类型、平台、开始时间和时长

打开一个已完成的会话,你就能看到设备上发生的一切的完整视频,以及每一次交互的时间线。在视频对应的会话里,你可以看到 agent 点击操作 app、测试我要求它测试的功能,每一步都有截图。

一次已结束的会话在 expo.dev 上的录制,附带运行期间截取的截图时间线

我已经开始在 pull request 里用这些链接作为证据。“这是 bug,这是修复,这是回放”,比“相信我,我跑过了”要有说服力得多。

5. 任何框架的应用都能带进来

你的应用不必用 Expo 或 React Native。设备启动时是空白的,你可以上传任何 iOS Simulator 构建产物或 Android APK:SwiftUI、Kotlin、Flutter,任何能在模拟器上跑的东西都行。

eas simulator:exec npx agent-device@latest install com.example.app ./path/to/MyApp.app --platform ios

从哪里开始

EAS Simulator 目前是限量预览,我们正按批次从 waitlist 中放行。

如果你想看一篇在自己机器上完整搭建这套流程的教程,告诉我们。我们也很好奇你会怎么用云端模拟器。欢迎在 我们的 Discord 社区的 #eas-simulator 频道里分享你的用例。

常见问题

EAS Simulator 是什么? 这是 Expo 提供的一项服务,在 EAS 基础设施上运行远程 iOS Simulator 或 Android Emulator。你可以通过 CLI、REST API、coding agent 或浏览器来控制它。支持的 iOS 会话包含实时网页预览。目前处于限量预览阶段。

用 Expo 能在 Windows 上构建 iOS 应用吗? 可以。EAS Build 在 Expo 的 Mac 基础设施上编译应用,EAS Simulator 也在那里运行 iOS Simulator。开发构建通过隧道连接 Metro,就能在浏览器里获得 Fast Refresh。CLI 在 WSL 里运行。

能在 iOS Simulator 里测试相机功能吗? 用 EAS Simulator 的网页预览可以。工具面板的 Camera 部分会给应用一路模拟的摄像头画面:默认是动态测试图案,也可以是你拖进去的照片或视频。应用必须使用标准的 AVFoundation 采集 API。

AI agent 能用 EAS Simulator 吗? 可以。Agent 通过 agent-device 或 Argent 来操作设备。eas-simulator skill 会把完整流程教给 Claude Code、Cursor 和 Codex:检查访问权限、构建、开会话、控制设备、取证、清理。

我的应用必须用 Expo 或 React Native 吗? 不必。任何 iOS Simulator 构建或 Android APK 都能用。

EAS Simulator 会话能分享给别人吗? 可以。网页预览就是一个 URL,拿到链接的人都能同时观看并操作同一台设备。不需要 agent 控制的话,用 web-preview-only 类型的会话即可。

相关链接

来源: Expo Blog← 返回首页