Skip to content

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.