Salta al contenuto principale

Alternative ai plugin Capacitor Google Maps (2026)

Confronta le alternative al plugin @capacitor/google-maps: MapLibre, Leaflet, Google Maps JS e opzioni native, con code, costi e quando usarle.

Illustrazione dei plugin Capgo per confrontare le opzioni dei plugin mappa Capacitor

Se hai bisogno di un'alternativa a Google Maps per Capacitor, hai tre percorsi realistici: mantenere quello ufficiale @capacitor/google-maps plugin e aggirare i suoi limiti, renderizzare la mappa nella WebView con una libreria JavaScript come MapLibre GL JS o Leaflet, oppure usare un plugin mappa nativo basato su un altro SDK. Capgo non include un plugin per il rendering delle mappe, quindi questa guida confronta le opzioni in modo neutrale e mostra i plugin Capgo che funzionano bene accanto a qualsiasi mappa: handoff di navigazione, geocoding e posizione in background.

Perché gli sviluppatori guardano oltre @capacitor/google-maps

Il plugin ufficiale (versione 8 per Capacitor 8) integra il SDK nativo di Google Maps su iOS e Android e il API JavaScript di Google Maps sul web. Funziona, ma questi punti tornano fuori continuamente.

Un account Google Cloud con fatturazione attiva su ogni piattaforma

Il plugin richiede chiavi API legate a un account Google Cloud con fatturazione attiva, su Android, iOS e web. I prezzi di Google per il caricamento delle mappe native mobile sono generosi, ma devi comunque configurare la fatturazione, limitare le chiavi per piattaforma e tenere d'occhio le quote. I caricamenti web e i servizi come Places e Directions vengono fatturati a consumo dopo le soglie gratuite. Controlla la pagina dei prezzi di Google Maps Platform prima di procedere, perché il modello è cambiato nel 2025.

Su Android la mappa viene disegnata dietro la WebView

Su iOS la vista mappa è inserita nella scroll view della WebView. Su Android viene renderizzata sotto l'intera WebView e il plugin la sposta per seguire l' <capacitor-google-map> elemento. Ogni layer sopra di essa deve essere trasparente:

/* Required on Android with @capacitor/google-maps */
html,
body,
ion-content,
ion-content::part(background) {
  background: transparent !important;
  --background: transparent;
}

Questo è il problema numero uno, il classico «la mia mappa è vuota». Rende anche più difficili overlay personalizzati, modal e transizioni di pagina, perché l'HTML sta sopra una view nativa.

I marker si possono aggiungere e rimuovere, ma non aggiornare

Il API ha addMarker, addMarkers, removeMarker e removeMarkers, ma nessun updateMarker. Una posizione veicolo in tempo reale implica rimozione e aggiunta a ogni aggiornamento, con rischio di flicker e costi in chiamate al bridge.

Stile e funzionalità limitati su native

Alcune opzioni sono solo web, ad esempio mapId per lo styling basato su cloud, e region e language. Otterrai marker, clustering, polilinee, poligoni, cerchi, tile overlay, controllo della camera e listener di click. Se hai bisogno di styling data-driven, heatmaps o edifici 3D in modo identico su tutte le piattaforme, incontrerai dei limiti.

Panoramica delle opzioni

Opzione Rendering Richiede chiave API Fonte delle tile Ideale per
@capacitor/google-maps Native SDK (Android, iOS), JS sul web Sì, fatturazione attiva Google App che vogliono dati Google e performance native
MapLibre GL JS WebGL nella WebView Dipende dal provider di tile Qualsiasi sorgente di vector tile, self-hosting possibile Mappe con stile custom, quasi offline, senza vendor lock-in
Leaflet DOM e canvas nella WebView Dipende dal provider di tile Tile raster (basati su OSM o altri) Mappe semplici, bundle ridotto, molti plugin
Google Maps JS API in WebView Renderer JS di Google Sì Google Stesso look Google su tutte le piattaforme, set completo di funzionalità JS
Plugin nativi MapLibre o Mapbox SDK nativo Dipende Qualsiasi / Mapbox Dati pesanti, sessioni lunghe, gesti nativi

Non c'è un vincitore unico. La scelta giusta dipende dal volume di dati, dalle esigenze di styling e da quanto vuoi dipendere da un singolo vendor.

Opzione 1: MapLibre GL JS nella WebView

