iOS Simulator Browser 用于把 iOS 模拟器镜像到 Codex 应用内浏览器,并渲染来自可导入 Swift 包的 SwiftUI 预览,同时支持热重载。
用途
该技能面向两类任务:一是在 Codex 应用内浏览器中查看真实 iOS 模拟器画面;二是对存放在可导入 Swift 包中的 SwiftUI 预览进行带热重载的渲染与调试。
主要能力
浏览器工作流
- 从既有 iOS 构建/运行流程,或通过
xcrun simctl list devices available,获取明确的模拟器 UDID。 - 在一个长期运行的终端中,针对该模拟器启动 serve-sim。启动前先清理该模拟器已跟踪的陈旧辅助进程,并安装 trap,使该终端退出时清理辅助进程:
SIM="<simulator-udid>"
cleanup_serve_sim() {
npx --yes serve-sim@latest --kill "$SIM" >/dev/null 2>&1 || true
}
trap cleanup_serve_sim EXIT INT TERM HUP
cleanup_serve_sim
npx --yes serve-sim@latest "$SIM"
- 在 Codex 应用内浏览器中打开 serve-sim 打印出的确切本地预览 URL。
- 在报告成功之前,确认有真实画面正在渲染;仅页面加载完成并不足以证明模拟器串流健康。
- 浏览器镜像使用期间保持终端存活。完成后停止终端并等待其退出,以便 trap 执行。
- 如果终端消失或未正常退出,在为该模拟器启动另一个镜像前,先运行
npx --yes serve-sim@latest --kill "$SIM"。 - 绝不运行未限定范围的
serve-sim --kill,因为其他线程可能拥有另一个模拟器的镜像。
SwiftUI 预览工作流
当请求的预览位于可导入的 Swift 包中时,使用随附的启动器。将其指向包清单,并选择需要展示预览的目标。它会在用户源码树之外生成一次性宿主工程,在模拟器中安装并启动该宿主,并监听包中的编辑:
node <skill-root>/scripts/swiftui-preview-browser.mjs \
/absolute/path/to/Package.swift \
--package-target "<target>" \
--device "<simulator-udid>"
监听模式默认开启。当 Swift 包源码发生编辑时,启动器会重新构建生成的 dylib,并将其热替换进正在运行的宿主,无需重新启动应用。
生成的宿主会展示所选 Swift 包目标中发现的所有预览变体,并带有模拟器内的页面控制。若只想展示子集,可传入 --preview-filter <regex[, ...]>;它匹配显示名称和代码标识符,例如 StatusRowView_Previews。
启动器打印出所选模拟器 UDID 后,为同一 UDID 启动 serve-sim,并在应用内浏览器中打开其打印的 URL。
支持范围与限制
- 通过生成的宿主,支持基于 Swift 包的
PreviewProvider与#Preview声明。 - 不要为了强制支持预览而编辑用户的
.xcodeproj、.xcworkspace、Package.swift、scheme 或构建设置。
验证
浏览器或预览 QA 时,截取显示模拟器画面的浏览器截图。热重载 QA 时,还需报告启动器的热重载包预览输出(形如 ... in pid ...),并在编辑后展示已变化的画面。
暂未提供的信息
该技能的收费情况、价格、可用平台、性能效果与完整使用步骤的其余细节,资料中暂未提供。