Limitations
We would rather you know the gaps up front than discover them after buying.
iOS only
There is no macOS, watchOS or Catalyst support, and none is planned — the engine is a mobile tracking engine. For Android, use the Android SDK or a cross-platform SDK.
The toolchain floor moves with each release
An engine release built by a newer Xcode raises the minimum Xcode for the whole package. This is inherent to shipping a binary framework, not a policy choice. See Compatibility.
The blue indicator is not optional on the default path
While tracking with Always authorization, the session engine keeps a
CLBackgroundActivitySession alive — and that session is what keeps
background delivery working. iOS shows the blue pill for its whole lifetime and
provides no API to hide it.
showsBackgroundLocationIndicator
only affects the legacy CLLocationManager path
(useSessionEngine: false),
which is materially less reliable in the background. When In Use shows the pill
regardless.
Android-only config keys
Accepted for API compatibility and ignored here: foregroundService,
notification.*, backgroundPermissionRationale,
stationaryLocationUpdateInterval, activityRecognitionInterval,
locationUpdateInterval, disableAutoSyncOnCellular’s cellular detection
nuances, and maxMonitoredGeofences above the platform budget. You can leave
them set — a config shared with an Android build stays valid.
Behaviour worth knowing before you ship
Geofence transitions fire past the boundary. Core Location reports ENTER
and EXIT only after the device has cleared the radius plus a system cushion: an
EXIT typically arrives tens of seconds after the geometric crossing — at
driving speed that is hundreds of metres — and in the worst case minutes later.
The location on the event is the last accepted fix when iOS delivered the
transition, not the point where the circle was crossed. A 50 m geofence in a
car is mostly a coin flip.
Twenty regions, and one is ours. iOS caps monitored regions at 20 per app;
the engine spends one on its own wake region, so 19 of your geofences are armed
at a time. It keeps the nearest ones registered and swaps as you move — see
geofenceschange.
The first minutes of a session report isMoving: nil. Motion is probed
after start(), for up to stopTimeout. Treat nil as “not yet known”, never
as false.
The Simulator proves nothing about background behaviour. Location simulation, Core Motion and process relaunch all behave differently there.
App Review scrutinises background location. Expect to justify it: the purpose strings must describe a benefit the user gets while the app is closed, and a build that asks for Always without a visible feature that needs it is a common rejection.
Deliberately out of scope
A large part of the Transistorsoft API is not here and is not planned:
schedule/startSchedule, location and geofence templates, getLocations()
pagination and SQL queries, startBackgroundTask/stopBackgroundTask,
getDeviceInfo/getSensors, emailLog, reset(), startGeofences()
geofence-only mode, and persistMode/timestampFormat/
locationsOrderDirection. The Methods reference
is the complete list of what exists.