Se stai cercando un'alternativa alla geolocalizzazione in background di Transistorsoft per Capacitor, l'opzione gratuita più vicina è @capgo/background-geolocation. È con licenza MIT, disponibile per Capacitor 8, traccia la posizione in background su iOS e Android, supporta il geofencing nativo e può inviare le posizioni al tuo server tramite code nativo. Non replica tutte le funzionalità di Transistorsoft, quindi questa guida copre cosa guadagni, cosa perdi e come migrare.
Perché i team cercano un'alternativa a Transistorsoft
Il SDK di Transistorsoft è un prodotto maturo che da anni alimenta app per flotte, consegne e fitness. Raramente se ne va perché è rotto. Lo lasciano per questi motivi:
Le release build ora richiedono una chiave su entrambe le piattaforme
Secondo il changelog di Transistorsoft, la versione 9.0.0 è passata a una chiave di licenza basata su JWT e ha iniziato a richiedere una chiave anche su iOS. Prima della v9, solo le build di rilascio per Android erano bloccate. Le chiavi della v8 e precedenti non funzionano con la v9, quindi aggiornare il plugin significa anche generare nuove chiavi dal loro dashboard.
Il loro negozio vende licenze perpetue per identificativo app, da una chiave fino a 100, con un anno di aggiornamenti incluso. Gli add-on come il geofencing poligonale sono ora codificati nella stessa chiave. Per un'app è un prezzo ragionevole. Per un'agenzia con 20 app white label, o un'azienda che rilascia bundle ID separati per staging e produzione, la licenza diventa una voce di costo da gestire ogni anno.
Il motore principale è un binario
Il wrapper Capacitor è aperto, ma il motore di localizzazione viene fornito come framework iOS precompilato e libreria Android da Maven. Quando succede qualcosa di strano su un OEM Android specifico, non puoi leggere o patchare il code che decide quando registrare una posizione. Alcuni team lo accettano. I team con requisiti di audit rigorosi, o che vogliono semplicemente eseguire il debug del code in Xcode, spesso no.
Superficie di configurazione
Il plugin espone un oggetto di configurazione molto ampio: rilevamento del movimento, scheduling, odometro, persistenza SQLite, template di sincronizzazione HTTP, task headless e altro. Se ne hai bisogno, ottimo. Se ti serve solo "inviare la mia posizione ogni 30 secondi mentre l'autista è in turno", sono troppe impostazioni da capire.
Cosa fa @capgo/background-geolocation
Il plugin Capgo nasce dalla lunga storia dei fork di background geolocation di Cordova e dal leggero plugin community Capacitor. L'obiettivo è fornire posizioni accurate, un'operazione in background affidabile e geofencing nativo, senza licenza.
Funzionalità attuali nella linea 8.x:
- Aggiornamenti di posizione in foreground e background tramite una singola
start()chiamata con callback. distanceFiltereminIntervalMsper controllare la frequenza di arrivo dei punti.- HTTP POST nativo di ogni posizione a un
urlyou configure, with customheaderseupdateHeaders()per la rotazione dei token. - Geofence circolari native con eventi di ingresso e uscita, e un webhook nativo per le transizioni.
checkPermissions()erequestPermissions()che distinguono iOS When In Use da Always.openSettings()per gli utenti che hanno negato il permesso.setPlannedRoute()per riprodurre un suono quando l'utente si discosta da un percorso pianificato.- Android facoltativo
networkFallbackche colma le lacune GPS con le posizioni di rete. - Un'implementazione web per lo sviluppo e i test nel browser.
Confronto funzionalità
| Funzionalità | Transistorsoft (v9) | @capgo/background-geolocation |
|---|---|---|
| Licenza | Chiave a pagamento per release build, per app ID | MIT, gratuito |
| Sorgente | Wrapper open, engine come binario | Completamente open source |
| Capacitor 8 | Sì | Sì |
| Tracciamento in background | Sì | Sì |
| State machine rilevamento movimento | Sì | No |
| Upload HTTP nativo | Sì, con coda SQLite e batching | Sì, POST best effort, nessuna coda su disco |
| Geofencing | Sì, poligono come add-on | Geofence circolari su iOS e Android |
| Eventi geofence inviati al tuo server | Sì, tramite sync HTTP | Sì, webhook nativo |
| Tracking dopo che l'app è stata rimossa (Android) | Sì | Sì, con url imposta |
| Tracciamento dopo il riavvio | Sì (startOnBoot) |
No |
| Pianificazione, contachilometri | Sì | No |
Il riassunto onesto: Transistorsoft è la scelta migliore quando l'app deve decidere da sola quando tracciare, sopravvivere ai riavvii e bufferizzare settimane di punti offline. Il plugin Capgo è la scelta migliore quando l'utente o la tua app avvia esplicitamente il tracciamento e vuoi fix accurati senza licenza e code leggibile.
Installazione e configurazione
bun add @capgo/background-geolocation
bunx cap sync
iOS
Aggiungi le stringhe di utilizzo e la modalità background per la posizione a ios/App/App/Info.plist:
<key>NSLocationWhenInUseUsageDescription</key>
<string>We use your location to show your route.</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>We use your location in the background to record your route while the phone is locked.</string>
<key>UIBackgroundModes</key>
<array>
<string>location</string>
</array>
Ricorda che gli upload su App Store richiedono Xcode 26 da aprile 2026. Se la tua immagine CI è più vecchia, l'upload verrà rifiutato anche se la build ha successo. Build Capgo funziona con le immagini Xcode attuali se non vuoi gestire Mac.
Android
Il plugin utilizza un servizio in primo piano con una notifica persistente durante il tracciamento in background. Su Android 13 e versioni successive, richiede POST_NOTIFICATIONS dopo che la posizione è stata concessa, in modo da poter mostrare la notifica.
Imposta useLegacyBridge nella capacitor.config.ts. Senza di essa, i callback di posizione verso la WebView possono interrompersi dopo circa cinque minuti in background:
import type { CapacitorConfig } from '@capacitor/cli';
const config: CapacitorConfig = {
appId: 'com.example.tracker',
appName: 'Tracker',
webDir: 'dist',
android: {
useLegacyBridge: true,
},
};
export default config;
Puoi personalizzare il nome del canale di notifica, l'icona e il colore tramite strings.xml chiavi documentate nel docs del plugin.
Avvia il tracciamento
import { BackgroundGeolocation } from '@capgo/background-geolocation';
export async function startShift(token: string) {
await BackgroundGeolocation.start(
{
backgroundTitle: 'Shift in progress',
backgroundMessage: 'Your location is shared with dispatch until you end the shift.',
requestPermissions: true,
stale: false,
distanceFilter: 25,
url: 'https://api.example.com/v1/locations',
headers: { Authorization: `Bearer ${token}` },
minIntervalMs: 30_000,
},
(location, error) => {
if (error) {
if (error.code === 'NOT_AUTHORIZED') {
BackgroundGeolocation.openSettings();
}
console.error(error);
return;
}
if (location) {
// Update the UI while the WebView is alive
console.log(location.latitude, location.longitude, location.accuracy);
}
},
);
}
export async function endShift() {
await BackgroundGeolocation.stop();
}
Due opzioni contano più di quanto sembri:
backgroundMessageè ciò che attiva gli aggiornamenti in background, su entrambe le piattaforme. Senza, gli aggiornamenti sono garantiti solo in foreground. Su Android è anche il testo della notifica del servizio in foreground.urlinvia ogni punto da code nativo con un"source": "native"campo nel body. Questo percorso non dipende dalla WebView, ed è ciò che mantiene il flusso di dati quando Android limita la WebView o iOS sospende JavaScript. Su Android, impostandourlrendi anche il servizio sticky, così i punti continuano ad arrivare al tuo server dopo che l'app è stata chiusa con uno swipe. Servono entrambe le opzioni per un tracciamento in background affidabile.
Quando l'access token scade, ruotalo senza riavviare la sessione:
await BackgroundGeolocation.updateHeaders({
headers: { Authorization: `Bearer ${newToken}` },
});
Geofencing
Gli utenti di Transistorsoft spesso si affidano al suo geofencing. Il plugin Capgo copre le aree circolari con API native su entrambe le piattaforme:
import { BackgroundGeolocation } from '@capgo/background-geolocation';
await BackgroundGeolocation.setupGeofencing({
url: 'https://api.example.com/v1/geofence-events',
headers: { Authorization: 'Bearer <token>' },
notifyOnEntry: true,
notifyOnExit: true,
payload: { driverId: 'd-381' },
backgroundLocation: true, // Android only, needs ACCESS_BACKGROUND_LOCATION in your manifest
});
await BackgroundGeolocation.addGeofence({
identifier: 'depot-north',
latitude: 48.8584,
longitude: 2.2945,
radius: 200,
payload: { depotId: 'north' },
});
await BackgroundGeolocation.addListener('geofenceTransition', (event) => {
console.log(event.identifier, event.transition, event.payload);
});
Il geofencing su iOS richiede l'autorizzazione Always. Su Android 10 e versioni successive, il geofencing in background richiede ACCESS_BACKGROUND_LOCATION, che il plugin non aggiunge automaticamente. Aggiungilo solo se la tua app ha l'approvazione di Google Play per la posizione in background. Se i tuoi geofence si comportano in modo strano su iOS, leggi la nostra guida su perché i geofence non si attivano su iOS.
Migrare da Transistorsoft
Le API sono diverse, quindi pianifica una piccola riscrittura del tuo servizio di localizzazione invece di un semplice find and replace.
| Concetto Transistorsoft | Equivalente di Capgo |
|---|---|
ready(config) + start() |
start(options, callback) |
onLocation listener |
Il start() callback |
stop() |
stop() |
distanceFilter |
distanceFilter |
url, headers Sync HTTP |
url, headers, updateHeaders() |
addGeofence / onGeofence |
addGeofence / geofenceTransition |
removeGeofence(s) |
removeGeofence / removeAllGeofences |
getGeofences |
getMonitoredGeofences |
| Helper per i permessi | checkPermissions / requestPermissions |
| Rilevamento movimento, pianificazione, odometro | Implementalo nella logica della tua app o sul server |
Passi che funzionano bene nella pratica:
- Incorpora l'accesso alla posizione dietro un piccolo servizio nella tua app (
startTracking,stopTracking,onPoint). La maggior parte delle app ne ha già uno. - Implementa il servizio con il plugin Capgo dietro una feature flag o una build separata.
- Configura il backend per accettare il JSON di posizione del plugin. Il body corrisponde al
Locationtype (latitude,longitude,accuracy,speed,bearing,timee così via) piùsource. - Rimuovi il plugin Transistorsoft, le sue chiavi di licenza, le variabili Gradle extra e le modalità in background non più necessarie.
- Testa su dispositivi reali con lo schermo bloccato per almeno 30 minuti, su almeno un Pixel, un Samsung e un iPhone.
Le modifiche ai plugin nativi richiedono un nuovo build per lo store. Una volta pubblicato, puoi continuare a rilasciare fix JavaScript per la tua UI di tracking con Live updates di Capgo senza un altro ciclo di revisione.
Quando il plugin Capgo non è sufficiente
Sii chiaro su questi punti prima di passare:
- Nessuna coda persistente. Le POST native sono best effort. Se il dispositivo è offline, i punti falliti vengono loggati e scartati. Se non puoi perdere un punto, salva i punti anche localmente nel callback (ad esempio con SQLite) e sincronizzali dall'app, oppure continua a usare Transistorsoft.
- Nessun riavvio automatico dopo il reboot. Il tracking riprende la prossima volta che l'utente apre l'app.
- Nessun rilevamento automatico del movimento. L'app decide quando avviare e fermare il tracking.
- Terminazione su iOS. Se l'utente forza la chiusura su iOS, gli aggiornamenti standard della posizione si fermano. È una regola del sistema operativo, non un limite del plugin.
Per saperne di più su cosa Capacitor può eseguire mentre l'app è in background, consulta come funzionano i task in background in Capacitor.
Risoluzione problemi
Gli aggiornamenti si fermano dopo pochi minuti su Android. Verifica useLegacyBridge: true, verifica che la notifica del servizio in primo piano sia visibile e disattiva l'ottimizzazione della batteria per l'app durante i test su OEM aggressivi. Usa il url opzione in modo che la consegna non dipenda dalla WebView.
Nessun aggiornamento in background su iOS. Verifica UIBackgroundModes contiene location, che hai passato backgroundMessage, e che hai chiamato start() mentre l'app era in primo piano. La nostra guida su why iOS stops background location updates esamina ogni causa.
NOT_AUTHORIZED errore. L'utente ha negato l'accesso alla posizione. Chiama openSettings() dopo aver spiegato perché l'app ne ha bisogno.
Punti instabili al chiuso. Aumenta distanceFilter, ignora i punti con valori accuracy elevati e su Android valuta networkFallback: true solo se i fix approssimativi sono accettabili.
Posizioni simulate in un'app di delivery. Ogni Location ha una simulated flag. Per controlli più rigorosi, aggiungi @capgo/capacitor-mock-location-detector.
Scegliere
Scegli Transistorsoft se ti servono auto start basato su movimento, persistenza dopo il riavvio, coda offline e geofence poligonali, e il costo della licenza è sostenibile. Scegli @capgo/background-geolocation se il tuo tracking è basato su sessioni, vuoi code leggibili e nessuna licenza per app, e non hai problemi a gestire la coda nella tua app. Se stai sostituendo più SDK nativi a pagamento in una volta sola, il alternative ai plugin Ionic Enterprise pagina elenca le altre alternative a Capgo.