Cómo dejo que Claude Code pruebe mi app de iPhone en el simulador

Claude Code puede probar una app de iPhone por su cuenta si le das dos cosas: los comandos de terminal que compilan, instalan, abren y capturan la app en el simulador de iOS y, desde Xcode 26.3, acceso al servidor MCP del propio Xcode. Con las dos, puede cambiar una pantalla, ejecutarla, mirar el resultado y arreglar lo que ve antes de decirte que ha terminado.

Construyo apps de iPhone casi siempre solo, con Claude Code escribiendo buena parte del Swift. El cambio más grande en mi forma de trabajar llegó al cerrar el ciclo, para que el agente pudiera ver la app que acababa de cambiar. Antes de eso, cada "listo" era una suposición que yo tenía que comprobar a mano.

Por qué el ciclo importa más que el modelo

Un agente que no puede ejecutar tu app revisa su propio código leyéndolo. Eso detecta erratas. Se le escapa el botón que queda debajo del teclado, la etiqueta en japonés que ocupa tres líneas, el estado vacío que nadie diseñó. Son justo las cosas que aparecen en la revisión de la App Store y en las reseñas de una estrella.

El simulador viene con cada copia de Xcode y casi todo lo que hace está disponible desde la línea de comandos con xcrun simctl. Con eso tienes casi todo lo necesario. Si una persona puede hacerlo pulsando en el simulador, normalmente hay un comando, y cualquier cosa con un comando se le puede dar a un agente.

Los comandos que cierran el ciclo

Empieza buscando un simulador y arrancándolo. simctl acepta la palabra booted en lugar del identificador del dispositivo, lo que mantiene cortos el resto de comandos.

xcrun simctl list devices available
xcrun simctl boot "iPhone 17"

Compila para el simulador dentro de una carpeta del proyecto, para que el agente siempre sepa dónde termina la app:

xcodebuild -scheme MyApp \
  -destination 'platform=iOS Simulator,name=iPhone 17' \
  -derivedDataPath build build

Después instálala, ábrela y haz una captura:

xcrun simctl install booted build/Build/Products/Debug-iphonesimulator/MyApp.app
xcrun simctl launch booted com.example.myapp
xcrun simctl io booted screenshot shot.png

Claude Code puede abrir un PNG y describir lo que hay en él, así que esa última línea es la que convierte una compilación en información útil. Pídele que compare la captura con lo que la pantalla debía mostrar y tendrás una segunda revisión que de verdad mira los píxeles.

Prueba los estados que tú nunca abres

El valor real está en los estados que un desarrollador se salta porque cuesta llegar a ellos. simctl llega a la mayoría en una línea.

xcrun simctl ui booted appearance dark
xcrun simctl ui booted content_size accessibility-extra-extra-extra-large
xcrun simctl launch booted com.example.myapp -AppleLanguages "(ja)" -AppleLocale ja_JP
xcrun simctl privacy booted revoke photos com.example.myapp
xcrun simctl openurl booted "myapp://settings"

Modo oscuro, el tamaño de texto dinámico más grande, la app en japonés, un permiso que el usuario rechazó, un enlace profundo directo a una pantalla. Cada uno está a una captura de distancia. Viviendo en Japón, el argumento de idioma es el que me quedaría si solo pudiera quedarme con uno, porque el texto japonés rompe diseños que en inglés se ven perfectos.

simctl también puede simular una notificación push con xcrun simctl push y un pequeño JSON, y fijar la barra de estado con xcrun simctl status_bar booted override --time 9:41 para que las capturas de la App Store queden limpias.

Conecta el servidor MCP de Xcode

Apple anunció Xcode 26.3 el 3 de febrero de 2026 con soporte integrado para agentes de programación, entre ellos Claude Agent de Anthropic y Codex de OpenAI. Lo que importa para Claude Code en una terminal es que Xcode ahora expone sus capacidades a través del Model Context Protocol, así que los agentes externos también pueden usarlas.

La guía de Apple para dar acceso a Xcode a agentes externos tiene tres pasos. En Xcode, abre Settings, luego Intelligence, y en Model Context Protocol activa "Allow external agents to use Xcode tools". Después registra el puente en Claude Code:

claude mcp add --transport stdio xcode -- xcrun mcpbridge
claude mcp list

Por último, abre el proyecto en Xcode antes de empezar a escribir instrucciones. Xcode muestra un aviso cuando un agente externo se conecta y mientras está activo, lo cual es un buen hábito: siempre sabes cuándo hay otra cosa al volante.

Yo mantengo las dos vías. Las herramientas MCP entienden el proyecto como lo entiende Xcode. Los comandos de terminal son simples, se pueden automatizar y se leen fácil en un registro. Cuando una vía se confunde, la otra suele seguir funcionando.

Escribe la receta una vez

Claude Code carga el CLAUDE.md del proyecto al inicio de cada sesión, según su documentación sobre memoria. Ahí va la receta: el nombre del esquema, el simulador que usar, el identificador de la app, la carpeta de compilación y una instrucción corta de que cada cambio de interfaz termina con capturas en modo claro, modo oscuro y el tamaño de texto más grande.

Una vez escrito, el ciclo deja de depender de que te acuerdes de pedirlo. Si quieres que se cumpla siempre y no solo que se sugiera, un hook puede ejecutar la compilación después de cada cambio; escribí sobre ese patrón en la guía de hooks que se corrigen solos.

Lo que el simulador no te puede decir

Un simulador es un Mac haciéndose pasar por un teléfono. La cámara, las notificaciones push reales a través de los servidores de Apple, el rendimiento en un dispositivo antiguo, la vibración, cómo se siente la app en una mano en un tren lleno: nada de eso aparece en una captura. Las compras necesitan una configuración de StoreKit o una cuenta sandbox antes de significar algo.

Por eso trato el ciclo del simulador como el suelo. Detecta pronto los diseños rotos, los textos que faltan y los estados sin resolver, y me deja el tiempo en un dispositivo real para lo que solo un dispositivo real puede mostrar. Esa división es buena parte de cómo una persona puede publicar una app de iOS con IA, y una forma barata de quedarse fuera de los dos millones de envíos que Apple rechazó en 2025.

← Todos los artículos