Migrating from Transistorsoft
BGeo’s JS API is intentionally shaped like the popular
react-native-background-geolocation library (Transistorsoft’s commercial
SDK), so most integrations move over with small changes. This page inventories
what maps directly, what differs, and what BGeo deliberately does not
implement. It’s factual, not a comparison or a claim of equivalence — BGeo is
a compatible engine, not a clone.
Install swap
Only the dependency changes. Method names, the default export shape, and the location object stay the same.
-
Remove the Transistorsoft package and install BGeo:
Terminal window npm uninstall react-native-background-geolocationnpm install @dc-bgeo/react-native-background-geolocation -
Update every import to the new package name:
// Beforeimport BackgroundGeolocation from 'react-native-background-geolocation';// Afterimport BackgroundGeolocation from '@dc-bgeo/react-native-background-geolocation'; -
Follow Installation for the Android Maven repo and iOS pod — these replace whatever native setup Transistorsoft’s SDK required. Check Compatibility first: BGeo requires the New Architecture, so an app still on the old bridge needs to migrate that before swapping the tracking SDK.
The license key moves, the mechanism doesn’t
Both SDKs read the license from the native manifest at launch — before any JS runs — so the shape of this step is familiar. Only the key names change, and BGeo verifies its key offline (no license call home):
<application> <!-- Before (Transistorsoft) --> <meta-data android:name="com.transistorsoft.locationmanager.license" android:value="YOUR_TRANSISTOR_LICENSE" />
<!-- After (BGeo) --> <meta-data android:name="com.bgeo.license" android:value="BGEO1....YOUR_KEY" /></application><!-- Before (Transistorsoft) --><key>TSLocationManagerLicense</key><string>YOUR_TRANSISTOR_LICENSE</string>
<!-- After (BGeo) --><key>BGeoLicense</key><string>BGEO1....YOUR_KEY</string>If you configure Transistorsoft through Expo’s config plugin (a license
property in app.json), that value is generated into these same native files
at prebuild — swap it for BGeo’s manifest entries directly. See
License keys for the full snippets,
evaluation-build rules, and error codes.
Config and method compatibility
Most Transistor config keys and methods behave identically — see the Config reference and Methods reference for exact types and defaults. What maps directly (unchanged names and shapes):
- Lifecycle:
ready,setConfig,start,stop,getState,changePace - Positioning:
getCurrentPosition,watchPosition,stopWatchPosition - Events:
onLocation,onMotionChange,onHeartbeat,onProviderChange,onHttp,onConnectivityChange,onGeofence,onGeofencesChange - Permissions:
requestPermission,getProviderState,requestTemporaryFullAccuracy,isPowerSaveMode/onPowerSaveChange - Odometer:
getOdometer,setOdometer,resetOdometer - Upload queue:
sync,getLocations,destroyLocations,getCount,destroyLocation,insertLocation - Geofences:
addGeofence,addGeofences,removeGeofence,removeGeofences,getGeofences,geofenceExists— see the Geofencing guide - Logging: native
logger.error/warn/info/debug/verbose,getLog,destroyLog,uploadLog— see the Logging & debugging guide - HTTP config:
url,method,headers,params,extras,httpRootProperty,autoSync,autoSyncThreshold,disableAutoSyncOnCellular,batchSync,maxBatchSize,maxRecordsToPersist - Motion/filter config:
distanceFilter,stopTimeout,stationaryRadius,heartbeatInterval,desiredAccuracy,locationFilterPolicy,kalmanProfile authorization(JWT refresh) — see the HTTP guide’s authorization section- The
notificationsub-keys (title,text,channelId,channelName,smallIcon,color,priority)
The location object shape is unchanged (coords, timestamp, is_moving,
activity, battery, odometer, uuid, extras) — see
Data types.
If you’re migrating from an older integration and remember gaps like missing
onHttp/onConnectivityChange, isPowerSaveMode, odometer methods, filter
policies, or a native logger — those are all implemented now; the list above
is current, not aspirational.
A handful of keys are accepted for API compatibility but currently do
nothing. Don’t rely on foregroundService, backgroundPermissionRationale,
or enableHeadless (Android headless dispatch works via
registerHeadlessTask()
without it), and note that debug only plays sound cues — see
Limitations — accepted-but-no-op config keys
before you build around any of them.
API parity: what’s not here
BGeo deliberately does not implement the following part of Transistorsoft’s surface. This is a scoping decision for this SDK’s use case, not a temporary gap:
| Transistor API / config | Alternative in BGeo |
|---|---|
schedule / startSchedule / scheduleUseAlarmManager | Run your own scheduler (a JS timer, or a native alarm) that calls start()/stop(). |
locationTemplate / geofenceTemplate | Shape the upload body with httpRootProperty/params/extras instead of a template string — see Shaping the body. |
transistorAuthorizationToken | N/A (Transistorsoft-account specific) — use authorization for your own backend. |
Custom notification layout / actions / strings | The supported notification sub-keys (title/text/channelId/channelName/smallIcon/color/priority) cover a fixed layout, not custom actions or arbitrary strings. |
emailLog | uploadLog() to your own logUrl endpoint instead of emailing a log file. |
useSignificantChangesOnly | No equivalent mode — the engine manages its own wake sources; see Tracking lifecycle — wake sources. |
stopOnStationary / stopAfterElapsedMinutes | Call stop() yourself from onMotionChange/onHeartbeat. |
persistMode | N/A — all tracked locations persist by default; a one-shot getCurrentPosition() fix opts in via its persist option instead. |
timestampFormat | N/A — timestamps are always ISO-8601 UTC strings, see Location.timestamp. |
locationsOrderDirection | N/A — the persisted queue is always oldest-first, see Data pipeline — persistence. |
Burst averaging (rollingWindow/burstWindow/maxBurstDistance), the onLocationFilter callback, kalmanDebug/filterDebug | Unbuilt — these are unknown keys, silently stored but ignored by the native config dict. The implemented filter surface is locationFilterPolicy, kalmanProfile, and odometerAccuracyThreshold — use those instead of per-fix burst averaging or a filter-decision callback. |
reset() | Call setConfig() with the values you want restored — see the Config reference for the documented default of each key. |
startGeofences() (geofence-only tracking mode) | start() already runs geofences alongside location tracking — there’s no separate mode. |
getLocations() pagination / SQLQuery | getLocations() returns the full queue, oldest-first; filter or paginate the array in JS. Note a large offline queue means a large payload crossing the React Native bridge in one call — a generic RN-bridge cost, not specific to this method. |
startBackgroundTask() / stopBackgroundTask() | N/A. |
getDeviceInfo() / getSensors() | N/A. |
Behavioral differences worth knowing
- Callback/promise contract is unchanged.
ready()/setConfig()/start()/stop()keep Transistor’s own quirky lifecycle behavior: supplying afailurecallback makes the returned promise resolve with the error instead of rejecting. See Callback vs. promise contract. sync()semantics are unchanged. It resolves with a snapshot of the queue taken before the drain starts, not what remains afterward. Seesync().- Headless dispatch is Android-only, same event shape. No
paramswrapper, matching Transistor’s headless task. iOS has no headless equivalent — see Boot & killed-app behavior: iOS: no headless. - iOS relaunch model differs internally, same external guarantee. BGeo
keeps tracking alive across kill/reboot with a session-based engine
(
CLLocationUpdate.liveUpdates/CLBackgroundActivitySession, on by default on iOS 17+) plus significant-location-change monitoring and a rolling wake region, rather than Transistorsoft’s own implementation — see Boot & killed-app behavior for the full model.
Steps
- Install
@dc-bgeo/react-native-background-geolocation; remove the Transistorsoft package. Set up the Android libs repo + iOS pod. - Point every import at
@dc-bgeo/react-native-background-geolocation. - Replace the Transistorsoft license entries in
AndroidManifest.xmlandInfo.plistwith BGeo’s — see License keys. - Move JWT/token-refresh settings into the
authorizationobject. - Remove any usage of the keys/methods listed under API parity, and check Limitations for accepted-but-no-op keys.
- Test on a real device — background, kill/relaunch, reboot — see Boot & killed-app behavior.