MapLibre GL JS è il fork open source di Mapbox GL JS v1. Renderizza i vettori tile con WebGL e funziona bene in WKWebView e nel System WebView di Android. È l'opzione più flessibile se non hai bisogno dei dati di Google.

bun add maplibre-gl
import maplibregl from 'maplibre-gl';
import 'maplibre-gl/dist/maplibre-gl.css';

const map = new maplibregl.Map({
  container: 'map',
  style: 'https://your-tile-provider.example.com/styles/streets/style.json',
  center: [2.3522, 48.8566], // [lng, lat]
  zoom: 12,
});

map.addControl(new maplibregl.NavigationControl(), 'top-right');

// A marker you can move without remove/add
const courier = new maplibregl.Marker({ color: '#1d4ed8' })
  .setLngLat([2.35, 48.85])
  .addTo(map);

export function moveCourier(lng: number, lat: number) {
  courier.setLngLat([lng, lat]);
}

GeoJSON layers, data driven styling e route lines sono first class:

map.on('load', () => {
  map.addSource('route', {
    type: 'geojson',
    data: {
      type: 'Feature',
      properties: {},
      geometry: {
        type: 'LineString',
        coordinates: [
          [2.3522, 48.8566],
          [2.3376, 48.8606],
          [2.2945, 48.8584],
        ],
      },
    },
  });
  map.addLayer({
    id: 'route-line',
    type: 'line',
    source: 'route',
    paint: { 'line-color': '#2563eb', 'line-width': 5 },
  });
});

Cose da sapere:

  • Hai bisogno di una sorgente di tile. Le opzioni includono host di vettori tile commerciali o l'auto-hosting di tile generati dai dati OpenStreetMap. I server tile pubblici di OpenStreetMap hanno una policy di utilizzo che non consente un traffico pesante da app.
  • Mostra sempre l'attribuzione richiesta dal tuo provider di tile.
  • Poiché è semplice web code, la stessa mappa funziona in un'anteprima del browser, accelerando lo sviluppo.

Opzione 2: Leaflet

Leaflet è piccolo e maturo. È adatto per mappe con poche centinaia di marker, tile raster e interazioni semplici.

bun add leaflet
import L from 'leaflet';
import 'leaflet/dist/leaflet.css';

const map = L.map('map').setView([48.8566, 2.3522], 13);

L.tileLayer('https://tiles.example.com/{z}/{x}/{y}.png', {
  maxZoom: 19,
  attribution: '&copy; OpenStreetMap contributors',
}).addTo(map);

L.marker([48.8584, 2.2945]).addTo(map).bindPopup('Eiffel Tower');

Nelle app bundle, i percorsi dei marker icon di default di Leaflet spesso si rompono. Importa le immagini delle icone e imposta L.Icon.Default options, oppure usa le tue L.divIcon.

Opzione 3: API JavaScript di Google Maps nella WebView

Se ti servono i dati e l'aspetto di Google, ma vuoi che la mappa si comporti come un qualsiasi altro elemento HTML, carica l'API JavaScript di Maps nella WebView invece dell'SDK nativo. Perdi un po' di fluidità nativa e ogni caricamento della mappa è un caricamento web fatturabile, ma hai a disposizione tutta l'API JS: cloud styling con map ID, marker avanzati e data layer.

Limita la web key tramite HTTP referrer. Su iOS, Capacitor serve l'app da capacitor://localhost di default, e su Android da https://localhost, quindi aggiungi questi origin alle restrizioni della key e testa entrambi.

Opzione 4: plugin nativi basati su altri SDK

Nella community esistono wrapper nativi per MapLibre Native o per gli SDK Mapbox. Offrono gesture e performance native con qualsiasi tile source. Prima di sceglierne uno, verifica che supporti Capacitor 8, che abbia un rilascio recente, che supporti Swift Package Manager su iOS (il default per i nuovi progetti iOS Capacitor 8) e che copra i tipi di overlay che ti servono. I plugin mappa nativi hanno lo stesso compromesso di layering del plugin ufficiale: la mappa è una view nativa e l'HTML va disposto attorno a essa.

Mantieni @capacitor/google-maps se

  • Ti servono la mappa base, Places e i dati di Street View di Google.
  • La tua mappa è una vista a schermo intero, non una piccola card dentro contenuti scrollabili.
  • Puoi convivere con remove e add per spostare i marker, o aggiorni le posizioni di rado.

