NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev · #4220 most downloaded on pub.dev
iOS implementation of the Tracelet background geolocation plugin.
Last release 21 days ago
18 Sep 2026
Release timing varies
gaps range from 8 days to 5 weeks
Nearly every release is documented
notes for 60 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
7 months old
170 releases · first in 2026
One column per month.
FIX: Rename PermissionManager to TraceletPermissionManager to avoid class name collision with permission_handler_apple (#32).
PermissionManager to TraceletPermissionManager to avoid class name collision with permission_handler_apple (#32).tracelet_platform_interface dependency constraint to ^1.4.6.FEAT: Auto-request temporary full accuracy (iOS 14+) when tracking starts with reduced accuracy authorization.
buildLocationMap() locationSource classification and reducedAccuracy field.TraceletFullAccuracy purpose key documentation.tracelet_platform_interface dependency constraint to ^1.4.5.FEAT: iOS 14+ reduced accuracy detection — engine logs warnings when approximate location is active and tracks authorization transitions.
reducedAccuracy flag to each location fix — true when iOS grants only approximate location (~5 km).locationSource classification — under reduced accuracy, source is classified as cell since iOS returns coarse fixes.tracelet_platform_interface dependency constraint to ^1.4.4.FEAT: Add locationSource classification to every location fix (gps, wifi, cell, unknown) based on horizontalAccuracy heuristic.
locationSource classification to every location fix (gps, wifi, cell, unknown) based on horizontalAccuracy heuristic.tracelet_platform_interface dependency constraint to ^1.4.3.FIX: activateDeadReckoning() now retries via timer instead of silently returning when lastLocation is nil.
activateDeadReckoning() now retries via timer instead of silently returning when lastLocation is nil.tracelet_platform_interface dependency constraint to ^1.4.2.FEAT: Dead reckoning — full IMU sensor fusion implementation (DeadReckoningEngine). Uses CMDeviceMotion (fused accelerometer + gyroscope + magnetomete
DeadReckoningEngine). Uses CMDeviceMotion (fused accelerometer + gyroscope + magnetometer) for heading and step detection. Vehicle mode with acceleration integration.ConfigManager.tracelet_platform_interface dependency constraint to ^1.4.1.FEAT: Encrypted SQLite — database encryption via iOS Data Protection API (NSFileProtectionComplete).
NSFileProtectionComplete).DeviceAttestor).getDeadReckoningState() stub for future accelerometer/gyroscope-based position estimation.getCarbonReport() returns CO₂ estimates from tracked locations using EU average emission factors.DeviceCheck framework dependency.tracelet_platform_interface dependency constraint to ^1.4.0.FIX: getLocations() now honors SQLQuery.start and SQLQuery.end timestamp filtering.
getLocations() now honors SQLQuery.start and SQLQuery.end timestamp filtering.getCount() now accepts optional SQLQuery for time-bounded counting.^1.3.6.FIX: Fix Unable to find module dependency: 'TraceletCore' Swift compiler error by consolidating SPM targets into a single module and removing invalid
Unable to find module dependency: 'TraceletCore' Swift compiler error by consolidating SPM targets into a single module and removing invalid cross-module imports.AVFoundation, AudioToolbox, and Network framework linker settings in Package.swift.CHORE: Update tracelet_platform_interface dependency constraint to ^1.3.3.
tracelet_platform_interface dependency constraint to ^1.3.3.FIX: Bundle TraceletCore Swift source files directly inside the plugin package instead of depending on an unpublished local CocoaPod. Fixes unresolved
import TraceletCore when installed from pub.dev.PERF: Replace Foundation UUID() with C-level uuid_generate_random/uuid_unparse_lower in LocationEngine and TraceletDatabase (I-M6).
Foundation UUID() with C-level uuid_generate_random/uuid_unparse_lower in LocationEngine and TraceletDatabase (I-M6).FIX: getPersistenceExtras() now reads distinct persistenceExtras config key with backward-compatible fallback.
getPersistenceExtras() now reads distinct persistenceExtras config key with backward-compatible fallback.markSynced() uses chunked SQL statements (500 UUIDs/chunk) instead of unbounded placeholder lists.FIX: getState() always returned enabled: false on iOS — StateManager.toMap() flat-merged the config dictionary into the state dictionary, causing conf
getState() always returned enabled: false on iOS — StateManager.toMap() flat-merged the config dictionary into the state dictionary, causing config keys (enabled from audit section, isMoving from motion section) to overwrite runtime state values. Config is now correctly nested under a "config" key, matching the Android implementation and the Dart State.fromMap() contract (#26).CHORE: Version bump for federation consistency with tracelet_platform_interface 1.2.0 (new NotificationPriority and HashAlgorithm enums).
tracelet_platform_interface 1.2.0 (new NotificationPriority and HashAlgorithm enums).FEAT: Add native DeltaEncoder (Swift) for delta-compressed HTTP sync payloads — mirrors the Dart implementation exactly for platform consistency. Enco
DeltaEncoder (Swift) for delta-compressed HTTP sync payloads — mirrors the Dart implementation exactly for platform consistency. Encodes only field deltas between consecutive locations using shortened keys (la, lo, t, s, h, a, al, b), achieving 60–80% bandwidth reduction. Uses Foundation's ISO8601DateFormatter with fractional seconds fallback for robust timestamp handling.ConfigManager now reads and applies the following new configuration fields from Dart: batteryBudgetPerHour (adaptive battery budget target), enableSparseUpdates, sparseDistanceThreshold, sparseMaxIdleSeconds (app-level deduplication), enableDeadReckoning, deadReckoningActivationDelay, deadReckoningMaxDuration (inertial navigation when GPS lost), enableDeltaCompression, deltaCoordinatePrecision (HTTP delta encoding), and disableAutoSyncOnCellular (WiFi-only sync).HttpSyncManager now supports disableAutoSyncOnCellular — skips auto-sync when device is on cellular network, syncing only on WiFi. Also conditionally applies DeltaEncoder.encode() to multi-location batches before HTTP upload when enableDeltaCompression is enabled, reducing upload size by 60–80%.FIX: handleReset() unconditionally removed geofence registrations from CLLocationManager even when stopOnTerminate: false was configured with tracking
handleReset() unconditionally removed geofence registrations from CLLocationManager even when stopOnTerminate: false was configured with trackingMode=1 (geofence mode). Geofences now survive the reset call so CLLocationManager continues monitoring regions after app termination (#23).FIX: HTTP auto-sync never triggered from automatic location tracking — onLocationInserted() was only called from the manual insertLocation handler, no
onLocationInserted() was only called from the manual insertLocation handler, not from LocationEngine.persistLocationIfAllowed() (#21).ConfigManager.getHttpMethod() cast Int as String, silently ignoring HttpMethod.put — now correctly maps 0 → POST, 1 → PUT.ConfigManager.getHttpHeaders() strict [String: String] cast could drop headers when platform channel delivers [String: Any] — now coerces values to strings.maxBatchSize default corrected from 100 to 250 to match Dart and Android defaults.FEAT: First stable release of tracelet_ios.
tracelet_ios.PERF: Cache ISO8601DateFormatter as static instance (I-C1, I-C2).
ISO8601DateFormatter as static instance (I-C1, I-C2).UIDevice.isBatteryMonitoringEnabled once at plugin initialization (I-C3).stateQueue for thread-safe sync flag access (I-C4).BackgroundTaskHelper.shared.begin() with proper expiration handler (I-C5).pausesLocationUpdatesAutomatically to true (I-M1).activityType configurable via getActivityType() mapping (I-M2).URLSession — getAllTasks cancel instead of invalidateAndCancel (I-M3).BGAppRefreshTask.setTaskCompleted until async location fix returns (I-M4).CLCircularRegion (I-M5).CMMotionActivityManager and CMPedometer for accelerometer-only mode (I-L1).haversine() from GeofenceManager, call module-level function (I-L3).@available(iOS 14) self-assign no-op (I-L4).isMoreRestrictive() wrapper, inline isActionMoreRestrictive() call (I-L5).ConfigManager.swift for CLActivityType.FIX: Revert over-aggressive allowsBackgroundLocationUpdates and significant-location guards — When In Use permission now works correctly for foregroun
allowsBackgroundLocationUpdates and significant-location guards — When In Use permission now works correctly for foreground and background tracking. iOS enforces permission at the OS level; only the killed-state entry point (autoResumeTracking) requires Always authorization.FIX: Add .authorizedAlways guard to autoResumeTracking() — prevents "When In Use" permission from triggering tracking after app is relaunched from kil
.authorizedAlways guard to autoResumeTracking() — prevents "When In Use" permission from triggering tracking after app is relaunched from killed state via significant-location-change.allowsBackgroundLocationUpdates in configureLocationManager() and performPeriodicFix() — only set to true when Always authorization is granted.CHORE: Tighten tracelet_platform_interface constraint to ^0.11.2.
tracelet_platform_interface constraint to ^0.11.2.FIX: Set event: "periodic" in all didUpdateLocations code paths for periodic tracking (was empty string).
event: "periodic" in all didUpdateLocations code paths for periodic tracking (was empty string).canScheduleExactAlarms (returns true) and openExactAlarmSettings (returns false) method channel stubs.startPeriodic() and performPeriodicFix().FEAT: AuditTrailManager — SHA-256 hash chain with SQLite persistence and UserDefaults chain state.
AuditTrailManager — SHA-256 hash chain with SQLite persistence and UserDefaults chain state.PrivacyZoneManager — Haversine distance-based zone evaluation with exclude, degrade, and event-only actions.ConfigManager getters for audit and privacy zone configuration.tracelet_platform_interface to ^0.11.0.FEAT: Periodic mode — GPS-friendly interval tracking via startPeriodic(). Timer-based scheduling with background location toggling per fix.
startPeriodic(). Timer-based scheduling with background location toggling per fix.ConfigManager periodic config getters for interval, accuracy, foreground service, and exact alarms.ConfigManager.swift escaped string literals causing Swift compilation failure.tracelet_platform_interface to ^0.10.0.FIX: Safe optional unwrap of UIBackgroundTaskIdentifier in HttpSyncManager.syncNextBatch() — fixes Swift compiler error.
UIBackgroundTaskIdentifier in HttpSyncManager.syncNextBatch() — fixes Swift compiler error.FEAT: HTTP sync retry engine — configurable retry with exponential backoff for transient 5xx, 429, and timeout failures. Defers sync on connectivity l
NWPathMonitor. Batch continuation loop.MotionDetector reads shakeThreshold, stillThreshold, stillSampleCount from ConfigManager at runtime (auto-converts m/s² to g-force).tracelet_platform_interface to ^0.9.0.FEAT: Proximity-based geofence auto-load/unload — only geofences within geofenceProximityRadius are registered with CLLocationManager, sorted by dista
geofenceProximityRadius are registered with CLLocationManager, sorted by distance, capped at 20 (iOS limit). Enables monitoring thousands of geofences.GeofenceManager.updateProximity() — re-evaluates which geofences to monitor on every location update, dynamically swapping region registrations as the device moves.geofencesChange event fires with on/off arrays when geofences are activated/deactivated from proximity monitoring.maxMonitoredGeofences config respected — caps simultaneously monitored regions below the platform limit.tracelet_platform_interface to ^0.8.3.DOCS: Improve README visuals with combined Android & iOS demo image.
FEAT: BackgroundTaskHelper — central thread-safe utility wrapping UIApplication.beginBackgroundTask for safe background execution of native operations
BackgroundTaskHelper — central thread-safe utility wrapping UIApplication.beginBackgroundTask for safe background execution of native operations.CLBackgroundActivitySession support via BackgroundActivitySessionManager — extends background runtime for location-tracking apps.CLServiceSession support via ServiceSessionManager — maintains authorization state during background execution.LocationEngine.didUpdateLocations in background task — protects persist + dispatch chain from iOS suspension.HttpSyncManager.sync() in background task — protects entire HTTP upload + DB cleanup cycle.HeadlessRunner.dispatchEvent() engine boot in background task — ensures Dart engine starts fully before iOS reclaims resources.TraceletIosPlugin lifecycle transitions (handleStop, handleReset, onStopRequested, handleScheduleStop, stopAfterElapsedTimer) in background tasks.preventSuspendManager.start() now called in startGeofences() — was missing, causing audio keep-alive to not activate in geofence-only mode.preventSuspendManager.stop() now called in all stop paths (reset, stopOnStationary, scheduleStop, stopAfterElapsed) — was only called in handleStop().setConfig() now toggles preventSuspendManager mid-session when preventSuspend changes.reset() now calls cancelStopAfterElapsedTimer() — was leaving stale timer running after reset.FEAT: OEM compatibility stubs — getSettingsHealth returns isAggressiveOem: false (iOS has no OEM power management issues), openOemSettings returns fal
getSettingsHealth returns isAggressiveOem: false (iOS has no OEM power management issues), openOemSettings returns false.tracelet_platform_interface to ^0.8.0.DOCS: Add mock location detection feature to README with platform-specific detection details.
tracelet_platform_interface to ^0.7.1.FEAT: Mock location detection — isLocationMock() uses CLLocationSourceInformation (iOS 15+) to detect simulated locations.
isLocationMock() uses CLLocationSourceInformation (iOS 15+) to detect simulated locations.buildLocationMap() includes mock flag and mockHeuristics metadata map (timestampDriftMs, platformFlagMock).rejectMockLocations is enabled, drops mocked locations before sending to Dart and fires ProviderChangeEvent.mockLocationsDetected.ConfigManager.getMockDetectionLevel() and getRejectMockLocations() getters.tracelet_platform_interface to ^0.7.0.REFACTOR: Remove 6 dead ConfigManager methods for filtering migrated to Dart in 0.6.0 (getDisableElasticity, getElasticityMultiplier, getFilterPolicy,
ConfigManager methods for filtering migrated to Dart in 0.6.0 (getDisableElasticity, getElasticityMultiplier, getFilterPolicy, getMaxImpliedSpeed, getTrackingAccuracyThreshold, getUseKalmanFilter).EventDispatcher.sendTrip() and "trip" channel registration — trip events now from Dart TripManager.tracelet_platform_interface to ^0.6.1.REFACTOR: Remove duplicate location filtering from LocationEngine.didUpdateLocations() — elasticity, distance filter, accuracy filter, and speed filte
LocationEngine.didUpdateLocations() — elasticity, distance filter, accuracy filter, and speed filter now handled by shared Dart LocationProcessor.GeofenceManager.evaluateHighAccuracyProximity() with no-op stub — proximity evaluation moved to shared Dart GeofenceEvaluator.tracelet_platform_interface to ^0.6.0.FIX: onSchedule event now sends full state map (via stateManager.toMap()) instead of partial ["state": "on", "enabled": true] — fixes State.fromMap()
onSchedule event now sends full state map (via stateManager.toMap()) instead of partial ["state": "on", "enabled": true] — fixes State.fromMap() crash on schedule events.FIX: Heartbeat event now wraps location data in {"location": ...} to match HeartbeatEvent.fromMap() — fixes heartbeat always returning zero coordinate
{"location": ...} to match HeartbeatEvent.fromMap() — fixes heartbeat always returning zero coordinates.buildLocationMap()) when getCurrentPosition returns null.CHORE: Bump tracelet_platform_interface to ^0.5.3.
tracelet_platform_interface to ^0.5.3.FEAT: Accelerometer-only motion detection mode — when disableMotionActivityUpdates is true, uses CMMotionManager raw accelerometer for permission-free
disableMotionActivityUpdates is true, uses CMMotionManager raw accelerometer for permission-free stationary↔moving detection (no NSMotionUsageDescription required).getMotionAuthorizationStatus() / requestMotionPermission() return 3 (granted) immediately in accelerometer-only mode — no OS dialog shown.CMMotionManager instance for sensor queries instead of creating throwaway instances.CMMotionActivityManager.isActivityAvailable() returns false.DOCS: Rewrite README with proper description, setup guide link, and related packages table.
CHORE: Bump tracelet_platform_interface to ^0.5.0.
tracelet_platform_interface to ^0.5.0.FEAT: getMotionPermissionStatus() / requestMotionPermission() — CMMotionActivityManager authorization check.
getMotionPermissionStatus() / requestMotionPermission() — CMMotionActivityManager authorization check.lastEffectiveSpeed in LocationEngine.handleStart isMoving initialization.tracelet_platform_interface to ^0.4.0.FEAT: One-shot location via getCurrentPosition() with persist, samples, maximumAge, and extras parameters.
getCurrentPosition() with persist, samples, maximumAge, and extras parameters.distanceFilter = kCLDistanceFilterNone and DispatchQueue timeout guard.getLastKnownLocation() — prefers own cached location, falls back to CLLocationManager.location.ForegroundServiceConfig.enabled support.CLAuthorizationStatus guard in getCurrentPosition() — returns nil if not authorized instead of hanging.desiredAccuracy = kCLLocationAccuracyBest before requestLocation().tracelet_platform_interface: ^0.3.0.Fix LICENSE file format for proper SPDX detection on pub.dev.
Fix ConfigManager.setConfig() — flatten nested section sub-maps (geo, app, http, etc.) sent by Dart before processing. Fixes all user config values be
ConfigManager.setConfig() — flatten nested section sub-maps (geo, app, http, etc.) sent by Dart before processing. Fixes all user config values being silently ignored in favor of defaults.Fix duplicate keys in ConfigManager.defaultConfig() dictionary literal causing runtime crash.
ConfigManager.defaultConfig() dictionary literal causing runtime crash.Version bump for coordinated release.
Add Swift Package Manager support.
license: Apache-2.0 identifier for pub.dev scoring.CLLocationManager-based location tracking.
Your coding agent can read these notes before it upgrades. Set up the MCP server →