Saltar al contenido principal

Alternativa a Transistorsoft Background Geolocation

Una alternativa gratuita y open source a Transistorsoft background geolocation para Capacitor 8: funciones, licencias, configuración, geofencing y guía de migración.

Alternativa a Transistorsoft Background Geolocation

Si buscas una alternativa a Transistorsoft background geolocation para Capacitor, la opción gratuita más cercana es @capgo/background-geolocation. Tiene licencia MIT, es compatible con Capacitor 8, rastrea la ubicación en segundo plano en iOS y Android, soporta geofencing nativo y puede hacer POST de ubicaciones a tu servidor desde code nativos. No replica todas las funciones de Transistorsoft, por lo que esta guía explica qué ganas, qué pierdes y cómo migrar.

Por qué los equipos buscan una alternativa a Transistorsoft

El SDK de Transistorsoft es un producto maduro que ha impulsado apps de flotas, delivery y fitness durante años. La gente rara vez lo deja porque falle. Lo dejan por estas razones:

Los builds de release ahora requieren una clave en ambas plataformas

Según el changelog de Transistorsoft, la versión 9.0.0 cambió a una licencia basada en JWT y empezó a requerir una clave también en iOS. Antes de la v9, solo los builds de release en Android estaban bloqueados. Las claves de la v8 o anteriores no funcionan con la v9, así que actualizar el plugin también implica generar nuevas claves desde su dashboard.

Su tienda vende licencias perpetuas por identificador de app, desde una hasta 100 claves, con un año de actualizaciones incluido. Add-ons como polygon geofencing ahora vienen integrados en la misma clave. Para una app, el precio es razonable. Para una agencia con 20 apps white label, o una empresa con distintos bundle IDs para staging y producción, la licencia se vuelve un gasto que hay que gestionar cada año.

El motor principal es un binario

El wrapper de Capacitor es abierto, pero el motor de ubicación se distribuye como un framework de iOS prebuilt y una librería de Android desde Maven. Si ocurre algo extraño en un OEM de Android específico, no puedes leer ni parchear el code que decide cuándo registrar un fix. Algunos equipos lo aceptan. Los equipos con requisitos de auditoría estrictos, o que simplemente quieren debuguear el code en Xcode, no.

Opciones de configuración

El plugin expone un objeto de configuración enorme: detección de movimiento, programación, odómetro, persistencia SQLite, plantillas de sincronización HTTP, tareas headless y más. Si necesitas todo eso, genial. Pero si solo quieres "enviar mi posición cada 30 segundos mientras el conductor esté de turno", es demasiada configuración que entender.

Qué hace @capgo/background-geolocation

El plugin Capgo nace de la larga historia de los forks de geolocalización en segundo plano de Cordova y del ligero plugin de la comunidad Capacitor. El objetivo es ofrecer correcciones precisas, funcionamiento fiable en background y geofencing nativo, sin licencias.

Funcionalidades actuales en la versión 8.x:

  • Actualizaciones de ubicación en foreground y background mediante una única start() llamada con un callback.
  • distanceFilter y minIntervalMs to control how often points arrive.
  • HTTP POST nativo de cada ubicación a un url que tú configures, con headers y updateHeaders() para la rotación de tokens.
  • Geofences circulares nativas con eventos de entrada y salida, y un webhook nativo para transiciones.
  • checkPermissions() y requestPermissions() que distinguen entre iOS 'When In Use' y 'Always'.
  • openSettings() para usuarios que denegaron el permiso.
  • setPlannedRoute() para reproducir un sonido cuando el usuario se sale de la ruta prevista.
  • Android opcional networkFallback que rellena los huecos de GPS con ubicaciones de red.
  • Una implementación web para desarrollo y pruebas en el navegador.

Comparativa de funciones

