Si vous cherchez une alternative à la géolocalisation en arrière-plan de Transistorsoft pour Capacitor, l’option gratuite la plus proche est @capgo/background-geolocation. Il est sous licence MIT, disponible pour Capacitor 8, suit la localisation en arrière-plan sur iOS et Android, prend en charge le géorepérage natif et peut envoyer les positions à votre serveur depuis le code natif code. Il ne reproduit pas toutes les fonctionnalités de Transistorsoft, ce guide détaille donc ce que vous y gagnez, ce que vous perdez et comment migrer.
Pourquoi les équipes cherchent une alternative à Transistorsoft
Le SDK de Transistorsoft est un produit mature qui fait tourner des apps de gestion de flotte, de livraison et de fitness depuis des années. On le quitte rarement parce qu'il est défaillant. On le quitte pour ces raisons :
Release builds now need a key on both platforms
Selon le changelog de Transistorsoft, la version 9.0.0 est passée à une clé de licence basée sur JWT et exige désormais une clé sur iOS aussi. Avant la v9, seuls les builds de release Android étaient verrouillés. Les clés de la v8 et antérieures ne fonctionnent pas avec la v9 : passer le plugin en v9 implique donc aussi de générer de nouvelles clés depuis leur dashboard.
Leur store vend des licences perpétuelles par identifiant d'app, de 1 à 100 clés, avec un an de mises à jour incluses. Les add-ons comme le geofencing polygonal sont désormais encodés dans la même clé. Pour une seule app, le prix reste raisonnable. Pour une agence avec 20 apps en marque blanche, ou une entreprise qui déploie des bundle IDs distincts pour le staging et la production, la licence devient un poste de coût à gérer chaque année.
Le moteur principal est un binaire
Le wrapper Capacitor est open source, mais le moteur de localisation est livré sous forme de framework iOS préconstruit et de bibliothèque Android via Maven. Quand quelque chose d'étrange se produit sur un appareil Android d'un constructeur donné, vous ne pouvez ni lire ni patcher le code qui décide quand enregistrer une position. Certaines équipes l'acceptent. Celles qui ont des exigences d'audit strictes, ou qui veulent simplement parcourir le code pas à pas dans Xcode, ne l'acceptent souvent pas.
Surface de configuration
Le plugin expose un objet de configuration très volumineux : détection de mouvement, planification, odomètre, persistance SQLite, templates de synchronisation HTTP, tâches headless et bien plus. Si vous avez besoin de tout cela, c'est parfait. Mais si vous voulez simplement « envoyer ma position toutes les 30 secondes pendant que le chauffeur est en service », cela fait beaucoup de paramètres à comprendre.
Ce que fait @capgo/background-geolocation
Le plugin Capgo est issu de la longue histoire des forks de background geolocation pour Cordova et du plugin communautaire léger Capacitor. L'objectif : des positions précises, un fonctionnement fiable en arrière-plan et du geofencing natif, sans licence.
Fonctionnalités actuelles de la version 8.x :
- Mises à jour de localisation en foreground et background via un seul
start()appel avec un callback. distanceFilteretminIntervalMspour contrôler la fréquence d'arrivée des points.- Requête HTTP POST native de chaque position vers un
urlque vous configurez, avec des paramètres personnalisésheadersetupdateHeaders()pour la rotation des tokens. - Geofences circulaires natives avec événements d'entrée et de sortie, et un webhook natif pour les transitions.
checkPermissions()etrequestPermissions()qui distinguent le mode iOS « When In Use » du mode « Always ».openSettings()pour les utilisateurs ayant refusé la permission.setPlannedRoute()pour jouer un son lorsque l'utilisateur quitte un itinéraire prévu.- Optionnel sur Android
networkFallbackqui comble les lacunes du GPS avec la localisation réseau. - Une implémentation web pour le développement et les tests sur navigateur.
Comparatif des fonctionnalités
| Capacité | Transistorsoft (v9) | @capgo/background-geolocation |
|---|---|---|
| Licence | Clé payante pour les builds de release, par ID d’app | MIT, gratuit |
| Source | Wrapper open source, binaire du moteur | Entièrement open source |
| Capacitor 8 | Oui | Oui |
| Suivi en arrière-plan | Oui | Oui |
| Machine à états de détection de mouvement | Oui | Non |
| Upload HTTP natif | Oui, avec file SQLite et groupement | Oui, POST en best effort, sans file sur disque |
| Géorepérage | Oui, polygone en add-on | Géorepérage circulaire sur iOS et Android |
| Événements de géorepérage envoyés à votre serveur | Oui, via synchronisation HTTP | Oui, webhook natif |
| Suivi après fermeture de l'app (Android) | Oui | Oui, avec url configurer |
| Suivi après redémarrage | Oui (startOnBoot) |
Non |
| Planification, odomètre | Oui | Non |
Le résumé honnête : Transistorsoft est plus adapté quand l'app doit décider seule quand tracker, survivre aux redémarrages et mettre en mémoire tampon des semaines de points hors ligne. Le plugin Capgo est plus adapté quand l'utilisateur ou votre app démarre explicitement le suivi, et que vous voulez des positions précises sans licence et des code lisibles.
Installer et configurer
bun add @capgo/background-geolocation
bunx cap sync
iOS
Ajoutez les chaînes d’utilisation et le mode arrière-plan de localisation à 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>
N’oubliez pas que les uploads sur l’App Store exigent Xcode 26 depuis avril 2026. Si votre image CI est plus ancienne, l’upload sera rejeté, même si le build réussit. Build Capgo s'exécute sur les images Xcode actuelles si vous ne voulez pas maintenir de Macs.
Android
Le plugin utilise un service de premier plan avec une notification persistante lors du suivi en arrière-plan. Sur Android 13 et versions ultérieures, il demande POST_NOTIFICATIONS une fois la localisation accordée afin que la notification puisse s'afficher.
Définissez useLegacyBridge dans capacitor.config.ts. Sans cela, les callbacks de localisation vers la WebView peuvent s'interrompre après environ cinq minutes en arrière-plan :
import type { CapacitorConfig } from '@capacitor/cli';
const config: CapacitorConfig = {
appId: 'com.example.tracker',
appName: 'Tracker',
webDir: 'dist',
android: {
useLegacyBridge: true,
},
};
export default config;
Vous pouvez personnaliser le nom du canal de notification, l'icône et la couleur via strings.xml clés documentées dans la doc du plugin.
Démarrer le suivi
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();
}
Deux options sont plus cruciales qu'il n'y paraît :
backgroundMessageactive les mises à jour en arrière-plan sur les deux plateformes. Sans elle, les mises à jour ne sont garanties qu'au premier plan. Sur Android, il s'agit également du texte de la notification du service de premier plan.urlenvoie chaque point depuis le code natif avec un"source": "native"champ dans le corps. Ce chemin ne dépend pas de la WebView, ce qui permet de maintenir le flux de données quand Android bride la WebView ou qu'iOS suspend le JavaScript. Sur Android, configurerurlrend également le service persistant, afin que les points continuent d'atteindre votre serveur même après avoir fermé l'application. Vous avez besoin de ces deux options pour un suivi fiable en arrière-plan.
Lorsque le token d'accès expire, renouvelez-le sans redémarrer la session :
await BackgroundGeolocation.updateHeaders({
headers: { Authorization: `Bearer ${newToken}` },
});
Géorepérage
Les utilisateurs de Transistorsoft comptent souvent sur son geofencing. Le plugin Capgo couvre les zones circulaires via les API natives sur les deux plateformes :
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);
});
Le geofencing sur iOS nécessite l'autorisation Always. Sur Android 10 et versions ultérieures, le geofencing en arrière-plan nécessite ACCESS_BACKGROUND_LOCATION, que le plugin n’ajoute pas pour vous. Ajoutez-l’uniquement si votre application a obtenu l’approbation de Google Play pour la localisation en arrière-plan. Si vos zones de géorepérage se comportent de manière inattendue sur iOS, consultez notre guide sur pourquoi les geofences ne se déclenchent pas sur iOS.
Migration depuis Transistorsoft
Les API sont différentes, prévoyez donc une petite réécriture de votre service de localisation plutôt qu’un simple remplacement de texte.
| Concept Transistorsoft | Équivalent Capgo |
|---|---|
ready(config) + start() |
start(options, callback) |
onLocation listener |
Le start() callback |
stop() |
stop() |
distanceFilter |
distanceFilter |
url, headers HTTP sync |
url, headers, updateHeaders() |
addGeofence / onGeofence |
addGeofence / geofenceTransition |
removeGeofence(s) |
removeGeofence / removeAllGeofences |
getGeofences |
getMonitoredGeofences |
| Aides aux permissions | checkPermissions / requestPermissions |
| Détection de mouvement, planification, odomètre | Implémentez dans votre logique d'app ou sur le serveur |
Étapes qui fonctionnent bien en pratique :
- Encapsulez l'accès à la localisation via un petit service dans votre app (
startTracking,stopTracking,onPoint). La plupart des apps en ont déjà un. - Implémentez le service avec le plugin Capgo derrière un feature flag ou un build séparé.
- Configurez votre backend pour accepter le JSON de localisation du plugin. Le corps correspond au
Locationtype (latitude,longitude,accuracy,speed,bearing,timeet ainsi de suite) plussource. - Supprimez le plugin Transistorsoft, ses clés de licence, les variables Gradle supplémentaires et les modes background dont vous n'avez plus besoin.
- Testez sur des appareils réels avec l'écran verrouillé pendant au moins 30 minutes, sur au moins un Pixel, un Samsung et un iPhone.
Les changements de plugin natif nécessitent un nouveau build pour les stores. Une fois ce build publié, vous pouvez continuer à déployer des correctifs JavaScript pour votre UI de tracking avec les live updates Capgo sans nouveau cycle de révision.
Quand le plugin Capgo ne suffit plus
Soyez au clair sur ces points avant de changer :
- Pas de file d'attente persistante. Les POST natifs sont en best effort. Si l'appareil est hors ligne, les points en échec sont loggés puis abandonnés. Si vous ne pouvez pas perdre un point, stockez-les aussi en local dans le callback (par exemple avec SQLite) et synchronisez-les depuis l'app, ou gardez Transistorsoft.
- Pas de redémarrage après un reboot. Le suivi reprend la prochaine fois que l'utilisateur ouvre l'app.
- Pas de détection automatique de mouvement. L'app décide quand démarrer et s'arrêter.
- Terminaison sur iOS. Si l'utilisateur force la fermeture sur iOS, les mises à jour de localisation standard s'arrêtent. C'est une règle de l'OS, pas une limite du plugin.
Pour plus de contexte sur ce que Capacitor peut exécuter quand l'app est en arrière-plan, consultez how background tasks work in Capacitor.
Troubleshooting
Les mises à jour s’arrêtent après quelques minutes sur Android. Vérifier useLegacyBridge: true, confirmez que la notification du service de premier plan est visible et désactivez l'optimisation de la batterie pour l'app pendant vos tests sur les constructeurs restrictifs. Utilisez l' url option pour que la livraison ne dépende pas de la WebView.
Aucune mise à jour en arrière-plan sur iOS. Confirmer UIBackgroundModes contient location, que vous avez transmis backgroundMessage, et que vous avez appelé start() pendant que l'app était au premier plan. Notre guide sur pourquoi iOS arrête la localisation en arrière-plan passe en revue chaque cause.
NOT_AUTHORIZED erreur. L'utilisateur a refusé la localisation. Appelez openSettings() après avoir expliqué pourquoi l'app en a besoin.
Points instables en intérieur. Augmenter distanceFilter, ignorez les points avec de grandes accuracy valeurs, et sur Android, envisagez networkFallback: true only if coarse fixes are acceptable.
Localisations simulées dans une app de livraison. Chaque Location a un simulated flag. Pour des vérifications plus strictes, ajoutez @capgo/capacitor-mock-location-detector.
Choisir
Pick Transistorsoft if you need motion based auto start, reboot persistence, an offline queue and polygon geofences, and the license cost fits. Pick @capgo/background-geolocation si votre suivi est basé sur les sessions, que vous voulez des code lisibles sans licence par application, et que gérer la file d'attente dans votre app vous convient. Si vous remplacez plusieurs SDK natifs payants en même temps, la alternatives aux plugins Ionic Enterprise page liste les autres alternatives à Capgo.