# iOS / iPadOS com RoboVM

> A toolchain RoboVM (AOT), o IOSLauncher, Info.plist e os pontos sensíveis do WKWebView.

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

# iOS / iPadOS (RoboVM) 🍎

O alvo iOS exige **macOS + Xcode**. A toolchain **RoboVM** faz AOT (Java → código nativo ARM).

## Rodar
```bash
gradlew :ios:launchIPhoneSimulator
```
O `IOSLauncher` cria a aplicação: `new IOSApplication(new Main(true, getCommandline()), configuration)`.
`Device.platform` será `IPHONE` ou `IPAD`.

## `Info.plist` — permissões e metadados
Diferente do Android (permissão em runtime), no iOS as **chaves de uso vão no `Info.plist`**:
- descrições de uso de **câmera**, **localização**, **Bluetooth**, **microfone** (obrigatórias, senão o
  app é rejeitado);
- ícones e *launch screen*.

## ⚠️ Pontos sensíveis
- **`WKWebView`**: `evaluateJavaScript` é **restrito** — a ponte JS↔Java do `WebContainer` é mais
  limitada que no Android/desktop.
- **Conta de desenvolvedor Apple** + *provisioning profile* são necessários para rodar em **device
  real** (o simulador não exige).
- Build AOT é **lento** — mais um motivo para desenvolver no [desktop](/docs/platforms/desktop-lwjgl3) e só
  validar no iOS.

## Boas práticas
- Preencha **todas** as chaves de uso no `Info.plist` antes de submeter (rejeição é comum por isso).
- Teste no **simulador** cedo; deixe o device real para validação final (provisioning).

## Erros comuns
- Faltar uma chave de uso no `Info.plist` (crash ao acessar o recurso, ou rejeição na App Store).
- Assumir `evaluateJavaScript` completo no `WKWebView` (é restrito).

## Veja também
- [Build e distribuição](/docs/platforms/building-and-releasing)
