Saltare al contenuto principale
Tutorial

Costruire App Mobili con Angular e 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

Content Marketer

Costruire App Mobili con Angular e Capacitor

In questo tutorial, inizieremo con una nuova app Angular e passeremo alla sfera dell'app mobile nativa utilizzando __CAPGO_KEEP_0__. Puoi anche aggiungere la navigazione e le transizioni nativa __CAPGO_KEEP_1__ per un'app mobile nativa e utilizzare tailwind-__CAPGO_KEEP_2__ per aree sicure. 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 allows you to easily convert your Angular web application into a native mobile app without requiring significant modifications or learning a new skill like React Native.

With solo pochi passaggi semplici, la maggior parte delle applicazioni Angular può essere trasformata in app mobili.

Questa guida vi guiderà attraverso il processo, iniziando con una nuova app Angular e poi incorporando Capacitor per passare nel regno delle app mobili native. Potete anche utilizzare Capgo per la navigazione nativa, le transizioni e tailwind-capacitor per aree sicure.

Sul Capacitor

CapacitorJS è un vero cambiamento! Potete incorporarlo facilmente in qualsiasi progetto web e renderà la vostra applicazione in un webview nativo, generando il progetto Xcode e Android Studio nativo per voi. Inoltre, i suoi plugin forniscono accesso alle funzionalità del dispositivo nativo come la fotocamera tramite un ponte JS.

Con Capacitor, ottenete una fantastica app mobile nativa senza alcuna configurazione complessa o curva di apprendimento ripida. La sua API e funzionalità streamlinata rendono facile integrarla nel vostro progetto. Sono sicuro che vi sorprenderete alla facilità con cui potete ottenere un'app mobile nativa completa con Capacitor!

Preparazione dell'app Angular

Per creare una nuova app Angular, eseguite il seguente comando:

ng new my-app
cd my-app

Scegliete “Angular” quando viene richiesto la versione di Angular.

Per creare un'app mobile nativa, abbiamo bisogno di un export del nostro progetto. Quindi, includiamo uno script semplice nel nostro package.json That può essere utilizzato per creare e copiare il progetto Angular:

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

Dopo l'esecuzione della __CAPGO_KEEP_0__ buildpotresti notare un nuovo dist cartella nella radice del tuo progetto.

Questa cartella verrà utilizzata da Capacitor in seguito, ma per ora dobbiamo configurarla correttamente.

Aggiungere Capacitor al tuo progetto Angular

Per pacchettizzare qualsiasi app web in un contenitore mobile nativo, dobbiamo seguire alcuni passaggi iniziali, ma in seguito è semplice come eseguire un solo sync comando.

Innanzitutto, possiamo installare il Capacitor CLI come dipendenza di sviluppo e quindi configurarlo nel nostro progetto. Durante la configurazione, puoi premere “invio” per accettare i valori predefiniti per nome e ID bundle.

Successivamente, dobbiamo installare il pacchetto di base e i pacchetti pertinenti per le piattaforme iOS e Android.

Infine, possiamo aggiungere le piattaforme, e Capacitor creerà cartelle per ogni piattaforma nella radice del nostro progetto:

# 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

Da questo punto in poi, dovresti essere in grado di osservare nuove ios e android cartelle nel tuo progetto Angular.

Sono progetti nativi reali!

Per accedere al progetto Android in seguito, è necessario installare Android Studio. Per iOS, è necessario un Mac e dovresti installare Xcode.

Inoltre, dovresti trovare un capacitor.config.ts file del tuo progetto, che contiene alcune impostazioni fondamentali Capacitor utilizzate durante la sincronizzazione. L'unica cosa a cui devi prestare attenzione è il webDir, che deve puntare al risultato del comando di build. Attualmente, è inesatto.

Per correggere questo, apri il capacitor.config.json file e aggiorna il webDir:

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

Puoi provare a farlo eseguendo i seguenti comandi:

npm run build
npx cap sync

Il primo comando npm run build costruirà semplicemente il tuo progetto Angular e copierà la build statica, mentre il secondo comando npx cap sync sincronizzerà tutti i web code nei posti giusti delle piattaforme native affinché possano essere visualizzati nell'app.

Inoltre, il comando di sincronizzazione potrebbe aggiornare le piattaforme native e installare i plugin, quindi quando installi un nuovo Capacitor plugin è arrivato il momento di eseguire npx cap sync ancora.

Senza accorgersene, sei ora effettivamente finito, quindi vediamo l'app sul dispositivo!

Costruisci e distribuisci app native

Per sviluppare app iOS, hai bisogno di avere Xcode installato, e per le app Android, hai bisogno di avere Android Studio installato. Inoltre, se hai in programma di distribuire la tua app sul negozio di app, devi iscriverti al programma di sviluppatore Apple per iOS e al Google Play Console per Android.

Se sei nuovo allo sviluppo di app mobili native, puoi utilizzare il Capacitor CLI per aprire facilmente entrambi i progetti native:

