Saltar al contenido principal
Guía

Desarrollar Aplicaciones Móviles con Angular y Capacitor

Learn how to create a mobile app with Angular, Capacitor, and enhance the Capgo Native Navigation, Transitions, and iOS layout best practices.

Martin Donadieu

Martin Donadieu

Redactor de contenido

Desarrollar Aplicaciones Móviles con Angular y Capacitor

Empezaremos con un nuevo Angular app and transition into the native mobile app realm using Capacitor. You can also add Capgo Native Navigation and Transitions for a native mobile feel, and use tailwind-capacitor for safe areas.

Capacitor te permite convertir fácilmente tu aplicación web de Angular en una aplicación móvil nativa sin necesitar modificaciones significativas ni aprender una nueva habilidad como React Native.

Con solo unos pocos pasos simples, la mayoría de las aplicaciones de Angular pueden ser transformadas en aplicaciones móviles.

Este tutorial te guiará a través del proceso, comenzando con una nueva aplicación de Angular y luego incorporando Capacitor para moverse al reino de aplicaciones móviles nativas. También puedes utilizar Capgo de navegación nativa, transiciones y tailwind-capacitor para áreas de seguridad.

Sobre Capacitor

CapacitorJS es un cambio de juego! Puedes incorporarlo fácilmente en cualquier proyecto web, y lo envolverá en una vista web nativa, generando el proyecto Xcode y Android Studio nativo para ti. Además, sus plugins te proporcionan acceso a características de dispositivos nativos como la cámara a través de un puente de JS.

Con Capacitor, obtienes una fantástica aplicación móvil nativa sin ningún setup complicado o curva de aprendizaje empinada. Su API y funcionalidad simplificada lo hacen un placer integrarlo en tu proyecto. Confía en mí, te sorprenderá la facilidad con la que puedes lograr una aplicación nativa funcional completa con Capacitor!

Preparando tu aplicación de Angular

Para crear una nueva aplicación de Angular, ejecuta el siguiente comando:

ng new my-app
cd my-app

Elige ‘Angular’ cuando se te pregunte por la versión de Angular.

Para crear una aplicación móvil nativa, necesitamos un ‘export’ de nuestro proyecto. Así que incluyamos un script directo en nuestro ‘package.json’ Exportación de nuestro proyecto. Un ‘export’ de nuestro proyecto. que se puede utilizar para construir y copiar el proyecto de Angular:

{
  "scripts": {
    // ...
    "build": "ng build --prod"
  }
}

Después de ejecutar la orden buildpuedes ver un nuevo dist carpeta en la raíz de tu proyecto.

Esta carpeta se utilizará por Capacitor más adelante, pero por ahora debemos configurarla correctamente.

Agregar Capacitor a tu aplicación de Angular

Para empaquetar cualquier aplicación web en un contenedor móvil nativo, debemos seguir unos pocos pasos inicialmente, pero después es tan simple como ejecutar una sola sync orden.

Primero, podemos instalar el Capacitor CLI como una dependencia de desarrollo, y luego configurarlo dentro de nuestro proyecto. Durante la configuración, puedes pulsar ‘enter’ para aceptar los valores predeterminados para el nombre y el ID de la aplicación.

En segundo lugar, debemos instalar el paquete principal y los paquetes relevantes para las plataformas iOS y Android.

Finalmente, podemos agregar las plataformas, y Capacitor creará carpetas para cada plataforma en la raíz de nuestro proyecto:

# Install the Capacitor CLI locally
npm install -D @capacitor/cli

# Initialize Capacitor in your Angular project
npx cap init

# Install the required packages
npm install @capacitor/core @capacitor/ios @capacitor/android

# Add the native platforms
npx cap add ios
npx cap add android

Por este punto, deberías poder observar nuevos ios y contexto: Página/área: Sitio web de marketing de Capgo. Rol: Etiqueta de IU corta o elemento de navegación. Visto en: página trust.astro. Clave de mensaje `y` (Y). android

