¿Qué hace iOS E2E?
Trabaja desde la raíz del checkout. Un archivo local .mobilebuildmcp/config.yaml (Configuración) proporciona el proyecto, el esquema y DerivedData, por lo que los comandos de mobilebuildmcp no necesitan indicadores de proyecto.
Dos valores se repiten:
$sim: el UDID del simulador (pnpm ios:sim:pairimprime uno). Pasa--simulator-id "$sim"a cada llamada demobilebuildmcp; sin él, la configuración predeterminada apunta al simulador llamadoiPhone 17.$bundle: el ID del paquete, que depende del equipo de firmado. Léelo desde la compilación:bundle=$(/usr/libexec/PlistBuddy -c 'Print :CFBundleIdentifier' apps/ios/build/DerivedData/Build/Products/Debug-iphonesimulator/OpenClaw.app/Info.plist).
Construir y ejecutar
-
Construir:
mobilebuildmcp simulator build. Después de editarapps/ios/project.yml, ejecuta primeropnpm ios:gen. -
Instalar y lanzar con
simctl, que acepta argumentos de lanzamiento (pnpm ios:runno acepta ninguno):xcrun simctl install "$sim" apps/ios/build/DerivedData/Build/Products/Debug-iphonesimulator/OpenClaw.app xcrun simctl launch --terminate-running-process "$sim" "$bundle" --openclaw-reset-onboardingmobilebuildmcp simulator build-and-runylaunch-appadjuntan una captura de registros que nunca termina. -
Depurar argumentos de lanzamiento:
grep -rhoE '"--openclaw-[a-z-]+"' apps/ios/Sources | sort -u.--openclaw-screenshot-modejunto con una bandera--openclaw-*-fixturemuestra una pantalla de prueba sin Gateway;-AppleLanguages "(de)" -AppleLocale de_DEejecuta en otro idioma. El esquema de URL de depuración esopenclaw-debug://.
Conducir la interfaz de usuario
mobilebuildmcp ui-automation snapshot-ui --style minimallista los objetivos tocables comoref|action|role|label|value|id. El texto que no es un control (burbujas de chat, títulos de fila) aparece solo con--output json.- Actúa sobre una referencia con
tap,type-text,long-press(--durationestá en milisegundos),swipeogesture. Espera conwait-for-ui:--predicate exists --label '…' --role buttonpara un elemento,--predicate textContains --text '…'para texto. Un selector de espera que coincide con varios elementos falla; añade--roleo--identifier. Mantén--timeout-mspor debajo de 30000: el daemon finaliza cualquier solicitud después de 30 s conDAEMON_TRANSPORT_FAILED; repite la espera para tiempos más largos. - Las referencias pertenecen a una instantánea; toma una nueva después de cada cambio de pantalla.
- Ver la pantalla:
mobilebuildmcp simulator screenshot, luego lee el JPEG impreso.
Casos especiales:
- La pantalla de inicio y las hojas también listan las pantallas detrás de ellas; combina por etiqueta o id y toma la última coincidencia.
- En iPhone, la barra lateral se superpone al contenido: toca
RootTabs.Sidebar.Showantes de sus filas. xcrun simctl openurlencola una alerta del sistema "Abrir en OpenClaw?" por llamada; tocaAbriroCancelarpara cada una.- La interfaz de usuario del sistema fuera del proceso de la aplicación (selector de fotos, hoja de compartir) no aparece en las instantáneas. Tócala por coordenadas con el binario AXe incluido en MobileBuildMCP:
"$(brew --prefix mobilebuildmcp)/libexec/bundled/axe" tap -x <x> -y <y> --udid "$sim". Las coordenadas son puntos: píxeles de la captura de pantalla × ancho de la pantalla en puntos ÷ ancho de la captura de pantalla.
Registros y fallos
Actúa primero, luego lee una ventana acotada:
xcrun simctl spawn "$sim" log show --last 2m --style compact --predicate 'subsystem BEGINSWITH "ai.openclaw"'
Los fallos terminan en ~/Library/Logs/DiagnosticReports/OpenClaw-*.ips; el primer marco OpenClaw del hilo triggered nombra al culpable. Las preferencias y bases de datos de la aplicación viven en el contenedor de la app (xcrun simctl get_app_container "$sim" "$bundle" data); simctl spawn … defaults read no puede verlos. LLDB y xctrace: DEBUG.md.
Pruebas
- Ejecuta los conjuntos afectados:
pnpm ios:test <Suite>(selectores yIOS_SIM:apps/ios/README.md). - Demuestra que una prueba de regresión falla en la base: haz commit del cambio, revisa la versión base de los archivos fuente modificados (
git checkout <base> -- <paths>), ejecuta el conjunto, luegogit checkout HEAD -- <paths>.
Hecho: los conjuntos afectados pasan, y cada nueva prueba de regresión falla en la base.
Demostrar un cambio de extremo a extremo
- Inicia la Gateway aislada (perfil único en Configuración) como un servicio de larga duración:
node scripts/run-node.mjs --profile ios-sim gateway --bind loopback. Nunca toca la Gateway del operador ni~/.openclaw. Mientras se ejecuta, llama a la CLI comonode openclaw.mjs --profile ios-sim …;run-nodese niega a reconstruir bajo una Gateway en ejecución. - Empareja un simulador nuevo a través de la interfaz de usuario de incorporación real:
sim=$(pnpm --silent ios:sim:pair | tail -1)(--apppara otra compilación,--profilepara otro perfil). - Ejercita el cambio a través de controles visibles. Un viaje de ida y vuelta en el chat: escribe en
chat-message-input, tocachat-send-message, luego espera una palabra que solo contenga la respuesta. - Compara compilaciones: los mismos pasos en
mainy en el cambio, cada uno en su propio simulador nuevo, con capturas de pantalla coincidentes. - Detén la Gateway y elimina los simuladores.
Comandos de Node, permisos, fallos de autenticación, cortes de servicio, envíos rechazados, actualizaciones y diseño de iPad: PROOF.md, que también enumera lo que solo un dispositivo puede demostrar.
Hecho: las capturas de pantalla o la salida grabada muestran el comportamiento en el cambio y su ausencia en main; el puerto de la Gateway está cerrado y no queda ningún simulador openclaw-pair-*.
Configuración
Una vez por máquina; cada paso termina con una verificación.
-
Xcode, runtimes de simulador,
xcodegeny la cadena de herramientas de Rust para Watch: requisitos previos deapps/ios/README.md. Verifica:xcrun simctl list devices availablemuestraiPhone 17. -
SwiftFormat y SwiftLint en la versión del repositorio:
scripts/install-swift-tools.sh <dir en PATH>. Verifica:scripts/check-swift-tools.shsale con 0. -
MobileBuildMCP, CLI de Sentry XcodeBuildMCP:
brew tap getsentry/xcodebuildmcp && brew install getsentry/xcodebuildmcp/mobilebuildmcp. Estos pasos se escribieron para la versión 2.7.1. Verifica:mobilebuildmcp --version. -
Checkout:
pnpm install --frozen-lockfile, luegopnpm ios:gen(el proyecto Xcode se genera, no se hace commit). Luego crea.mobilebuildmcp/config.yamly añade/.mobilebuildmcp/a.git/info/exclude:schemaVersion: 1 enabledWorkflows: [simulator, simulator-management, ui-automation, debugging] sentryDisabled: true sessionDefaults: projectPath: ./apps/ios/OpenClaw.xcodeproj scheme: OpenClaw configuration: Debug platform: iOS simulatorName: iPhone 17 derivedDataPath: ./apps/ios/build/DerivedData # compartido con pnpm ios:runVerifica:
mobilebuildmcp simulator list-schemeslistaOpenClaw, ymobilebuildmcp simulator buildtiene éxito. -
El perfil de Gateway
ios-sim, con la Gateway detenida (oc=node openclaw.mjs --profile ios-sim):oc config set gateway.mode local,oc config set gateway.port 19031,oc config set gateway.auth.mode token,oc config set gateway.auth.token "$(openssl rand -hex 24)". Las respuestas de chat necesitan un modelo para su agentemain:oc models auth loginoaddcon credenciales de prueba. Verifica: la Gateway se inicia, ypnpm ios:sim:pairtermina en la pantalla de chat.