用途
该技能用于在云沙箱(Linux 环境,无 xcrun、无 simctl)中启动和迭代 apps/mobile 应用,通过 EAS 云 iOS 模拟器运行真实的 dev-client 应用,并连接当前沙箱的 Metro 与 API。适用于被要求运行、启动、打开或展示移动应用时使用。
主要能力
- 提供单一入口脚本 apps/mobile/scripts/eas-dev.sh,自动复用当前检出目录的已有运行会话,或安装与当前检出指纹匹配的模拟器构建并启动会话(约两分钟)。
- 仅当不存在匹配构建时(首次或原生代码变更后)才触发构建,约十五分钟。
- 支持 --reload 从 Metro 重新加载应用;支持 --new 停止当前会话并启动全新会话。
- 启动 Metro 时,每次隧道(重)启动会等待 Metro 向应用提供 bundle 后才结束;否则以非零状态退出并指明 Metro 和 egress 日志路径。
- dev-client URL 携带 disableAutoLaunch=1&disableFab=1,启动时不弹出开发菜单,工具栏不显示齿轮按钮。
- 每次会话都是全新安装,因此每次加载都会传递这些参数。
- 日志和 PID 文件位于检出目录的 .tmp/eas-dev/,两个检出互不干扰隧道。
- 会话以工作区 ID 标记,桌面 Mobile 面板可列出该工作区标记的会话,无需链接即可查看模拟器;脚本同时打印 expo.dev/simulator-preview/... URL 供浏览器访问。
使用方式
- 运行主命令:apps/mobile/scripts/eas-dev.sh
- 重新加载:apps/mobile/scripts/eas-dev.sh --reload(仅重新加载,不启动其他内容)
- 启动新会话:apps/mobile/scripts/eas-dev.sh --new(停止运行中的会话并启动新会话)
- 无参数时保持已连接的客户端,若客户端已死则重启一个。
- 切换会话必须使用 --new,不要手动执行 eas simulator;egress 客户端绑定其启动时的会话,脚本会停止旧客户端并为新会话启动一个。
- 不要使用 agent-device open Superset,该方式会重新启动应用而不带 Metro URL,导致 "Could not connect to the server" 错误。
- 驱动模拟器:先加载会话,然后直接调用 agent-device: cd apps/mobile && set -a && . ./.env.eas-simulator && set +a agent-device snapshot -i agent-device press 'label="Continue"' --settle agent-device fill @e16 "hello" --settle agent-device screenshot /tmp/screen.png agent-device help
- agent-device 每个工作目录维护一个会话,每次都应从 apps/mobile 运行。
- 通过 eas simulator:exec npx agent-device 执行每条命令约需 25 秒;若缺失可全局安装(npm install -g agent-device)。
- 全新安装时开发菜单面板会覆盖首屏:先按 Continue,再按 Close。
- 由脚本启动的会话已关闭 iOS 的 "slide to type" 键盘引导。
- SwiftUI 菜单项(@expo/ui Menu)不会出现在 agent-device snapshot 中;需打开菜单、截图,然后按坐标点击:agent-device press <x> <y>。这是工具限制,不是应用限制。
- 源码编辑通过 fast refresh 约两秒到达应用。
适用场景
- 在无本地 Xcode 或模拟器的云沙箱中运行、打开或展示移动应用。
- 对 apps/mobile 进行 UI 检查、认证流程验证和快速迭代开发。
- 需要从浏览器或桌面 Mobile 面板查看云模拟器画面时。
限制
- 脚本转发 relay 和 realtime 端口但不启动这两个服务,因此主机和工作区在线状态显示为不可达;对认证和 UI 检查无影响。
- 会话在空闲 15 分钟后自动停止(MOBILE_EAS_IDLE_MINUTES);可提前在 apps/mobile 中执行 eas simulator:stop 停止。
- Expo 账户同时最多运行两个构建,构建可能排在团队构建之后等待。
- 需要 EXPO_TOKEN 和本仓库的 .env(通过 .superset/setup.sh 或 .superset/setup.cloud.sh 配置)。
- 指纹查找在 bun --version 与 .bun-version 不一致时拒绝运行;bun 依赖安装的指纹可能与现有构建不匹配,EAS 会启动 15 分钟构建并失败。在 bun 版本固定变更之前创建的云工作区带有旧版 bun,需新建工作区。
- 当 Metro 由其他方式启动时,脚本会打开应用但无法确认加载。