Ir al contenido

Guía

Empezar

De un directorio vacío a una app de Angular corriendo sobre vistas nativas, en la plataforma que elijas.

Xcode con el runtime de simulador de la plataforma que quieras. tvOS y visionOS traen el suyo aparte: xcodebuild -downloadPlatform tvOS.

tvOS, visionOS y watchOS piden además un toolchain nightly de Rust: sus targets son de nivel 3 y no traen std precompilada.

Ventana de terminal
rustup toolchain install nightly
rustup component add rust-src --toolchain nightly
  1. Clona este repositorio y deja an en el PATH:

    Ventana de terminal
    git clone https://github.com/nesgarbo/angular-native
    cd angular-native
    cargo install --path crates/an-cli
  2. Crea un proyecto de Angular, o usa uno que ya tengas:

    Ventana de terminal
    npx @angular/cli@latest new mi-app
    cd mi-app
  3. Prepáralo:

    Ventana de terminal
    an init

    Añade un manifiesto, un tsconfig para el build nativo, los dos paquetes del framework y un punto de entrada nativo. No toca ni src/main.ts ni angular.json, así que ng build y ng serve siguen funcionando exactamente igual que antes.

  4. Añade una plataforma y arráncala:

    Ventana de terminal
    an add ios && an ios
    an add tvos && an tvos .
    an add visionos && an visionos .
Ventana de terminal
an dev # simulador de iPhone
an dev --android # emulador de Android
an dev --tvos # simulador de Apple TV
an dev --visionos # simulador de Vision Pro
an dev --watchos # simulador de Apple Watch
an dev --wearos # emulador de Wear OS
an dev --macos # una ventana en este mismo Mac

--macos es el distinto: no hay simulador, así que la app se abre en la máquina que la está compilando y el servidor con el que habla está en esa misma máquina.

Al guardar un componente, su definición se cambia en la app que está corriendo. Te quedas en la misma pantalla, con lo que hubieras escrito y los temporizadores en marcha.

<an-view [style.padding]="'16'" [style.gap]="'12'">
<an-text [fontSize]="28" [fontWeight]="'bold'">Ajustes</an-text>
<an-view [style.flexDirection]="'row'" [style.justifyContent]="'space-between'">
<an-text>Notificaciones</an-text>
<an-switch [on]="avisar()" (onChange)="avisar.set($event)" />
</an-view>
<an-button
[title]="'Guardar'"
[variant]="'filled'"
[accessibilityHint]="'guarda sin salir de la pantalla'"
(press)="guardar()" />
</an-view>

Ese an-switch es un UISwitch en iOS y un MaterialSwitch en Android. El layout es flexbox, calculado una vez en el núcleo y entregado a cada plataforma como marcos absolutos.