Guía

Por qué un agente de programación para iOS necesita un Mac de verdad

Un agente puede escribir Swift en cualquier sitio. Solo puede compilar, ejecutar y ver una app de iOS en un Mac. Esa diferencia es la razón por la que el trabajo de iOS necesita un Mac en el bucle. Es también la razón por la que un agente con un Mac mejora tanto. Puede comprobar su propio trabajo. Esta página enumera lo que solo existe en macOS. Después muestra el bucle que configuramos para los agentes en nuestras máquinas.

Lo que solo pasa en macOS

  • Compilar la app. xcodebuild y Xcode solo existen en macOS. Un equipo Linux puede compilar paquetes de Swift y Swift de servidor. No puede producir una app de iOS.
  • Ejecutarla. El simulador de iOS forma parte de Xcode. Sin simulador, no hay forma de ejecutar la app que el agente acaba de cambiar.
  • Verla. Una captura de la app en marcha es como el agente descubre que se ha roto el diseño. Para eso hace falta el simulador.
  • Tests de interfaz. XCUITest maneja la app en un simulador o en un dispositivo. Solo en macOS.
  • Firmar y subir. La firma de código, los perfiles de aprovisionamiento y las subidas a App Store Connect pasan todos por las herramientas de Apple en macOS.

Así que un agente en Linux puede editar tus archivos de Swift y adivinar. Un agente en un Mac puede editar, compilar, ejecutar, mirar y corregir. El segundo es el útil.

El bucle, paso a paso

Configúralo una vez y pon los comandos en el archivo de instrucciones de tu agente. Así los usará sin que se lo digas cada vez. Primero, busca un simulador y arráncalo.

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

Compila para ese simulador. Sustituye el scheme por el tuyo.

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

Instala y abre el build.

xcrun simctl install booted build/Build/Products/Debug-iphonesimulator/MyApp.app
xcrun simctl launch booted com.example.MyApp

Haz una captura que el agente pueda leer.

xcrun simctl io booted screenshot /tmp/screen.png

Claude Code y Codex pueden abrir un archivo de imagen. Dile al agente que haga una captura tras cada cambio de interfaz y que describa lo que ve antes de darlo por terminado. Esa sola instrucción detecta la mayoría de los errores de diseño.

Ejecuta los tests igual

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

La ruta de derived data importa. Si la mantienes dentro de la carpeta del proyecto, el segundo build es incremental y tarda segundos en lugar de minutos. Un agente que espera cuatro minutos por build hace una cuarta parte del trabajo.

Pon el bucle en el archivo de instrucciones

Los dos agentes leen un archivo de la raíz del repositorio con las instrucciones del proyecto. Claude Code lee CLAUDE.md y Codex lee AGENTS.md. Pon el bucle ahí para que cada sesión empiece con él.

## Building and checking this app
- Build: xcodebuild -scheme MyApp -destination 'platform=iOS Simulator,name=iPhone 16' -derivedDataPath build build
- Run: xcrun simctl install booted build/Build/Products/Debug-iphonesimulator/MyApp.app && xcrun simctl launch booted com.example.MyApp
- Look: xcrun simctl io booted screenshot /tmp/screen.png, then open the image
- After any UI change, build, run, and look before saying it is done.
- Tests: same xcodebuild command with test instead of build.

Lo que hace tropezar a los agentes

  • Xcode sin seleccionar. Tras instalar un Xcode nuevo, ejecuta xcode-select para apuntar a él. Si no, xcodebuild usa el antiguo.
  • Simulador sin arrancar. El comando de lanzamiento falla con un error poco claro. Arráncalo primero y déjalo arrancado.
  • Runtime sin instalar. Un Xcode recién instalado no tiene runtime de iOS hasta que descargas uno. Esa descarga ocupa varios gigabytes y debe hacerse antes de que empiece el agente.
  • Sin sesión iniciada. El simulador es una aplicación gráfica. En una máquina headless sin nadie con sesión iniciada, no arranca. El usuario del agente necesita una sesión de escritorio activa. Por eso importa el inicio de sesión automático en un Mac sin supervisión.

Lo que te dejamos configurado

En un Mac para agentes nuestro, Xcode viene instalado con un runtime de iOS descargado. El usuario del agente tiene una sesión de escritorio siempre activa. Claude Code y Codex esperan a que inicies sesión. Añade el bucle de arriba a tu archivo de instrucciones y el agente podrá compilar y ver tu app desde la primera tarea. La guía de capacidades explica qué más funciona en la máquina y qué no.

Preguntas frecuentes

¿Puede Claude Code compilar una app de iOS en Linux?

+

No. En Linux puede editar archivos de Swift y compilar paquetes de Swift que no dependan de frameworks de Apple. Compilar una app de iOS exige Xcode, que solo funciona en macOS.

¿El agente necesita un iPhone físico?

+

Para la mayor parte del trabajo, no. El simulador cubre compilar, ejecutar, capturas y tests de interfaz. Un dispositivo hace falta para cosas como la cámara, las notificaciones push y el rendimiento en hardware real.

¿Puede el agente hacer capturas del simulador?

+

Sí, con el comando simctl screenshot, siempre que haya un simulador arrancado y el usuario del agente tenga una sesión de escritorio. Después el agente puede abrir la imagen y leerla.

¿Qué versión de Xcode usará el agente?

+

La que indique xcode-select. Fíjala en tu archivo de instrucciones. En una máquina con varias versiones, dile al agente que lo compruebe antes de compilar.

Guías relacionadas