# iOS / iPadOS con RoboVM

> La toolchain RoboVM (AOT), el IOSLauncher, Info.plist y los puntos sensibles de WKWebView.

Source: https://crossfly.dev/es/docs/platforms/ios — CrossFly documentation. Full docs as one file: https://crossfly.dev/llms-full.txt

# iOS / iPadOS (RoboVM) 🍎

El destino iOS exige **macOS + Xcode**. La toolchain **RoboVM** hace AOT (Java → código nativo ARM).

## Ejecutar
```bash
gradlew :ios:launchIPhoneSimulator
```
El `IOSLauncher` crea la aplicación: `new IOSApplication(new Main(true, getCommandline()), configuration)`.
`Device.platform` será `IPHONE` o `IPAD`.

## `Info.plist` — permisos y metadatos
A diferencia de Android (permiso en runtime), en iOS las **claves de uso van en el `Info.plist`**:
- descripciones de uso de **cámara**, **ubicación**, **Bluetooth**, **micrófono** (obligatorias, si no el
  app es rechazado);
- iconos y *launch screen*.

## ⚠️ Puntos sensibles
- **`WKWebView`**: `evaluateJavaScript` está **restringido** — el puente JS↔Java del `WebContainer` es más
  limitado que en Android/desktop.
- **Cuenta de desarrollador Apple** + *provisioning profile* son necesarios para ejecutar en **dispositivo
  real** (el simulador no lo exige).
- El build AOT es **lento** — un motivo más para desarrollar en el [desktop](/docs/platforms/desktop-lwjgl3) y solo
  validar en iOS.

## Buenas prácticas
- Rellena **todas** las claves de uso en el `Info.plist` antes de enviar (el rechazo por esto es común).
- Prueba en el **simulador** temprano; deja el dispositivo real para la validación final (provisioning).

## Errores comunes
- Faltar una clave de uso en el `Info.plist` (crash al acceder al recurso, o rechazo en la App Store).
- Asumir `evaluateJavaScript` completo en el `WKWebView` (está restringido).

## Ver también
- [Build y distribución](/docs/platforms/building-and-releasing)