carpetas en tu proyecto de Angular.

Son proyectos nativos reales! Para acceder al proyecto de Android más tarde, debes instalarAndroid Studio . Para iOS, necesitas un Mac y debes instalar.

Xcode capacitor.config.ts archivo en tu proyecto, que contiene algunas configuraciones fundamentales Capacitor utilizadas durante la sincronización. La única cosa a la que debes prestar atención es el webDirque debe apuntar al resultado de tu comando de compilación. Actualmente, es inexacto.

Para corregir esto, abre el capacitor.config.json archivo y actualiza el webDir:

{
  "appId": "com.example.app",
  "appName": "my-app",
  "webDir": "dist"
}

puedes probarlo ejecutando los siguientes comandos:

npm run build
npx cap sync

El primer comando npm run build construirá tu proyecto Angular y copiará la compilación estática, mientras que el segundo comando npx cap sync sincronizará todos los web code en los lugares adecuados de las plataformas nativas para que puedan ser visualizados en una aplicación.

Además, el comando de sincronización podría actualizar las plataformas nativas e instalar plugins, por lo que cuando instales un nuevo Capacitor plugins es hora de ejecutar npx cap sync de nuevo.

Sin darse cuenta, ahora ya has terminado, así que veamos la aplicación en un dispositivo!

Construye y distribuye aplicaciones nativas

Para desarrollar aplicaciones iOS, necesitas tener Xcode instalado, y para aplicaciones Android, necesitas tener Android Studio instalado. Además, si planeas distribuir tu aplicación en la tienda de aplicaciones, debes inscribirte en el Programa de Desarrolladores de Apple para iOS y en el Console de Google Play para Android.

Si eres nuevo en el desarrollo de aplicaciones móviles nativas, puedes utilizar el Capacitor CLI para abrir fácilmente ambos proyectos nativos:

npx cap open ios
npx cap open android

Una vez que hayas configurado tus proyectos nativos, desplegar tu aplicación en un dispositivo conectado es fácil. En Android Studio, solo necesitas esperar a que todo esté listo, y puedes desplegar tu aplicación en un dispositivo conectado sin cambiar ninguna configuración. Aquí tienes un ejemplo:

android-studio-run

En Xcode, debes configurar tu cuenta de firma para desplegar tu aplicación en un dispositivo real en lugar del simulador. Si no lo has hecho antes, Xcode te guía a través del proceso (pero, una vez más, debes estar inscrito en el Programa de Desarrolladores). Posteriormente, puedes simplemente pulsar play para ejecutar la aplicación en tu dispositivo conectado, que puedes seleccionar en la parte superior. Aquí tienes un ejemplo:

xcode-run

Felicidades! Has desplegado con éxito tu aplicación web de Angular en un dispositivo móvil. Aquí tienes un ejemplo:

angular-mobile-app

Pero espera, hay una forma más rápida de hacer esto durante el desarrollo…

Capacitor Live Reload

Hasta ahora, probablemente estás acostumbrado a tener hot reload con todas las marcos modernas, y la buena noticia es que puedes tener la misma funcionalidad en un dispositivo móvil con un mínimo esfuerzo!

Habilita acceso a tu aplicación localmente con live reload On tu red de área al tener la aplicación Capacitor cargar el contenido desde la URL específica.

El primer paso es determinar tu dirección IP local. Si estás utilizando un Mac, puedes encontrar esto ejecutando el siguiente comando en la terminal:

ipconfig getifaddr en0

On Windows, ejecuta :

ipconfig

Luego busca la dirección IPv4.

Puedemos instruir a Capacitor para que cargue la aplicación directamente desde el servidor agregando otra entrada a nuestro archivo: capacitor.config.ts Asegúrate de utilizar

import { CapacitorConfig } from '@capacitor/cli';

const config: CapacitorConfig = {
  appId: 'com.example.app',
  appName: 'my-app',
  webDir: 'dist',
  bundledWebRuntime: false,
  server: {
    url: 'http://192.168.x.xx:4200',
    cleartext: true
  }
};

