NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev · #1468 most downloaded on pub.dev
The most sophisticated background location tracking & geofencing module with battery-conscious motion-detection intelligence for iOS and Android.
Last release today
06 Oct 2026
Ships fairly regularly
a new release about every 3 weeks
Nearly every release is documented
notes for 60 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
8 years old
191 releases · first in 2018
[Fixed][Android] The build no longer fails on Android Gradle Plugin 9 with Could not get unknown property 'applicationVariants'. android/background_ge
Could not get unknown property 'applicationVariants'. android/background_geolocation.gradle, which the app applies from
its android/app/build.gradle, used an API that Android Gradle Plugin 9 removed. The script is now
empty: it was meant to strip the SDK's debug sound files from release builds, which it no longer did.addGeofences() no longer blocks the main thread while it builds the geofences. The plugin
built every geofence, computing each polygon's enclosing circle, in its method-call handler, which
runs on the main thread on both Android and iOS, so adding thousands of polygons in one call held the
app's UI until they were built. They are now built on a background thread, and the call replies on
the main thread as before. The arguments themselves are still decoded on the main thread, so very
large adds still benefit from batching. (WO-107)TSLocationManager is now 4.7.2 (pinned ~> 4.7.2, CocoaPods and Swift Package
Manager). Among its fixes: stop() now releases the location monitoring that an earlier run of the
app left registered with iOS, which kept waking a stopped app; preventSuspend no longer stops a few
minutes into the background; and persistence.maxRecordsToPersist, maxDaysToPersist or
persistMode set to a string that is not a whole number takes the setting's default, where iOS read
it as 0.tslocationmanager is now 4.6.2. The plugin pins that version in place of 4.6.+,
and raises an older ext.tslocationmanagerVersion to it with a build warning. Among its fixes: a
location the SDK has already processed is no longer handed to it again after Android kills the app's
process; the SDK's foreground services no longer do work on the main thread for every location, which
Android could report as the app not responding (#1718); stop() no longer blocks the main thread for
longer the more geofences are stored; and a stationary-geofence EXIT is accepted whenever its
location is provably outside the region, however poor that location's accuracy.One column per quarter.
Merge branch 'chore/release-5.8.0'
Merge branch 'chore/release-5.8.0'
[Fixed] TransistorAuthorizationToken.findOrCreate() no longer waits forever when the demo server
refuses the registration with HTTP 403. The returned Future now completes with an Error whose
code is 403, as Capacitor and Cordova reject. It never completed on iOS, where every 403 took
that path, nor on Android when the server's response carried an error message; the error was
reported as uncaught instead. Any other failure still returns a token whose accessToken is
DUMMY_TOKEN, and so, now, does a call made where the plugin is not registered, which also waited
forever. (WO-064)
[Fixed][Android] reset() without a config now switches the SDK's logging to the defaults. It
took a different path from reset(config), one that skipped the change events the logger listens
to: State.logger.logLevel reported the default, Off, while the SDK kept logging at the level set
before, until the level next changed or the app restarted. The HTTP service kept its previous
autoSyncThreshold the same way. reset() now takes the same path as reset(config), as on
React Native, Capacitor and Cordova. (WO-061)
[Fixed] A rejected call's PlatformException.message now carries the same string as its code,
on Android and iOS. Until now it was null for most failures, so e.message read null where every
other Background Geolocation SDK carries the reason. For most calls that string is a
human-readable reason; for some it is the SDK's own code ("404") or a server's response body.
code is unchanged, so existing checks on it keep working. Location errors (LocationError)
and requestPermission()'s status are unchanged. The printed form changes from
PlatformException(<text>, null, null, null) to PlatformException(<text>, <text>, null, null),
so a crash reporter that groups errors by that text may open new issues for existing ones.
(WO-078)
[Docs] TransistorAuthorizationToken and Config.transistorAuthorizationToken name the demo
server's default url with https, https://tracker.transistorsoft.com, the default findOrCreate
has used since 4.10.2. The docs said http://, which Android 9+ and iOS refuse unless the app allows
cleartext traffic or arbitrary loads. The destroy() example now passes the url, which the method
requires. (WO-063)
[Docs] getCurrentPosition()'s timeout defaults to GeoConfig.locationTimeout, 60 seconds
unless you change it, not 30 as documented. The migration guide's mapping table now lists the
flat locationTimeout, which moves to geolocation. (WO-072)
[Docs] Location.age is in seconds, with millisecond precision (e.g. 1.234), not milliseconds
as documented. Every SDK has reported seconds since version 5; before that it was an integer
number of milliseconds. The migration guide now says so under Breaking Changes. (WO-065)
[Added] removeGeofences(identifiers) removes only the named geofences, as on every other
Background Geolocation SDK: BackgroundGeolocation.removeGeofences(['HOME', 'WORK']). The list is
optional; removeGeofences() still removes all of them. (WO-053)
[Fixed] Location.geofence is a new GeofenceTrigger (identifier, action, timestamp,
extras), the summary the SDK attaches to a location recorded by a geofence transition. It was
typed as a GeofenceEvent, which that summary is not. Building a Location from a
getLocations() geofence record threw
"type 'Null' is not a subtype of type 'Map<dynamic, dynamic>'", and onGeofence removed
geofence from event.location to avoid the same error.
Now event.location.geofence is populated. location.geofence?.identifier, .action,
.timestamp and .extras read as before. Code that named the type GeofenceEvent, or read
.location or .geofence through it, must change; those reads never returned a value. (WO-049)
[Changed] State.reset and State.transistorAuthorizationToken are deprecated. Both are Config
inputs that the SDK never reports back, so on a State they are null unless your own code set
them. They still work, so a State passed to setConfig() behaves as before. (WO-049)
[Fixed] Config(transistorAuthorizationToken: token) sent no upload URL when the same Config
also carried http: HttpConfig(...). The token's URL was set on your HttpConfig after it had been
serialized, so it only arrived on a second toMap(): the app received the token's authorization
but not its http.url. The token now sets http.url in the configuration sent to the SDK, merged
into your http group, and wins over any http.url or url you passed, as on React Native. Your
HttpConfig, url and authorization are no longer modified. (WO-048)
[Fixed][iOS] ready() on a later launch no longer switches a persisted scheduler off. The
configuration was reset to the defaults and yours re-applied in two steps, and every configuration
listener saw the defaults in between: the empty default schedule stopped the scheduler and saved it
as off, so a scheduler started with startSchedule() never resumed on the next launch. ready() and
reset(config) now apply your configuration as one change, so settings whose value has not changed
are no longer switched to the default and back. Requires TSLocationManager 4.7.1. (WO-039)
[Fixed][iOS] await BackgroundGeolocation.registerHeadlessTask(task) never completed on iOS, so an
app awaiting it in main() before runApp() hung at startup. iOS has no headless mode and the
native side never answered the call; it now answers, and the Future resolves true as on Android.
The native answer to registerPlugin, which BackgroundGeolocationFirebase.configure() sends, was
missing in the same way and is now sent too.
[Docs] Coords.floor documents when it is null: whenever the platform reports no floor, which is
almost always, and always on Android. The type int? is unchanged. (WO-067)
[Breaking] removeListeners() is Future<void>, as the documented contract has always said and
as every other Background Geolocation SDK resolves it. It was Future<bool>, resolving a constant
true that carried no information. Only code that assigned the value — bool ok = await BackgroundGeolocation.removeListeners(); — is affected, and Dart's analyzer names every such
site. Ignoring the result, which is how the plugin's own examples call it, needs no change.
(WO-037)
[Fixed] Sensors.magentometer was misspelled — it is now Sensors.magnetometer. The old name
remains as a deprecated getter so existing code keeps compiling; it will be removed in a future
major. The value was always correct: only the Dart field name was wrong. (WO-035)
[Breaking] changePace() now resolves the State the API's other state-changing methods
resolve, and which the documented contract has always described: Future<State> instead of
Future<bool>. The old value was the boolean you had just passed in, so it told you nothing you
did not already know.
// before
BackgroundGeolocation.changePace(true).then((bool isMoving) { ... });
// now
BackgroundGeolocation.changePace(true).then((bg.State state) { ... state.isMoving ... });
Only code that READS the resolved value is affected, and Dart's analyzer names every such site —
except an untyped closure (.then((v) => print(v))), which keeps compiling while v becomes a
State. Ignoring the result, which is how the plugin's own examples mostly call it, needs no
change. (WO-033)
[Fixed][Android] Intermittent black screen on launch — the app ran normally (Dart, routing, network) but never drew a frame — and, more rarely, a launch crash RuntimeException: Window couldn't find content container view. The plugin handed the Activity to the native SDK from a background thread while FlutterActivity.onCreate was still running, racing Android's own window setup in setContentView(). The hand-off now happens on the main thread. (#1715)
[Fixed][Android] Recreating the app's Activity for a configuration change was treated as app termination — for example toggling Bold text in Android's accessibility settings, which the default Flutter android:configChanges does not cover. The SDK entered headless mode while the app stayed on screen (location and other events went to the headless task instead of your listeners, until the app next came back to the foreground), and with stopOnTerminate: true tracking stopped. Apps whose FlutterEngine outlives its Activity (add-to-app, cached engines) also never passed the recreated Activity to the native SDK.
[Fixed][Android] Calling reset(config) while tracking could open the "Allow all the time" background-location dialog for a WhenInUse app, the motion-permission dialog for an app with disableMotionActivityUpdates: true, or switch useSignificantChangesOnly off and back on (with a spurious enabledchange) — even when the configuration had not changed. The configuration was reset to the defaults and yours re-applied in two steps, and the SDK acted on the defaults in between. reset(config) and ready() now apply your configuration as one change, so settings whose value has not changed are no longer switched to the default and back. This also keeps the recreation fix above from exposing ready() to the same problem when a default FlutterActivity is recreated and its new FlutterEngine runs ready() again. A configuration that cannot be serialized (such as a NaN number) is now rejected without first resetting the existing configuration.
[Fixed][Android] ready() on a later launch no longer switches a running scheduler off. Resetting the configuration briefly applied the empty default schedule, which stopped the scheduler and could start tracking outside the schedule window until your app called startSchedule() again. The scheduler now stays on.
TSLocationManager ~> 4.7.1 (CocoaPods and Swift Package Manager) — -[TSConfig resetWithDictionary:] (WO-039) and the scheduler fixes (WO-038, WO-041, WO-043, WO-044)tslocationmanager 4.6.+ (TSConfig.reset(JSONObject))[Added] requestPermission([Permission? permission]) accepts an optional Permission.location / Permission.motion — request location and motion separate
requestPermission([Permission? permission]) accepts an optional Permission.location / Permission.motion — request location and motion separately, each independently awaitable, instead of the all-at-once dialog storm. Requires the WO-007 native SDK releases (against older native SDKs the per-permission forms fail as an ordinary denial). (WO-007)ProviderChangeEvent.AUTHORIZATION_STATUS_DENIED_ALWAYS (5) — the motion permission was permanently denied; only the device's Settings app can restore it (Android: after two user denials; iOS: a single motion denial is already permanent). Reported by requestPermission(Permission.motion) only — it never appears in providerchange events. (WO-007/WO-014)requestPermission() now also requests the motion permission after the location flow resolves (matching Android, where it always did) — the motion prompt moves from start() to requestPermission() for apps that pre-request. Apps that call requestPermission() but never start() will see a Motion & Fitness prompt they previously did not; ensure NSMotionUsageDescription is present in Info.plist (it has always been required for start()). Set disableMotionActivityUpdates: true to opt out of motion entirely. (WO-007)requestPermission() now errors the Future with the bare authorization status int (previously a PlatformException with the status buried in details), matching the documented cross-platform contract. Typed on PlatformException handlers around requestPermission() will no longer match a denial — use an untyped catch (status) (as all documented examples always have) or on int. (WO-007)Permission enum shares its name with the popular permission_handler package. Apps importing both unprefixed will hit ambiguous_import — import this package with a prefix (the documented convention: import '.../flutter_background_geolocation.dart' as bg;) or use show/hide.enabled, trackingMode,
schedulerEnabled, the odometer and the full config (url, headers, params, schedule,
authorization, …) are all carried over. The import is a strict no-op when v5 state already
exists, and the original v4 archive is preserved for rollback. On iOS, a license-locked App Store
build backs the archive up but does not import it. (WO-001)activityType.
The SDK hardcoded AutomotiveNavigation when the tracking manager initialized and applied the
configured value only when it later changed, so every steady-state launch tracked as automotive
navigation. Apps that never configure activityType now get the documented default (Other, no
road-snapping), and the configured value is re-asserted each time tracking engages. (WO-009)useSignificantChangesOnly, or switching from location tracking to
geofences-only, delivered a phantom geofence ENTER for a geofence the device had never left, plus
a spurious enabledchange pair. Both were implemented as a full internal stop/start, and that
teardown stopped geofence monitoring — which resets each geofence's entry state, so the restart
re-fired geofenceInitialTriggerEntry. Each now re-engages only the location-update mechanism. A
real stop() still resets entry state, as before. (WO-012)stop()/start() or tracking-mode round trip, and
could book an entire untracked journey (stop at home, drive, start at work) as travelled distance.
Resetting the odometer clears its reference point, but the next motionchange then substituted a
stale reference from elsewhere in the SDK. A reset now means what it says: the first fix after it
establishes a new reference and accumulates nothing. (WO-012)motionchange now advances the SDK's last-known location. It was
written only by the location-update stream, so a parked device — updates off, no
significant-change deliveries — could hold a last-known position hours old and arbitrarily distant
for the life of the process, which fed the stationary-region placement used at app terminate.
(WO-012)motionchange event now reports the odometer including the leg it just recorded.
It was emitted before that leg was added, so breaking out of a stationary region — the largest
single step the odometer takes — delivered a motionchange carrying the previous total, leaving
your app's last-known odometer a full leg behind. (WO-012)useSignificantChangesOnly at runtime delivered a phantom geofence
ENTER for a geofence the device was parked inside, plus a spurious enabledchange pair. Both
directions of the transition routed through a full stop, whose teardown resets each geofence's
entry state — so the re-registration that followed re-fired the initial-trigger ENTER. Each
direction now sheds only what the mechanism change actually requires. A real stop() still resets
entry state, as before. (WO-012)backgroundPermissionRationale dialog revealed a second,
identical dialog behind it whenever more than one SDK flow requested background permission at once
(for example an app calling start() and requestPermission() together). Concurrent flows now
coalesce onto a single rationale dialog. (WO-008)backgroundPermissionRationale dismissed without a button press — the app
backgrounded, an incoming call — orphaned the flow waiting on it, so requestPermission() never
settled. The flow now always completes. Unlike pressing Cancel, an accidental dismissal does not
suppress the rationale for later attempts. (WO-008)TSLocationManager ~> 4.6.0 (CocoaPods)native-background-geolocation from: 4.6.0 (Swift Package Manager)tslocationmanager 4.5.+Merge branch 'release-5.5.0'
Merge branch 'release-5.5.0'
didPauseLocationUpdates for this kind of background session. The SDK now detects
stationarity itself and releases location updates while the device is parked, resuming
automatically once it moves. Geofence monitoring is unaffected: the polygon stays monitored
and its containing-region EXIT still fires.polygon-geofencing entitlement could be dropped when a license validated
through the semver grace path, silently downgrading polygons to their enclosing circle on
App Store builds that hold the add-on.watchPosition() stopped delivering after 60 seconds instead of streaming until
stopWatchPosition(). The underlying request carried a default timeout that terminated the
stream; a watch now runs until you stop it.watchPosition() when a stream was torn down while it was emitting a
location (eg calling stopWatchPosition() from inside the watch callback).getCurrentPosition() rejected with a 408 timeout even when the SDK held a
perfectly usable recent fix, and worse, cleared that cached fix on the way out — so the next
call started from nothing. On timeout the request now resolves with the freshest cached fix
that satisfies the caller's maximumAge, and the cache is left intact. A fix that fails your
stated accuracy or staleness thresholds is still never returned as if it had passed.motionchange location-request failed (typically a location-services outage or a
denied authorization). In that state the device would never detect movement again until the
app was restarted. The failed request is now cleared so the retry can proceed, and several
passive recovery paths that were gated behind it can heal the state.startOnBoot: true, leaving the SDK silently inert until the app was next opened.NullPointerException on Android 7 devices when reading location extras
(an AOSP Bundle race, fixed by the OS in API 26). Extras are now materialized at ingestion.ForegroundServiceDidNotStartInTime crashes, seen most often on Motorola
devices: a service stop racing an in-flight launch, and a stale foreground-service latch that
caused restricted apps to be killed on their next launch. The service now promotes on every
launch and its stop path is launch-aware.entry_state, hits and state_updated_at were dropped when
geofences were loaded by proximity; and the coalescing queue could stall, leaving buffered
re-evaluations unprocessed.desiredAccuracy could oscillate between the CoreLocation and Android value
domains: useCLLocationAccuracy was not preserved across reset(), so a CoreLocation-style
value (-1, -2, …) could reach LocationRequest.setPriority() untranslated and crash on
play-services-location v21+.TSLocationManager ~> 4.5.0tslocationmanager 4.5.+Merge branch 'insertLocation'
Merge branch 'insertLocation'
insertLocation() now works — the supplied record is inserted as-given (import-as-is) and the returned Future resolves with the inserted record's uuid. It was previously unimplemented on iOS (the call never resolved) and on Android stored a record with an empty uuid (so destroyLocation() couldn't remove it) and an unvalidated timestamp. Timestamps are now normalized (ISO-8601 or epoch), and a uuid is generated when you don't provide one.[Fixed][Android] Headless events permanently dropped after the app is relaunched and terminated a second time (FlutterJNI was detached from native C++
FlutterJNI was detached from native C++ — regression introduced in 5.1.2). HeadlessTask.destroyBackgroundIsolate() destroyed the background FlutterEngine but left the headless registration state pointing at the dead engine, blocking a replacement isolate from ever booting. The registration state is now reset along with the engine, so the next headless event boots a fresh background isolate; events arriving during the teardown window remain queued and flush once it's ready.Geofencing and activity recognition (motion detection) no longer require a foreground service. These modes now run without a persistent notification — ahead of Google Play's August 2026 policy that removes geofencing as an approved foreground-service location use-case.
FOREGROUND_SERVICE / FOREGROUND_SERVICE_LOCATION from your manifest. When absent, continuous location degrades gracefully to the OS significant-changes path (best-effort) instead of failing to start.Continuous high-frequency tracking (trackingMode: LOCATION) still uses a foreground service where permitted.
getLocations([LocationQuery query]) method — page through the location database, eg getLocations(LocationQuery(limit: 500, page: 0, order: LocationQuery.ORDER_DESC)). The .locations getter is retained as an alias for the unbounded read. Fixes out-of-memory crashes when reading a database holding thousands of records.TSLocationManager ~> 4.3.0tslocationmanager 4.3.+Merge branch 'onLocationFilter'
Merge branch 'onLocationFilter'
onLocationFilter — fires when the tracking location-filter rejects a location (eg: horizontal accuracy worse than LocationFilter.trackingAccuracyThreshold, or a GPS spike under the Conservative policy: implausible implied-speed / statistical outlier). Rejected locations are not delivered to onLocation, so this is the only way to observe and adapt to them. The event provides the rejected location, a normalized reason ("low-accuracy" | "implied-speed" | "outlier-capped"), accuracy, and trackingAccuracyThreshold.TSLocationManager ~> 4.2.0tslocationmanager 4.2.+[iOS] Pin TSLocationManager 4.1.10 — delivers the native fixes below.
TSLocationManager 4.1.10 — delivers the native fixes below.tslocationmanager 4.1.9 — delivers the native fixes below.LocationFilter.odometerPolicy — selects the filtering policy applied to odometer-relevant samples, independent of LocationFilter.policy. Defaults to adjust (existing behavior: anomalous samples are capped but still accumulated); use conservative to reject GPS teleports outright, eliminating phantom odometer distance on devices that emit corrupted location bursts.motionchange location after exiting the stationary geofence: the Kalman filter restarted from a zero estimate, crediting only ~20% (Android) / ~1% (iOS) of the genuine exit distance (200–1000m). The filter now seeds from its first post-reset measurement, crediting the full gap distance.LocationFilterPolicy.conservative rejected the first motionchange fix after a stationary-geofence exit as an outlier — the outlier bound was time-independent. Android parity: the bound now scales with elapsed time via the kinematic cap, so genuine post-gap fixes are accepted while teleports (dt ≈ 0) are still rejected.FlutterFramework dependency in the plugin's Package.swift, required by Flutter's Swift Package Manager integration (Flutter ≥ 3.38). Silences the missing-dependency warning at build time; CocoaPods consumers are unaffected.geolocation.filter options now apply at runtime via setConfig without restarting tracking (parity with iOS).UIApplicationSceneManifest + FlutterImplicitEngineDelegate plugin registration), ahead of Apple's upcoming requirement.>=3.38.0 (aligned with background_fetch; required by the Swift Package Manager FlutterFramework integration).[Fixed][Android] watchPosition crashes — Integer→Long / Integer→Double ClassCastException from Flutter MethodChannel type mapping, and incorrect Map r
watchPosition crashes — Integer→Long / Integer→Double ClassCastException from Flutter MethodChannel type mapping, and incorrect Map response shape where Dart expected an int watchId.watchPosition @UiThread RuntimeException — EventSink.success() called from background thread pool; now posted to main thread via Handler(Looper.getMainLooper()).Subscription class — watchPosition and all on* event-listener methods now return a Subscription instance with a .remove() method for convenient listener teardown.[Fixed][Android] App stuck on splash / logo after relaunch when the foreground service kept the process alive past Activity termination. Root cause: H
HeadlessTask's static background FlutterEngine was never destroyed, so on main Activity reattach the stale engine conflicted with the freshly attaching main engine's plugin channels. HeadlessTask.destroyBackgroundIsolate() now runs when BackgroundGeolocationModule.setActivity(activity) receives a non-null Activity, clearing the background engine before the main engine attaches.main.dart — added boot-trace print() milestones to make stuck-splash reproductions immediately identify the Dart boot stage that hangs.background_fetch to ^1.6.2 for the sibling fix that surfaced once the background engine started being properly destroyed (MissingPluginException on com.transistorsoft/flutter_background_fetch/methods).Merge branch 'timestampFormat'
Merge branch 'timestampFormat'
PersistenceConfig.timestampFormat — set to "epoch" to receive timestamp and recorded_at as epoch milliseconds (number) instead of the default ISO-8601 UTC strings.getCurrentPosition timeout (408) with approximate (COARSE-only) location permission. With only approximate location granted, the SDK now resolves immediately with the first available location instead of waiting for samples that won't arrive.[Example] pin tslocationmanager 4.1.+
[Example] pin tslocationmanager 4.1.+
The native TSLocationManager SDK no longer depends on any third-party logging frameworks on either platform:
CocoaLumberjack — replaced with a custom, zero-dependency SQLite-backed logger using os_log for console output.slf4j / logback-android — replaced with a custom SQLite-backed logger using the native Android Log API.This eliminates a long-standing source of dependency conflicts for apps that use these popular logging libraries at different versions. The SDK's logging behavior, output format, and emailLog / uploadLog functionality remain identical.
TSLocationManager ~> 4.1.0tslocationmanager 4.1.+Merge branch 'release-5.0.7'
Merge branch 'release-5.0.7'
Merge branch 'release-5.0.6'
Merge branch 'release-5.0.6'
Package.swift for SPM users. The package name is renamed BackgroundGeolocationMerge branch 'location-filter-sparse-update'
Merge branch 'location-filter-sparse-update'
Merge branch 'release-5.0.4'
Merge branch 'release-5.0.3'
Merge branch 'release-5.0.3'
[iOS] Fix bug in iOS License Validation Failure modal dialog interfering with React Native app launching. Change to less intrusive alert mechanism.
.start()..PersistenceConfig.geofenceTemplatesetOdometer not resolving its Promise[iOS] Fix syntax error in Package.swift
Package.swift* [Release] 5.0.0. * See 5.0.0 Migration Guide * See 5.0.0 Discussion
Fix type-cast bug in GeofenceEvent while in headless-mode.
[Android] Add proguard rules to preserve flutter plugin classnames (eg: HeadlessTask) in release with minifyEnabled.
[Android] Add guards against spurious geofence exit events reported with certain devices.
Initial introduction of v5 beta. See the Migration Guide
[Android] Backport spurious stationary geofence exit detection from v5. Google Play Services seems to have a bug where geofence exit events fire even
[Android] Rebuild with Android ELF Alignment
[Android] pin tslocationmanager at 3.+ in preparation for next release..
tslocationmanager at 3.+ in preparation for next release..[Android] Remove Huawei HMS support for failure to provide their SDKs with *Android 16KB Page Size* compatibility.
Fix example/pubspec.yaml enable-swift-package-manager: true
enable-swift-package-manager: true[iOS] Implement Swift Package Manager support
[Android] Rebuild tslocationmanager with AGP >= 8.5.1
tslocationmanager with AGP >= 8.5.1flutter_map to latest 8.1.1locationAuthorizationRequest: "Any" to not continue showing backgroundPermissionRationale after user clicks [CANCEL] button.[Android] Fix issue with polygon geofencing where identifier consists of long strings, such as aaaa-bbbb-cccccccc-dddd-eeeee eeeeeee.
identifier consists of long strings, such as aaaa-bbbb-cccccccc-dddd-eeeee eeeeeee.[Android] Support *16KB pages sizes*.
ProviderChangeEvent.enabled not showing the result of global Privacy -> Location Services -> Enabled switchjava.util.ConcurrentModificationException at com.transistorsoft.locationmanager.location.SingleLocationRequest.getBestLocation.[Android] Re-compile library with jdk 17
[Android] Re-compile library with jdk 17 instead of 22
[Android] Fix ConcurrentModificationException in StopTimeoutEvaluator.
ConcurrentModificationException in StopTimeoutEvaluator.[Android] Address phenonenon of "UI Freezing".
[Android] Remove Android Setup Step for proguard-rules.pro in your android/app/build.gradle. The SDK is now able to automatically apply its required p
proguard-rules.pro in your android/app/build.gradle. The SDK is now able to automatically apply its required proguard-rules.pro.[Android] Remove enforcement of minimum Geofence radius 150
150TSLocationManagerActivity (responsible for showing location permission / authorization dialogs). Minimizing the app with an active permission dialog would cause the app's MainActivity to terminate on some devices.[Android] Fix reported "screen flickering" issue on some devices when SDK requests permissions.
TSLocation.toMap.TSConfig due to "uncaught exception NSInvalidArgumentException"foregroundServiceType on LocationRequestService from shortService -> location.[iOS] Fix bug with triggerActivites preventing motion-triggering in iOS simulator with simulated location.
triggerActivites preventing motion-triggering in iOS simulator with simulated location.[Android] Implement Service.onTimeout to handle foregroundServiceType="shortService" timeouts.
Service.onTimeout to handle foregroundServiceType="shortService" timeouts.Config.activityType ACTIVITY_TYPE_AIRBORNE.Config.triggerActivities for iOS.NullPointerException receiving a null location in PolygonGeofenceService event.imports related to Flutter V1 Embedding.Activity reference when terminating the app. Ensure internal reference to Activity is nullified when app is terminated.goefenceModeHighAccuracy: true where motion-activity updates disabled.NullPointerException.locationAuthorizationAlert on iOS 18.[iOS] Fix bug in iOS *Polygon Geofencing* when running in geofences-only mode (.startGeofences). iOS would mistakenly turn off location updates exactl
.startGeofences). iOS would mistakenly turn off location updates exactly 3 samples into the containing circular geofence of a polygon.notifyOnDwell for polygon-geofences.[Android] Remove permission FOREGROUND_SERVICE_HEALTH. It turns out that this permission is no longer required when the ActivityRecognitionServivce is
FOREGROUND_SERVICE_HEALTH. It turns out that this permission is no longer required when the ActivityRecognitionServivce is defined with a foregroundServiceType="shortservice", which allows a background-launched foreground-service to stay active for up to 3 minutes, which is sufficient for the ActivityRecognitionService, which typically stays activated only for a few milliseconds.[Android] Fix issues #1298 "Multiple geofence events triggered for a single geofence registration when registered individually".
[Android] Fix bug in .getCurrentPosition not returning or throwing an error in a condition where Network OFF and GPS ON.
FormatException instead of PlatformException.[iOS] Code-sign TSLocationManager.xcframework with new Apple Organization (*9224-2932 Quebec Inc*) certificate.
TSLocationManager.xcframework with new Apple Organization (9224-2932 Quebec Inc) certificate.[iOS] Add PrivacyInfo -> TSLocationManager.xcframework
CocoaLumberjack version -> 3.8.5 (version which includes its own PrivacyInfo)
.[iOS] Implement new iOS Privacy Manifest
AuthorizationEvent.status, provding the HTTP status code from the refreshUrl.[iOS] Fix bug in iOS scheduler, triggering ON incorrectly. For example, given a schedule: ['1 00:00-23:59'], the plugin was trigging on for DAY 2`.
schedule: ['1 00:00-23:59'], the plugin was trigging on for DAY 2`.[iOS] Fix bug in polygon-geofencing: monitoredIdentifiers not being cleared when .removeGeofences() is called, can result in null-pointer exception.
.removeGeofences() is called, can result in null-pointer exception.[Android] Change foregroundServiceType of the SDK's GeofencingService definition in its AndroidManifest from shortService -> location.
foregroundServiceType of the SDK's GeofencingService definition in its AndroidManifest from shortService -> location.[iOS] Modify behaviour of stop-detection system to NOT turn off location-services but merely adjust desiredAccuracy as high as possible. There were pr
locationAuthorizationRequest: 'WhenInUse' with recent versions of iOS where the stop-detection system could put the app to sleep during tracking if the motion API reported the device became momentarily stationary.Fix minor static analysis issues reported in dart code referencing part-of directive.
dart code referencing part-of directive.[Android] Add multi FlutterEngine support to Android
[Android] Fix problem with polygon-geofencing license-validation not working in DEBUG builds when configured with product flavors.
[Android] Remove deprecated flutter V1 plugin architecture code (registerWith).
registerWith).GeofencingService.ConcurrentModificationException in SingleLocationRequest.getBestLocation[Android] Fix IllegalStateException calling addGeofences when number of geofences exceeds platform maximum (100).
IllegalStateException calling addGeofences when number of geofences exceeds platform maximum (100).[Android] Fix error *Unhandled Exception: type 'Null' is not a subtype of type 'List '* in BackgroundGeolocation.geofences / getGeofence(uuid).
BackgroundGeolocation.geofences / getGeofence(uuid).TS.[iOS] Fix "*Duplicate symbol error DummyPods_TSLocationManager*".
Your coding agent can read these notes before it upgrades. Set up the MCP server →