npx cap open ios
npx cap open android

Una volta che hai configurato i tuoi progetti nativi, distribuire la tua app su un dispositivo connesso è facile. In Android Studio, basta aspettare che tutto sia pronto, e puoi distribuire la tua app su un dispositivo connesso senza modificare alcun impostazione. Ecco un esempio:

android-studio-run

In Xcode, devi configurare il tuo account di firma per distribuire la tua app su un dispositivo reale invece che solo sul simulatore. Se non l'hai fatto prima, Xcode ti guida attraverso il processo (ma di nuovo, devi essere iscritto al Programma per sviluppatori). Successivamente, puoi semplicemente premere play per eseguire l'app sul tuo dispositivo connesso, che puoi selezionare in alto. Ecco un esempio:

xcode-run

Congratulazioni! Hai distribuito con successo la tua app web Angular su un dispositivo mobile. Ecco un esempio:

angular-mobile-app

Ma aspetta, c'è anche un modo più veloce per farlo durante lo sviluppo…

Capacitor Live Reload

Da adesso, sei probabilmente abituato a avere il carico caldo con tutti i framework moderni, e la buona notizia è che puoi avere la stessa funzionalità su un dispositivo mobile con sforzo minimo!

Abilita l'accesso alla tua applicazione ospitata localmente con il carico caldo On il tuo rete Per avere il Capacitor caricare il contenuto dal URL specifico.

Il primo passo è capire l'indirizzo IP locale. Se stai utilizzando un Mac, puoi scoprire questo eseguendo il seguente comando nel terminale:

ipconfig getifaddr en0

On Windows, esegui:

ipconfig

Poi cerca l'indirizzo IPv4.

Posiamo istruire Capacitor a caricare l'app direttamente dal server aggiungendo un'altra voce al nostro capacitor.config.ts file:

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;

Sicuro di utilizzare l'indirizzo IP e il port corretto Ho utilizzato il porto predefinito di Angular in questo esempio.

Ora, possiamo applicare questi cambiamenti copiandoli nel nostro progetto nativo:

npx cap copy

Le copy il comando è simile a syncma si applicherà solo copierà solo le modifiche apportate al folder web e alla configurazione, senza aggiornare il progetto nativo.

Ora puoi distribuire nuovamente il tuo app tramite Android Studio o Xcode. Dopo di che, se cambi qualcosa nel tuo app Angular, l'app si ricaricherà automaticamente e mostrerà le modifiche!

Tieni presente che se installi nuovi plugin come la fotocamera, è ancora necessario ricostruire il progetto nativo. Ciò è dovuto al fatto che i file nativi sono stati modificati, e non è possibile farlo in tempo reale.

Nota che dovresti utilizzare l'IP e il port corretti nella tua configurazione. Il blocco code sopra mostra il porto predefinito di Angular per fini dimostrativi.

Utilizzo dei Plugin Capacitor

Ecco un esempio di come utilizzare un plugin Capacitor in azione, di cui abbiamo parlato prima. Per farlo, possiamo installare un plugin abbastanza semplice eseguendo:

npm i @capacitor/share

There’s nothing fancy about the Condividi pluginma comunque apre il dialogo di condivisione nativo! Per questo ora dobbiamo solo importare il pacchetto e chiamare la funzione corrispondente dal nostro app, quindi cambiamo il share() src/app/app.component.ts a questo: Come menzionato in precedenza, quando si installano nuovi plugin, è necessario eseguire un'operazione di sincronizzazione e poi ri-deployare l'app sul nostro dispositivo. Per farlo, esegui il seguente 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'
    });
  }
}

Dopo aver premuto il pulsante, puoi assistere al bellissimo dialogo di condivisione nativo in azione!

npx cap sync

Successivamente, puoi rendere l'app più nativa su iOS e Android con la __CAPGO_KEEP_0__ navigazione e le transizioni, e risolvere i problemi di layout comuni di iOS che causano un sovrappiù orizzontale o aree sicure tagliate.

Interfaccia utente con un aspetto nativo con Capgo Navigazione e Transizioni Nativa

Native-feeling UI with Capgo Native Navigation and Transitions

Ionic Capacitor To costruire applicazioni cross-platform, ma integrarla con Angular è un po' artigianale e raramente vale la pena quando già ne hai una Per un aspetto nativo su un'app Angular + __CAPGO_KEEP_0__ utilizza i plugin __CAPGO_KEEP_1__ al posto di kit UI web come Konsta UI:.

@Capacitor/Capgo-native-navigation

Configura la navigazione nativa con il CSS inset mode affinché il contenuto web rispetti le barre native:

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

Rendi una barra delle schede di vetro liquido (iOS utilizza la rendering di sistema; Android utilizza un sfondo sfocato del WebView):

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

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

Avvolgi le pagine di rotta in

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']);
  }
}