Se decidi di tenerlo, imposta il CSS di trasparenza qui sopra, assegna al <capacitor-google-map> elemento una dimensione esplicita, chiama destroy() quando si lascia la pagina, e imposta skipLibCheck: true nella tsconfig.json come richiesto dal README del plugin.

Plugin che funzionano bene con qualsiasi mappa

Qualunque cosa renderizzi la mappa, questi plugin Capgo coprono le parti native che una mappa in WebView non può gestire da sola.

Delega la navigazione turn-by-turn

Sviluppare la navigazione è un progetto a sé. La maggior parte delle app apre invece l'app di navigazione preferita dall'utente. @capgo/capacitor-launch-navigator supporta Apple Maps, Google Maps, Waze e molti altri:

import { LaunchNavigator, TransportMode } from '@capgo/capacitor-launch-navigator';

await LaunchNavigator.navigate({
  destination: [48.8584, 2.2945], // [lat, lng]
  options: { transportMode: TransportMode.DRIVING },
});

Geocoding senza un web service

@capgo/capacitor-nativegeocoder usa i geocoder di piattaforma su iOS e Android, che non richiedono una chiave Google sul dispositivo:

import { NativeGeocoder } from '@capgo/capacitor-nativegeocoder';

const { addresses } = await NativeGeocoder.reverseGeocode({
  latitude: 48.8584,
  longitude: 2.2945,
  maxResults: 1,
});
console.log(addresses[0]?.thoroughfare, addresses[0]?.locality);

const result = await NativeGeocoder.forwardGeocode({
  addressString: '5 Avenue Anatole France, Paris',
  maxResults: 1,
});
console.log(result.addresses[0]?.latitude, result.addresses[0]?.longitude);

Sul web, il plugin usa API di Google e richiede la apiKey opzione.

Mostra la posizione dell'utente, anche in background

Per il "pallino blu" in foreground, @capacitor/geolocation è sufficiente. Per continuare a tracciare mentre l'app è in background, o per attivare eventi quando l'utente entra in un luogo, usa @capgo/background-geolocation, e passa i punti alla mappa che hai scelto.

Risolvere problemi con le mappe in Capacitor

Mappa vuota su Android con il plugin ufficiale. La trasparenza manca su un elemento genitore. Ispeziona con Chrome DevTools tramite chrome://inspect e cerca eventuali colori di sfondo tra <html> e l'elemento mappa.

L'elemento mappa ha altezza zero. I contenitori della mappa non hanno dimensioni intrinseche. Imposta un'altezza esplicita o usa un layout flex con un genitore di altezza fissa.

La mappa WebGL è sfocata o lenta su Android. Verifica che il System WebView sia aggiornato sul dispositivo, riduci il numero di layer ed evita di ricreare la mappa a ogni cambio di rotta. Creala una volta e riusala.

Le tile non si caricano nelle build di release. Controlla la Content Security Policy e la configurazione di sicurezza della rete, assicurandoti che l'host delle tile sia HTTPS.

La mappa si rompe dopo aver modificato l'URL dello stile delle tile. Gli URL di stile e tile sono solo configurazione JavaScript. Puoi cambiare provider per gli utenti esistenti con Live updates di Capgo, senza un rilascio sull'app store, purché non ci siano modifiche native a code.

Come scegliere

  • Hai bisogno di dati Google e prestazioni native su una mappa a schermo intero: mantieni @capacitor/google-maps.
  • Hai bisogno di stili personalizzati, nessuna fatturazione Google e una mappa che si comporti come l'HTML: MapLibre GL JS.
  • Hai bisogno di una mappa semplice con pochi marker: Leaflet.
  • Hai bisogno dell'aspetto Google in un layout scorrevole: Google Maps JS API nel WebView.

Qualunque tu scelga, testa presto su un dispositivo Android di fascia bassa. Per altri componenti nativi, sfoglia il directory dei plugin di Capgo.

Live updates per le app Capacitor

Quando un bug nel web-layer è live, rilascia la fix tramite Capgo invece di aspettare giorni l'approvazione degli store. Gli utenti ricevono l'update in background, mentre le modifiche native restano nel normale processo di review.

Ultimi articoli dal blog

Capgo ti offre gli insight migliori che ti servono per creare un'app mobile davvero professionale.