Codex 现在能在浏览器里跑 iOS 模拟器了
最近刷推看到codex有一个有意思的功能,就是能在浏览器里跑 iOS 模拟器了。
我记得之前iOS 开发流程是这样:Xcode 里写代码,切到模拟器看效果,改完再编译,再切回来。界面出了 bug,截图贴给 AI,描述半天。
这个插件出来感觉可以简化这个开发流程了。

什么是 Build iOS Apps 插件
简单说,这是一个让 Codex 可以在浏览器里预览和操控 iOS App 的插件。
它的核心能力有三个:
模拟器的屏幕会被持续截取,变成视频流推到 Codex 右侧的浏览器面板上。
也有反向操控。浏览器里的点击、拖拽、打字,都会转成模拟器的触摸坐标和键盘事件发回去。
还有个能力是识别原生 UI 元素。插件读取 App 的 Accessibility 信息,在浏览器画面上覆盖一层透明的可交互按钮,每个对应一个 iOS 原生控件。
效果就是:你在一个窗口里写代码、看界面、点按钮、调布局,不用在 Xcode 和模拟器之间来回切,这听着就很方便。
咋做到的
我其实对他这个插件实现很感兴趣,就看了下,发现其实挺朴素,就是把几个已有的开源组件拼在了一起。
serve-sim:把模拟器画面搬到浏览器
EvanBacon 做的 serve-sim 是这个插件的核心依赖,---"The npx serve of Apple Simulators",就是让你像启动一个本地 HTTP 服务一样简单地把模拟器画面串流出来。
用法也很简单:
bash
npx serve-sim <设备名或UDID>
跑起来之后,localhost:3200 是预览页面,127.0.0.1:3100/stream.mjpeg 是原始的 MJPEG 视频流。
这个项目目前在 GitHub 上有 1600 多星,支持 React Native、Expo、Flutter、原生 iOS、SwiftUI 和 KMP 项目。主要是解决了一个问题------iOS Simulator 一直只能在 macOS 的窗口里看,没有一个方便的方式把它嵌入到别的界面里。
Accessibility:让 AI "看见"按钮在哪
浏览器能显示画面,但要识别画面里的元素,还得另想办法。
Web 应用有 DOM,AI 可以直接查询"这个按钮的 class 是什么、在页面哪个位置"。但 iOS App 没有 DOM,它的 UI 是原生渲染的。
插件的解法是读取 iOS 系统的 Accessibility 信息------就是 VoiceOver 等辅助功能用的那套数据。每个 UI 元素的名称、位置、是否可点击、层级关系,系统本来就有记录。插件拿到这些数据后,在浏览器的画面上盖一层透明的 HTML 按钮,每个按钮对应一个原生 iOS 元素。
这样 Codex 看到的就不再是一张"截图",而是一堆有语义的可交互控件。它可以知道"这里是一个叫'登录'的按钮,坐标在 (120, 340)",然后决定要不要点它。
这个思路和 InditexTech 做的 MCP Server 类似------后者也是通过 Facebook 的 idb 工具来控制模拟器,支持 tap、swipe、截图、录屏、甚至位置模拟。只不过那个是纯 MCP 协议,这个是直接集成在 Codex 的插件体系里。
SwiftUI Preview:不用完整重装 App
插件还有一个比较巧的设计:它能单独运行 SwiftUI Preview。
原理是临时生成一个专门用来展示 Preview 的小 App,把你的 SwiftUI 预览组件放进去。改代码之后,它不需要每次都完整重装 App,而是只重新编译预览相关的小动态库,再通知正在运行的 Preview App 更新画面。
比完整的 build-install-launch 流程快不少。跟 Xcode 原生 Preview 比还是有差距,拿来快速验证 UI 改动够用了。
局限性
我发现有几个限制:
串流有延迟。 serve-sim 的 MJPEG 流不是原生渲染,中间有截取、编码、传输的过程。实际体感上,浏览器里的画面会比真正的 Simulator 窗口慢半拍到一拍。做 UI 微调没问题,做动画调试估计有点吃力。
元素识别依赖 Accessibility 质量。 如果你的 App 没有好好设置 Accessibility label,插件识别出来的元素可能是一堆"Button"、"StaticText",Codex 也不知道该点哪个。这和 Web 开发里不写语义化 HTML 是一样的问题。
SwiftUI Preview 的编译速度和 Xcode 原生的还是有差距。 毕竟 Xcode 的 Preview 是深度集成在编译链里的,外部方案能做到"不完整重装"已经不错了,但别指望和 Xcode Preview 一样丝滑。
安全方面需要留心。 操控权限一旦给了,AI 在模拟器里就是自由的,随便点随便输。App 里有支付、删账号之类的操作,人得在旁边守着。
相关项目
- serve-sim --- 核心串流工具,1600+ stars
- ios-sim-serve-skill --- Codex skill,封装了 serve-sim 的完整工作流
- mcp-server-simulator-ios-idb --- 另一个方向,通过 MCP 协议控制 iOS 模拟器,300+ stars