, e cap-router-outlet, cap-page]} (Note: I translated Liquid Glass as cap-contentEsegui le chiamate, prima di navigare. Non duplicare i titoli o i piedi di pagina web quando la navigazione nativa gestisce queste superfici. setDirection('forward') Vedi le guide complete: setDirection('back') Utilizza @__CAPGO_KEEP_0__/__CAPGO_KEEP_1__-navigazione-nativa

e Utilizza @capgo/capacitor-transizioni Zone sicure con Tailwind Using @capgo/capacitor-transitions.

@__CAPGO_KEEP_0__/tailwind-__CAPGO_KEEP_1__

Pubblicato come @capgo/tailwind-capacitor e tailwind-capacitor on npm). It provides safe-areas utilità e altre Capacitor-compatibili estensioni di Tailwind:

bun add -D tailwind-capacitor

In src/styles.css:

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

Utilizza utilità come pt-safe, pb-safe, e px-safe invece di spargere env(safe-area-inset-*) manualmente. Il progetto è attivamente sviluppato — se qualcosa manca per la tua configurazione Angular, apri una PR su GitHub.

Risolvere problemi di layout iOS (Viewport, Area di sicurezza, e sovrapposizione orizzontale)

Se il contenuto sembra essere tagliato, spostato o scrollabile orizzontalmente su iOS, aggiungere più overflow-x: hidden o regolare la tag di viewport da solo non risolve di solito il problema. Passa attraverso questi controlli in ordine.

Assicurati che la meta tag viewport sia applicata correttamente

In src/index.htmlimpostare l'etichetta meta viewport in <head>:

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

gestire l'area sicura di iOS da un solo wrapper radice

Creare un unico contenitore dell'applicazione e applicare il padding dell'area sicura lì — non nei componenti nidificati multipli:

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);
}

Avvolgere tutta la pagina dentro .app-shellSi applica spesso il padding dell'area sicura duplicato nei titoli, nei modali e nei wrapper di layout, il che fa sì che l'interfaccia utente sembri tagliata o troppo grande.

Con @capgo/tailwind-capacitorpuoi esprimere lo stesso padding con utilità come pt-safe pb-safe px-safe su quel singolo contenitore.

Impostare Capacitor iOS contentInset a never primo

In capacitor.config.ts, prefer native inset disabled e lascia che CSS (o la navigazione nativa) gestisca l'area sicura: contentInsetMode: 'css'Mixing __CAPGO_KEEP_0__’s automatic content inset con CSS

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

Mixing Capacitor’s automatic content inset with CSS env(safe-area-inset-*) Cerca l'elemento che sta veramente sovrapponendo

L'elemento più comune colpevole è un elemento che utilizza

, Tailwind 100vw, una larghezza in pixel fissata, o un valore molto w-screenIn Safari Web Inspector, esegui: min-width.

Con Tailwind, sostituisci

[...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 w-screen con w-full quando possibile. Molti problemi di sovrapposizione orizzontale derivano da 100vw / w-screen, padding di area sicura duplicato, o da un contenitore di larghezza fissata — non dal tag meta viewport stesso.

Conclusioni

Capacitor è un'ottima opzione per costruire applicazioni native basate su un progetto web esistente, offrendo un modo semplice per condividere code e mantenere un'interfaccia utente coerente.

E con l'aggiunta di Capgo, è ancora più facile aggiungere aggiornamenti in tempo reale all'app, assicurando che i tuoi utenti abbiano sempre accesso alle ultime funzionalità e correzioni di bug.

Se desideri imparare a aggiungere Capgo al tuo'app Angular, prendi un'occhiata all'articolo successivo:

Continua a procedere da Building Mobile Apps con Angular e Capacitor

Se stai utilizzando Building Mobile Apps con Angular e Capacitor per pianificare il comportamento dei media e dell'interfaccia nativi, connettilo con Utilizzando @capgo/capacitor-live-attività per la capacità nativa in Utilizzando @capgo/capacitor-live-attività @capgo/capacitor-live-attività per il dettaglio di implementazione in @capgo/capacitor-live-attività Utilizzando @capgo/capacitor-player-video per la capacità nativa in Utilizzando @capgo/capacitor-player-video @capgo/capacitor-player-video per il dettaglio di implementazione in @capgo/capacitor-player-video, e Utilizzando @capgo/capacitor-navigazione-nativa per la capacità nativa in Utilizzando @capgo/capacitor-navigazione-nativa.

Aggiornamenti in tempo reale per le app Capacitor

Quando un bug del layer web è attivo, invia la correzione attraverso Capgo invece di aspettare giorni per l'approvazione della store. Gli utenti ricevono l'aggiornamento in background mentre le modifiche native rimangono nel normale percorso di revisione.

Supporto umano da Martin

Inizia subito

Ultimi articoli dal nostro Blog

Capgo ti dà le migliori informazioni che ti servono per creare un'app mobile veramente professionale.