export default config;

la dirección IP y el puerto correctos , he utilizado el puerto de Angular por defecto en este ejemplo.Ahora, podemos aplicar estos cambios copiándolos a nuestro proyecto nativo:

El

npx cap copy

El copy El comando es similar a sync, pero solo copiará los cambios realizados en la carpeta web y la configuración, sin actualizar el proyecto nativo.

Puede desplegar su aplicación una vez más a través de Android Studio o Xcode. Después de eso, si cambia algo en su aplicación de Angular, la aplicación se recargará automáticamente y mostrará los cambios!

Tenga en cuenta que si instala nuevos plugins como la cámara, todavía requiere una reconstrucción del proyecto nativo. Esto se debe a que los archivos nativos se han modificado, y no se puede hacer en tiempo real.

Ten en cuenta que debe utilizar la IP y el puerto correctos en su configuración. El bloque code anterior muestra el puerto de Angular por defecto para fines de demostración.

Usando Capacitor Plugins

Vamos a echar un vistazo a cómo utilizar un plugin Capacitor en acción, que mencionamos antes. Para hacer esto, podemos instalar un plugin bastante simple ejecutando:

npm i @capacitor/share

No hay nada especial sobre el plugin de Compartir, pero de todos modos abre el diálogo de compartir nativo! Para esto ahora solo necesitamos importar el paquete y llamar a la función correspondiente desde nuestra aplicación, así que cambiemos el share() src/app/app.component.ts por esto: Como se mencionó anteriormente, cuando instalamos nuevos plugins, debemos realizar una operación de sincronización y luego volver a desplegar la aplicación en nuestro dispositivo. Para hacer esto, ejecuta el siguiente comando:

import { Component } from '@angular/core';
import { Share } from '@capacitor/share';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss']
})
export class AppComponent {
  title = 'my-app';

  async share() {
    await Share.share({
      title: 'Open Youtube',
      text: 'Check new video on youtube',
      url: 'https://www.youtube.com',
      dialogTitle: 'Share with friends'
    });
  }
}

Después de pulsar el botón, puedes ver el hermoso diálogo de compartir nativo en acción!

npx cap sync

En el siguiente paso, puedes hacer que la aplicación se sienta más nativa en iOS y Android con la navegación y las transiciones de __CAPGO_KEEP_0__ y solucionar problemas de diseño comunes en iOS que causan un flujo horizontal o áreas de seguridad recortadas.

Interfaz de usuario que se siente nativa con Capgo Navegación y Transiciones Nativas

Native-feeling UI with Capgo Native Navigation and Transitions

Ionic Plugins de Compartir para construir aplicaciones de múltiples plataformas, pero integrarlo con Angular es engorroso y raramente vale la pena cuando ya tienes Tailwind CSS.

Para un sentir móvil nativo en una aplicación de Angular + Capacitor, utilice en su lugar los plugins Capgo en lugar de los kits de interfaz de usuario web como Konsta UI:

  • @capgo/capacitor-navegación-nativa — barra de navegación nativa, Liquid Glass barra de pestañas en iOS, y un estilo de barra de pestañas difuminado en Android. Su router de Angular mantiene el estado de ruta; el plugin es dueño de la barra de chrome nativa.
  • @capgo/capacitor-transiciones — transiciones de página estilo Ionic y retroceso de arrastre en la capa WebView en iOS, sin adoptar la interfaz de usuario de Ionic.

Instale ambos:

bun add @capgo/capacitor-native-navigation @capgo/capacitor-transitions
bunx cap sync

Configure la navegación nativa con el modo de inserción de CSS para que el contenido web respete las barras nativas:

import { NativeNavigation } from '@capgo/capacitor-native-navigation';

await NativeNavigation.configure({
  contentInsetMode: 'css',
  animationDuration: 360,
  glass: {
    effect: 'liquidGlass',
  },
});