Capacidad Transistorsoft (v9) @capgo/background-geolocation
Licencia Clave de pago para builds de release, por app ID MIT, gratuita
Código fuente Wrapper abierto, binario del engine Totalmente open source
Capacitor 8 Sí Sí
Rastreo en segundo plano Sí Sí
Máquina de estados de detección de movimiento Sí No
Upload nativo vía HTTP Sí, con cola SQLite y batching Sí, POST best effort, sin cola en disco
Geofencing Sí, polígonos como add-on Geofences circulares en iOS y Android
Eventos de geofence enviados a tu servidor Sí, mediante sync HTTP Sí, webhook nativo
Seguimiento tras cerrar la app (Android) Sí Sí, con url configurar
Seguimiento tras reiniciar Sí (startOnBoot) No
Programación, odómetro Sí No

Resumen honesto: Transistorsoft es mejor si la app debe decidir cuándo trackear, sobrevivir reinicios y guardar semanas de puntos offline. El plugin Capgo es mejor si el usuario o tu app inician el tracking explícitamente y buscas fixes precisos sin licencias y code legibles.

Instalación y configuración

bun add @capgo/background-geolocation
bunx cap sync

iOS

Añade los usage strings y el location background mode 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>

Recuerda que las subidas a la App Store requieren Xcode 26 desde abril de 2026. Si tu imagen de CI es más antigua, la subida será rechazada aunque el build sea exitoso. Build con Capgo se ejecuta en imágenes de Xcode actuales si no quieres mantener Macs.

Android

El plugin usa un foreground service con una notificación persistente mientras rastrea en segundo plano. En Android 13 y versiones superiores, solicita POST_NOTIFICATIONS después de conceder la ubicación para poder mostrar la notificación.

Configura useLegacyBridge en capacitor.config.ts. Sin esto, los callbacks de ubicación al WebView pueden detenerse tras unos cinco minutos en segundo plano:

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

const config: CapacitorConfig = {
  appId: 'com.example.tracker',
  appName: 'Tracker',
  webDir: 'dist',
  android: {
    useLegacyBridge: true,
  },
};

export default config;

Puedes personalizar el nombre, icono y color del notification channel mediante strings.xml claves documentadas en la docs del plugin.

Comenzar el tracking

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

Dos opciones importan más de lo que parece:

  • backgroundMessage es lo que activa las actualizaciones en segundo plano en ambas plataformas. Sin ella, las actualizaciones solo están garantizadas en primer plano. En Android, también es el texto de la notificación del servicio en primer plano.
  • url envía cada punto desde el code nativo con un "source": "native" campo en el cuerpo. Esa ruta no depende del WebView, que es lo que mantiene los datos fluyendo cuando Android limita el WebView o iOS suspende JavaScript. En Android, configurar url también hace que el servicio sea persistente, para que los puntos sigan llegando a tu servidor tras cerrar la app deslizándola. Necesitas ambas opciones para un rastreo en segundo plano fiable.

Cuando el access token expire, rótalo sin reiniciar la sesión:

await BackgroundGeolocation.updateHeaders({
  headers: { Authorization: `Bearer ${newToken}` },
});

Geofencing

Los usuarios de Transistorsoft suelen depender de su geofencing. El plugin Capgo cubre regiones circulares con APIs nativas en ambas plataformas:

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

iOS requiere autorización "Always" para geofencing. En Android 10 y versiones posteriores, el geofencing en segundo plano requiere ACCESS_BACKGROUND_LOCATION, algo que el plugin no añade por ti. Solo añádelo si tu app tiene la aprobación de Google Play para ubicación en segundo plano. Si tus geofences se comportan de forma extraña en iOS, lee nuestra guía sobre por qué las geofences no se disparan en iOS.

Migrar desde Transistorsoft

Las APIs son distintas, así que planea una pequeña reescritura de tu servicio de ubicación en lugar de un simple buscar y reemplazar.

Concepto de Transistorsoft Equivalente a Capgo
ready(config) + start() start(options, callback)
onLocation listener El start() callback
stop() stop()
distanceFilter distanceFilter
url, headers HTTP sync url, headers, updateHeaders()
addGeofence / onGeofence addGeofence / geofenceTransition
removeGeofence(s) removeGeofence / removeAllGeofences
getGeofences getMonitoredGeofences
Helpers de permisos checkPermissions / requestPermissions
Detección de movimiento, programación, odómetro Implméntalo en la lógica de tu app o en el servidor

