- Clean docs, prepare for Dave's deep dive reports
- Update panel images
- docs: rewrite README with setup, build, test, publish sections
- remove Pods from version control
- Migrate isPowerSaveMode -> new DeviceSettings class
- feat(State): add isFirstBoot property
- chore: pod install (regenerate Pods from Podfile.lock)
- feat(Geofence): add entryState, stateUpdatedAt, hits from TSGeofence
- refactor(Geofence): remove unnecessary dict initializer
- Revert "feat(Geofence): make dict initializer public"
- feat(Geofence): make dict initializer public
- feat(GeofenceEvent): add geofence: BGGeo.Geofence property; add dict init to Geofence
- feat(LocationEvent): add GeofenceTrigger nested struct and mock property
- Add typed State struct, remove getStationaryLocation()
- Rename ConnectivityChangeEvent.hasConnection → isConnected
- Align Swift API naming with Kotlin for cross-platform parity
- Type GeofenceEvent.location as LocationEvent instead of raw dictionary
- Add age and extras properties to LocationEvent
- Add uuid property to LocationEvent
- Add resetOdometer(), type authorization returns with CoreLocation enums
- Move DocsExamplesCompileTest to DemoApp2Tests target
- Add query params to Logger.getLog/emailLog, add uploadLog method
- Update CHANGELOG for 4.0.30
- Remove dead BackgroundGeolocationPlugin class name check
- Add retry to asset checksum verification in publish-ios.sh
- Update CHANGELOG for 4.0.29
- Set framework IPHONEOS_DEPLOYMENT_TARGET to 13.0 to match podspec
- Update CHANGELOG for 4.0.27
- Remove CocoaPods Swift subspec -- SwiftInterface is SPM-only
- Add --local flag to build-ios.sh for local SPM testing
- Don't commit version wtih --bump and --dry-run
- Update CHANGELOG for 4.0.24
- Clean stale entries from Unreleased section
- Add changelog generation to publish script
- Fix Capacitor validation
- Add retry to asset checksum verification in publish-ios.sh
- Set framework IPHONEOS_DEPLOYMENT_TARGET to 13.0 to match podspec
- Remove CocoaPods Swift subspec -- SwiftInterface is SPM-only
- Clean stale entries from Unreleased section
- Add changelog generation to publish script
- Don't show location authorization nag-dialog while !config.enabled
- Hardcode static URLs and license in podspec template Remove unnecessary ENV-based templating for homepage, documentation, social media URLs, and license fields — these never change between releases.
- Fix requestPermission() 30s timeout when user declines Always upgrade The upgrade-decline detection in applicationDidBecomeActive was gated behind a config.enabled check, so calling requestPermission() before ready() (config not enabled) caused the pending request to never resolve. Move in-flight authorization request lifecycle (Ask Next Time reset and upgrade-decline detection) above the config.enabled/automaticPromptEnabled guards so pending requests always complete regardless of tracking state.
- Add transistorAuthorizationToken param to ready() BGGeo.ready() now accepts an optional TransistorToken that auto-configures http.url and authorization (strategy, tokens, refreshUrl, refreshPayload, expires). The token rewrite always applies regardless of reset flag, since tokens may refresh between launches. DemoApp updated to use the new param, removing manual auth setup from the config closure. Doc test generator updated to handle bare ready() → ready { _ in } conversion for the new required-closure signature.
- Logger.log() accepts LogLevel enum instead of raw String The public log() method now takes a LogLevel enum value, preventing typos in level strings. Convenience methods (debug, info, warn, error, notice) still delegate directly to the ObjC layer via string tags. Added LogLevel.tag computed property to map enum cases to the ObjC string constants expected by TSLocationManager.log:message:.
- Logger.log() accepts LogLevel enum instead of raw String The public log() method now takes a LogLevel enum value, preventing typos in level strings. Convenience methods (debug, info, warn, error, notice) still delegate directly to the ObjC layer via string tags. Added LogLevel.tag computed property to map enum cases to the ObjC string constants expected by TSLocationManager.log:message:.
- Add convenience logging methods to Logger (debug, info, warn, error, notice) Thin wrappers over log(_:message:) matching the TS and Kotlin SDKs, so Swift developers can write bgGeo.logger.debug("msg") instead of bgGeo.logger.log("debug", message: "msg").
- Gitignore auto-generated DocsExamplesCompileTest.swift This file is regenerated by scripts/generate_docs_compile_test_swift.py from docs-db YAML files and should not be tracked.
- Add ready(reset:configure:), type-safe enums, and event improvements
SwiftInterface API improvements:
- BGGeo.ready(reset:configure:): config closure is now required (no bare ready()). reset=true (default) applies config every launch; reset=false applies only on first install, using persisted config on subsequent boots.
- HttpConfig.method: String → HttpMethod enum (.post, .put, .patch)
- GeolocationConfig.locationAuthorizationRequest: String → LocationAuthorizationRequest enum (.always, .whenInUse, .any)
- PersistenceConfig.locationsOrderDirection: String → LocationsOrderDirection enum (.ascending, .descending)
- ScheduleEvent: add typed enabled/trackingMode properties
- AuthorizationEvent: add isSuccess computed property
- HeartbeatEvent: add typed locationEvent property DemoApp updated to use ready(reset: false) { } pattern, replacing manual isFirstBoot guard. Doc compile test generator updated with Android-only detection and expanded to 110 test methods.
- Add pure-Swift Geofence API, removeListeners(), and docs compile verification
- Geofence struct: add public initializers for circle and polygon geofences so developers never need to touch TSGeofence.h directly. GeofenceManager.add() and addAll() now accept Geofence instead of TSGeofence.
- BGGeo.removeListeners(): new method to bulk-remove all event listeners, delegates to TSEventManager.removeListeners.
- generate_docs_compile_test_swift.py: extracts swift: blocks from docs-db YAML files and generates DocsExamplesCompileTest.swift for compile verification.
- DemoApp updated to use pure-Swift Geofence API.
- Add SwiftInterface: pure Swift API for SwiftUI developers
Introduces a thin Swift proxy layer (BGGeo) wrapping the ObjC TSLocationManager
singleton with idiomatic Swift patterns: async/await, closure-based event listeners
with auto-cleanup EventSubscription tokens, typed config sub-modules, and Swift
structs for all event types.
- 27 new Swift files in SwiftInterface/ (Config/, Events/, plus module proxies)
- Token-based event listener lifecycle (TSEventManager returns UUID tokens)
- ObjC onX methods now return NSString* token (backwards-compatible)
- Sub-objects: config, logger, store, geofences, authorization, sensors, app
- TransistorAuthorizationService for demo server auth
- DemoApp2 fully migrated to new Swift API
- Removed old SwiftOverlay/TSLocationEvent+Swift.swift
- Updated CLAUDE.md with SwiftInterface sync instructions
- Rename '## Unreleased' to versioned heading at publish time Updates both the private and public CHANGELOG.md, replacing '## Unreleased' with '## X.Y.Z — YYYY-MM-DD' before copying to the public repo.
- Add pod install to setup script
- Add setup script and Install section to README
- Add post-commit hook to auto-update CHANGELOG.md Appends commit messages under an "## Unreleased" section (created if missing). Skips merge commits, strips Co-Authored-By lines, indents multi-line bodies. Amends the commit to include the changelog update. Set core.hooksPath with: git config core.hooksPath scripts/hooks
- Add JSON POST body support to authorization token refresh. Port Android SDK behavior: when refreshHeaders contains "Content-Type: application/json", serialize refreshPayload as a JSON body instead of form-encoded. Unrecognized content types fall back to form-encoded for backward compatibility.
- Add watchdog timer for HttpService.
- ensure http timeoutSeconds is used.
- Fix Capacitor licensing
- Fix bug in geofence event-handling when booted due to geofence event (monitoredGeofences cache is empty).
- Guard against posibility of creating
CLLocationManagerinstances on background threads. Can happen if getCurrentPosition called before ready. - LocationFilter enabled by default: v5 introduces an on-device geolocation.filter layer (Kalman + kinematic/outlier logic) which can change which samples are delivered to onLocation and how distance deltas are smoothed/adjusted.
- Adaptive default for non-high accuracy: When geolocation.desiredAccuracy is not High/Navigation and the app has not explicitly configured geolocation.filter, the default geolocation.filter.policy now auto-relaxes to PassThrough to avoid overly aggressive rejection on low/medium accuracy profiles.
- Preserve v4 behavior: Set geolocation.filter.policy = PassThrough (and optionally disable Kalman / thresholds) to retain pre-v5 “raw” location behavior.
- messed up build
- loosen TSMotionChangeRequest props (desiredAccuracy 10 -> 20)
- Support sparse config updates on LocationFilter
- Don't enforce JWT format for access-token in TSAuthorization
- Fix bugs in TSLocationRequestService location-satisfier
- Fix bug in Geofence DWELL not firing after refactor of TSLocationRequestService
- Fix single-location request on first launch after install.
- Fix bug in iOS License Validation Failure modal dialog interfering with React Native app launching. Change to less intrusive alert mechanism.
- Fix bug returning wrong data-structure to watchPosition callback.
- Fix first-launch issue with initial call to
.start(). - Fix config.authorization bug (refreshPayload and refreshHeaders being ignored).
- Fix bug in
setOdometernot resolving itsPromise
- Fix bug in TSAuthorizationConfig. was providing custom implementation of updateWithDictionary. Totally unnecessary since TSConfigModuleBase handles all that under the hood.
- Fixed bug in [TSConfig reset] resetting state params (enabled, isMoving, schedulerEnabled). It should only reset compound-config modules.
- Implemented isTestFlight detection with "sandboxReceipt"