Renderice una barra de pestañas de vidrio líquido (iOS utiliza la renderización propiedad del sistema; Android utiliza un fondo difuminado de la capa WebView):

import { inject } from '@angular/core';
import { Router } from '@angular/router';

const router = inject(Router);

await NativeNavigation.setTabbar({
  selectedId: 'home',
  labelVisibilityMode: 'labeled',
  icons: true,
  colors: { dynamic: true },
  tabs: [
    { id: 'home', title: 'Home', icon: { svg: '...' } },
    { id: 'settings', title: 'Settings', icon: { svg: '...' } },
  ],
});

await NativeNavigation.addListener('tabSelect', ({ id }) => {
  router.navigate([`/${id}`]);
});

Add native page transitions in your app shell:

```typescript
// app.component.ts
import { Component, CUSTOM_ELEMENTS_SCHEMA, ElementRef, ViewChild, AfterViewInit } from '@angular/core';
import { Router } from '@angular/router';
import '@capgo/capacitor-transitions';
import { initTransitions, setDirection, setupRouterOutlet } from '@capgo/capacitor-transitions';

initTransitions({ platform: 'auto' });

@Component({
  selector: 'app-root',
  schemas: [CUSTOM_ELEMENTS_SCHEMA],
  template: `
    <cap-router-outlet #outlet platform="auto" swipe-gesture="auto">
      <router-outlet></router-outlet>
    </cap-router-outlet>
  `,
})
export class AppComponent implements AfterViewInit {
  @ViewChild('outlet') outlet?: ElementRef<HTMLElement>;

  constructor(private router: Router) {}

  ngAfterViewInit() {
    if (this.outlet?.nativeElement) {
      setupRouterOutlet(this.outlet.nativeElement, { platform: 'auto', swipeGesture: 'auto' });
    }
  }

  openSettings() {
    setDirection('forward');
    this.router.navigate(['/settings']);
  }
}

Envuelva las páginas de rutas en cap-router-outlet, cap-page, y cap-contenty llamar setDirection('forward') o setDirection('back') ¿Otra cosa? ¿Por qué no llamar antes de navegar?

Ver las guías completas: Usando @capgo/capacitor-navegación nativa y Usando @capgo/capacitor-transiciones.

Áreas seguras con Tailwind

Para áreas seguras del dispositivo en Tailwind CSS, utilice @capgo/tailwind-capacitor (publicado como tailwind-capacitor en npm). Proporciona safe-areas utilidades y otras plugins de Tailwind compatibles con Capacitor:

bun add -D tailwind-capacitor

In src/styles.css:

@import 'tailwindcss';
@plugin "@capgo/tailwind-capacitor/platform";
@plugin "@capgo/tailwind-capacitor/safe-areas";

Utilice utilidades como pt-safe, pb-safe, y px-safe en lugar de esparcirlos env(safe-area-inset-*) manualmente. El proyecto está activamente desarrollado — si algo falta para su configuración de Angular, abre una solicitud de extracción en GitHub.

Corrección de problemas de diseño en iOS (Viewport, Área Segura y Desbordamiento Horizontal)

Si el contenido parece recortado, desplazado o desplazable horizontalmente en iOS, agregar más overflow-x: hidden o ajustar la etiqueta de viewport sola no suele solucionar el problema. Pase por estos controles en orden.

Asegúrese de que la etiqueta meta de viewport se aplique correctamente

In src/index.htmlEstablezca la etiqueta meta de viewport en <head>:

<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />

Gestione el área seguro de iOS desde un solo contenedor raíz

Crear un solo contenedor de aplicación y aplicar allí el relleno del área seguro, y no en múltiples componentes anidados:

html,
body,
app-root {
  width: 100%;
  min-height: 100%;
  margin: 0;
  padding: 0;
  overflow-x: hidden;
}

* {
  box-sizing: border-box;
}

.app-shell {
  min-height: 100dvh;
  width: 100%;
  padding-top: env(safe-area-inset-top);
  padding-right: env(safe-area-inset-right);
  padding-bottom: env(safe-area-inset-bottom);
  padding-left: env(safe-area-inset-left);
}

Envuelva todo el contenido de la página dentro de .app-shellEl relleno duplicado del área seguro en encabezados, modales y contenedores de diseño a menudo hace que la interfaz de usuario parezca recortada o demasiado grande.

Con @capgo/tailwind-capacitorpuede expresar el mismo relleno con utilidades como pt-safe pb-safe px-safe en ese solo contenedor.

Establezca Capacitor iOS contentInset a never contexto: Página/área: Página de actualizaciones en vivo. Rol: Etiqueta de interfaz de usuario corta o elemento de navegación. Clave de mensaje `live_update_dynamic_label_to` (Etiqueta dinámica de actualización en vivo a).

En capacitor.config.ts, prefiere el relleno nativo deshabilitado y deja que CSS (o la navegación nativa) contentInsetMode: 'css') tenga el área segura:

const config: CapacitorConfig = {
  appId: 'com.example.myapp',
  appName: 'my-app',
  webDir: 'www',
  ios: {
    contentInset: 'never',
  },
};

Mezclar el relleno de contenido automático de Capacitor con CSS env(safe-area-inset-*) relleno es una causa común de espaciado doble.

Encuentra el elemento que está desbordando en realidad

El culpable usual es un elemento que utiliza 100vw, Tailwind w-screen, un ancho de píxeles fijo, o un ancho min-width.

En Safari Web Inspector, ejecuta:

[...document.querySelectorAll('*')]
  .filter(el => el.scrollWidth > document.documentElement.clientWidth)
  .map(el => ({
    el,
    tag: el.tagName,
    class: el.className,
    scrollWidth: el.scrollWidth,
    clientWidth: document.documentElement.clientWidth,
  }));

Con Tailwind, reemplaza w-screen con w-full When sea posible. Muchos problemas de rebosamiento horizontal provienen de 100vw / w-screenduplicado relleno de zona segura, o un contenedor de ancho fijo — no del meta etiqueta de viewport en sí.

Conclusion

Capacitor es una excelente opción para construir aplicaciones nativas basadas en un proyecto web existente, ofreciendo una forma sencilla de compartir code y mantener una interfaz de usuario consistente.

Y con la adición de Capgoes incluso más fácil agregar actualizaciones en vivo a tu aplicación, asegurando que tus usuarios siempre tengan acceso a las últimas características y correcciones de errores.

Si deseas aprender a agregar Capgo a tu aplicación de Angular, mira el siguiente artículo:

Sigue adelante desde Building Mobile Apps with Angular y Capacitor

Si estás utilizando Building Mobile Apps with Angular y Capacitor para planificar el comportamiento de medios y interfaz nativa, conecta con Usando @capgo/capacitor-actividades-en-vivo para la capacidad nativa en Usando @capgo/capacitor-actividades-en-vivo @capgo/capacitor-actividades-en-vivo para el detalle de implementación en @capgo/capacitor-actividades-en-vivo Usando @capgo/capacitor-reproductor-de-videos para la capacidad nativa en Usando @capgo/capacitor-reproductor-de-videos @capgo/capacitor-reproductor-de-videos para el detalle de implementación en @capgo/capacitor-reproductor-de-videos, y Usando @capgo/capacitor-navegación-nativa para la capacidad nativa en Usando @capgo/capacitor-navegación-nativa.

Actualizaciones en vivo para aplicaciones de Capacitor

When a web-layer bug is live, ship the fix through Capgo instead of waiting days for app store approval. Users get the update in the background while native changes stay in the normal review path.

Asegúrese de que los usuarios reciban la actualización en segundo plano mientras los cambios nativos siguen en el camino de revisión normal.

Apoyo humano de Martin

Iniciar Ahora

Capgo gives you the best insights you need to create a truly professional mobile app.