Pasos que funcionan bien en la práctica:

  1. Envuelve el acceso a la ubicación tras un pequeño servicio en tu app ("startTracking, stopTracking, onPoint). La mayoría de las apps ya tienen uno.
  2. Implementa el servicio con el plugin Capgo detrás de un feature flag o en un build aparte.
  3. Haz que tu backend acepte el JSON de ubicación del plugin. El body coincide con el Location tipo (latitude, longitude, accuracy, speed, bearing, time y así sucesivamente) más source.
  4. Elimina el plugin de Transistorsoft, sus licencias, las variables de Gradle adicionales y los modos de background que ya no necesites.
  5. Prueba en dispositivos reales con la pantalla bloqueada durante al menos 30 minutos, en un Pixel, un Samsung y un iPhone como mínimo.

Los cambios de plugins nativos requieren un nuevo build para la tienda. Una vez que ese build esté publicado, puedes seguir enviando fixes de JavaScript a tu UI de tracking con Live Updates de Capgo sin pasar por otro ciclo de revisión.

Cuando el plugin Capgo no es suficiente

Ten esto claro antes de cambiar:

  • Sin cola persistente. Los POST nativos son 'best effort'. Si el dispositivo está offline, los puntos fallidos se registran y se descartan. Si no puedes perder ningún punto, guárdalos localmente en el callback (por ejemplo con SQLite) y sincronízalos desde la app, o quédate con Transistorsoft.
  • Sin reinicio tras un reboot. El rastreo se reanuda la próxima vez que el usuario abra la app.
  • Sin detección de movimiento automática. La app decide cuándo empezar y parar.
  • Terminación en iOS. Si el usuario cierra la app a la fuerza en iOS, las actualizaciones de ubicación estándar se detienen. Es una regla del OS, no una limitación del plugin.

Para más contexto sobre qué puede ejecutar Capacitor mientras la app está en background, consulta cómo funcionan las tareas en segundo plano en Capacitor.

Solución de problemas

Las actualizaciones se detienen tras unos minutos en Android. Comprueba useLegacyBridge: true, confirma que la notificación del servicio en primer plano es visible y desactiva la optimización de batería al probar en fabricantes agresivos. Usa la url opción para que la entrega no dependa del WebView.

Sin actualizaciones en segundo plano en iOS. Confirma UIBackgroundModes contiene location, que pasaste backgroundMessage, y que llamaste a start() mientras la app estaba en primer plano. Nuestra guía sobre why iOS stops background location updates analiza cada una de las causas.

NOT_AUTHORIZED error. El usuario denegó la ubicación. Llama a openSettings() después de explicar por qué la app lo necesita.

Puntos erráticos en interiores. Aumenta distanceFilter, ignora puntos con grandes accuracy valores, y en Android considera networkFallback: true solo si las correcciones coarse son aceptables.

Ubicaciones falsas en una app de delivery. Cada Location tiene un simulated flag. Para validaciones más estrictas, añade @capgo/capacitor-mock-location-detector.

Elegir

Elige Transistorsoft si necesitas autoarranque por movimiento, persistencia tras reinicio, cola offline y geocercas de polígonos, y si el coste de la licencia te encaja. Elige @capgo/background-geolocation si tu tracking es basado en sesiones, buscas code legible y sin licencias por app, y no te importa gestionar la cola en tu app. Si vas a sustituir varios SDKs nativos de pago a la vez, la alternativas a plugins de Ionic enterprise página enumera otros reemplazos de Capgo.

Live Updates para apps de Capacitor

Si hay un bug en la capa web, publica el fix con Capgo en lugar de esperar días a la aprobación de la app store. Los usuarios reciben la actualización en segundo plano mientras los cambios nativos siguen el proceso de revisión normal.

Lo último de nuestro blog

Capgo te da los mejores insights para crear una app móvil realmente profesional.