Skip to Content
FBG-เดฏเดฟเตฝ เดจเดฟเดจเตเดจเต เดฎเตˆเด—เตเดฐเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต

๐Ÿš€ เดฎเตˆเด—เตเดฐเต‡เดทเตป เด—เตˆเดกเต: flutter_background_geolocation โ†’ Tracelet

flutter_background_geolocation เดŽเดจเตเดจเดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดŸเตเดฐเต‡เดธเตโ€Œเดฒเต†เดฑเตเดฑเดฟเดฒเต‡เด•เตเด•เต เดฎเดพเดฑเตเด•เดฏเดพเดฃเต‹? เดฎเดฟเด•เดšเตเดš เดคเดฟเดฐเดžเตเดžเต†เดŸเตเดชเตเดชเต! Tracelet เดŽเดจเตเดจเดคเต 1:1 เด…เดจเตเดฏเต‹เดœเตเดฏเดฎเดพเดฏ API เด‰เดณเตเดณ เด’เดฐเต เดชเต‚เตผเดฃเตเดฃเดฎเดพเดฏ เด“เดชเตเดชเตบ เดธเต‹เดดเตโ€Œเดธเต (เด…เดชเตเดชเดพเดšเตเดšเต† 2.0) เดฌเดฆเดฒเดพเดฃเต - เด•เต‚เดŸเดพเดคเต† เด•เตฝเดฎเดพเตป เดซเดฟเตฝเดŸเตเดŸเดฑเดฟเด‚เด—เต, เดฎเต‹เด•เตเด•เต เดกเดฟเดฑเตเดฑเด•เตเดทเตป, เดชเตเดฐเตˆเดตเดธเดฟ เดธเต‹เดฃเตเด•เตพ เดŽเดจเตเดจเดฟเดตเดฏเตเด‚ เด…เดคเดฟเดฒเต‡เดฑเต†เดฏเตเด‚. เดฒเตˆเดธเตปเดธเต เด•เต€เด•เดณเดฟเดฒเตเดฒ, เดชเตเดฐเตŠเดชเตเดฐเตˆเดฑเตเดฑเดฑเดฟ SDKเด•เดณเดฟเดฒเตเดฒ, เดชเต‚เตผเดฃเตเดฃ เดธเต‹เดดเตโ€Œเดธเต เด•เต‹เดกเดฟเดฒเตเดฒ.

๐Ÿ’ก เดˆ เด—เตˆเดกเต เดŽเดฒเตเดฒเดพเดฏเตเดชเตเดชเต‹เดดเตเด‚ เดจเดฟเดฒเดตเดฟเดฒเต† เดฑเดฟเดฒเต€เดธเต เดชเตเดฐเดคเดฟเดซเดฒเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต.


โšก 3-เด˜เดŸเตเดŸ เดธเตเดชเต€เดกเต เดฑเตบ

เด—เตเดฐเตเดคเดฐเดฎเดพเดฏเดฟ, เด‡เดคเต เดตเดณเดฐเต† เดตเต‡เด—เดคเดฏเตเดณเตเดณเดคเดพเดฃเต.

เด˜เดŸเตเดŸเด‚ 1 - เด†เดถเตเดฐเดฟเดคเดคเตเดตเด‚ เดฎเดพเดฑเตเดฑเตเด•:

# Before dependencies: flutter_background_geolocation: ^5.x.x

เดถเต‡เดทเด‚ โœจ

dependencies: tracelet: ^3.6.14

เด˜เดŸเตเดŸเด‚ 2 โ€” เด…เดชเตเดกเต‡เดฑเตเดฑเต เด‡เดฑเด•เตเด•เตเดฎเดคเดฟ:

// Before import 'package:flutter_background_geolocation/flutter_background_geolocation.dart' as bg; // After โ€” short & sweet โœ… import 'package:tracelet/tracelet.dart' as tl;

เด˜เดŸเตเดŸเด‚ 3 - เด•เตเดฒเดพเดธเตเดธเดฟเตปเตเดฑเต† เดชเต‡เดฐเต เด•เดฃเตเดŸเต†เดคเตเดคเดฟ เดฎเดพเดฑเตเดฑเดฟเดธเตเดฅเดพเดชเดฟเด•เตเด•เตเด•:

// Before bg.BackgroundGeolocation.ready(bg.Config(...)); // After tl.Tracelet.ready(tl.Config.balanced().copyWith(...));

เด…เดคเต เด…เด•เตเดทเดฐเดพเตผเดคเตเดฅเดคเตเดคเดฟเตฝ เดคเดจเตเดจเต†. เดŽเดฒเตเดฒเดพ เดฐเต€เดคเดฟเด•เดณเตเด‚, เดŽเดฒเตเดฒเดพ เดธเด‚เดญเดตเด™เตเด™เดณเตเด‚, เด“เดฐเต‹ เด•เต‹เตพเดฌเดพเด•เตเด•เตเด‚ - 1:1 เด…เดจเตเดฏเต‹เดœเตเดฏเด‚. เดˆ เด—เตˆเดกเดฟเตปเตเดฑเต† เดฌเดพเด•เตเด•เดฟ เดญเดพเด—เด‚ เดตเดฟเดถเดฆเดพเด‚เดถเด™เตเด™เตพเด•เตเด•เตเดณเตเดณ เดšเต€เดฑเตเดฑเต เดทเต€เดฑเตเดฑเต เดฎเดพเดคเตเดฐเดฎเดพเดฃเต.


๐Ÿ—๏ธ เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป: เดซเตเดฒเดพเดฑเตเดฑเดฟเตฝ เดจเดฟเดจเตเดจเต เด˜เดŸเดจเดฏเดฟเดฒเต‡เด•เตเด•เต

เดฎเตเดฎเตเดชเดคเตเดคเต† เดชเตเดฒเด—เดฟเตป เด’เดฐเต เดฒเต†เดตเดฒเดฟเตฝ เดŽเดฒเตเดฒเดพ เดซเต€เตฝเดกเตเด•เดณเตเด‚ เด‰เดณเตเดณ เด’เดฐเตŠเดฑเตเดฑ เดซเตเดฒเดพเดฑเตเดฑเต Config() เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต. Tracelet เด…เดตเดฏเต† เดฒเต‹เดœเดฟเด•เตเด•เตฝ เดตเดฟเดญเดพเด—เด™เตเด™เดณเดพเดฏเดฟ เด•เตเดฐเดฎเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเต - เดตเดฒเดฟเดฏ เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเดจเตเด•เตพ เดตเดพเดฏเดฟเด•เตเด•เดพเดจเตเด‚ เดชเดฐเดฟเดชเดพเดฒเดฟเด•เตเด•เดพเดจเตเด‚ เดตเดณเดฐเต† เดŽเดณเตเดชเตเดชเดฎเดพเด•เตเด•เตเดจเตเดจเต.

// Before โ€” flat config bg.Config( desiredAccuracy: bg.Config.DESIRED_ACCURACY_HIGH, distanceFilter: 10.0, stopOnTerminate: false, startOnBoot: true, stopTimeout: 5, url: 'https://api.example.com/locations', batchSync: true, autoSync: true, headers: {'Authorization': 'Bearer $token'}, heartbeatInterval: 60, notification: bg.Notification(title: 'Tracking', text: 'Active'), debug: true, logLevel: bg.Config.LOG_LEVEL_VERBOSE, ); // After โ€” organized by section ๐Ÿ  tl.Config( geo: tl.GeoConfig( desiredAccuracy: tl.DesiredAccuracy.high, // typed enums! distanceFilter: 10.0, ), app: tl.AppConfig( stopOnTerminate: false, startOnBoot: true, heartbeatInterval: 60, ), android: tl.AndroidConfig( foregroundService: tl.ForegroundServiceConfig( notificationTitle: 'Tracking', notificationText: 'Active', ), ), motion: tl.MotionConfig( stopTimeout: 5, ), http: tl.HttpConfig( url: 'https://api.example.com/locations', batchSync: true, autoSync: true, headers: {'Authorization': 'Bearer $token'}, ), logger: tl.LoggerConfig( debug: true, logLevel: tl.LogLevel.verbose, // readable enum instead of int constants ), );

เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เดตเดฟเดญเดพเด—เด™เตเด™เตพ เด’เดฑเตเดฑเดจเต‹เดŸเตเดŸเดคเตเดคเดฟเตฝ:

  • geo โ†’ GeoConfig โ€” เด•เตƒเดคเตเดฏเดค, เดฆเต‚เดฐเด‚ เดซเดฟเตฝเดŸเตเดŸเตผ, เด‡เดฒเดพเดธเตเดคเดฟเด•เดค, เด†เดจเตเด•เดพเดฒเดฟเด• เดฎเต‹เดกเต, เด•เตฝเดฎเดพเตป เดซเดฟเตฝเดŸเตเดŸเตผ, เดฎเต‹เด•เตเด•เต เดกเดฟเดฑเตเดฑเด•เตเดทเตป
  • app โ†’ AppConfig โ€” เดœเต€เดตเดฟเดคเดšเด•เตเดฐเด‚, เดนเตƒเดฆเดฏเดฎเดฟเดŸเดฟเดชเตเดชเต, เดทเต†เดกเตเดฏเต‚เตพ
  • android โ†’ AndroidConfig โ€” ๐Ÿ†• เด†เตปเดกเตเดฐเต‹เดฏเดฟเดกเต เดฎเดพเดคเตเดฐเด‚: เดซเต‹เตผเด—เตเดฐเต—เดฃเตเดŸเต เดธเต‡เดตเดจ เด…เดฑเดฟเดฏเดฟเดชเตเดชเต, เดฒเตŠเด•เตเด•เต‡เดทเตป เด…เดชเตโ€Œเดกเต‡เดฑเตเดฑเต เด‡เดŸเดตเต‡เดณเด•เตพ, เด…เดฒเดพเดฑเด‚ เดฎเดพเดจเต‡เดœเตผ, เด†เดจเตเด•เดพเดฒเดฟเด• เดคเดจเตเดคเตเดฐเด™เตเด™เตพ
  • ios โ†’ IosConfig โ€” ๐Ÿ†• iOS-เดฎเดพเดคเตเดฐเด‚: เดชเตเดฐเดตเตผเดคเตเดคเดจ เดคเดฐเด‚, เดชเดถเตเดšเดพเดคเตเดคเดฒ เดธเต†เดทเดจเตเด•เตพ, เดคเดพเตฝเด•เตเด•เดพเดฒเดฟเด•เดฎเดพเดฏเดฟ เดจเดฟเตผเดคเตเดคเตเดจเตเดจเดคเต เดคเดŸเดฏเตเด•
  • motion โ†’ MotionConfig - เด•เดพเดฒเดนเดฐเดฃเดชเตเดชเต†เดŸเตฝ เดจเดฟเตผเดคเตเดคเตเด•, เดชเตเดฐเดตเตผเดคเตเดคเดจ เดคเดฟเดฐเดฟเดšเตเดšเดฑเดฟเดฏเตฝ, เด†เด•เตเดธเดฟเดฒเดฑเต‹เดฎเต€เดฑเตเดฑเตผ เดฎเดพเดคเตเดฐเด‚ เดฎเต‹เดกเต
  • http โ†’ HttpConfig โ€” เดธเดฎเดจเตเดตเดฏ URL, เดคเดฒเด•เตเด•เต†เดŸเตเดŸเตเด•เตพ, เดฌเดพเดšเตเดšเดฟเด‚เด—เต, เดฌเดพเด•เตเด•เตเด“เดซเต, Wi-Fi-เดฎเดพเดคเตเดฐเด‚ เดฎเต‹เดกเต เดตเต€เดฃเตเดŸเตเด‚ เดถเตเดฐเดฎเดฟเด•เตเด•เตเด•
  • logger โ†’ LoggerConfig - เดฒเต‹เด—เต เดฒเต†เดตเตฝ, เดชเดฐเดฎเดพเดตเดงเดฟ เดฆเดฟเดตเดธเด™เตเด™เตพ, เดกเต€เดฌเด—เต เดถเดฌเตโ€Œเดฆเด™เตเด™เตพ
  • geofence โ†’ GeofenceConfig โ€” เดชเตเดฐเต‹เด•เตเดธเดฟเดฎเดฟเดฑเตเดฑเดฟ เดฑเต‡เดกเดฟเดฏเดธเต, เดชเตเดฐเดพเดฐเด‚เดญ เดŸเตเดฐเดฟเด—เตผ, เดจเต‹เด•เตเด•เต—เดŸเตเดŸเต เดฎเต‹เดกเต
  • persistence โ†’ PersistenceConfig - เดชเต†เตผเดธเดฟเดธเตเดฑเตเดฑเต เดฎเต‹เดกเต, เดชเดฐเดฎเดพเดตเดงเดฟ เดฆเดฟเดตเดธเด‚/เดฐเต‡เด–เด•เตพ, เดŸเต†เด‚เดชเตเดฒเต‡เดฑเตเดฑเตเด•เตพ
  • audit โ†’ AuditConfig โ€” ๐Ÿ†• SHA-256 เดนเดพเดทเต เดšเต†เดฏเดฟเตป โ€” เด•เดพเดฐเดฃเด‚ เดŸเดพเด‚เดชเตผ เดชเตเดฐเต‚เดซเต เดชเตเดฐเดงเดพเดจเดฎเดพเดฃเต
  • privacyZone โ†’ PrivacyZoneConfig โ€” ๐Ÿ†• เดชเตเดฐเตˆเดตเดธเดฟ เดธเต‹เตบ เดŽเดžเตเดšเดฟเตป โ€” GDPR-เตปเตเดฑเต† เด‰เดฑเตเดฑ เดšเด™เตเด™เดพเดคเดฟ
  • security โ†’ SecurityConfig โ€” ๐Ÿ†• เดตเดฟเดถเตเดฐเดฎเดตเต‡เดณเดฏเดฟเตฝ เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เดŽเตปเด•เตเดฐเดฟเดชเตเดทเตป (encryptDatabase)
  • attestation โ†’ AttestationConfig โ€” ๐Ÿ†• เด‰เดชเด•เดฐเดฃ เด…เดฑเตเดฑเดธเตเดฑเตเดฑเต‡เดทเตป / เดธเดฎเด—เตเดฐเดค เดชเดฐเดฟเดถเต‹เดงเดจเด•เตพ

๐Ÿ—บ๏ธ เดตเดฒเดฟเดฏ เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เดšเต€เดฑเตเดฑเต เดทเต€เดฑเตเดฑเต

เดตเดฟเดทเดฎเดฟเด•เตเด•เต‡เดฃเตเดŸ, เด“เดฐเต‹ เดซเต€เตฝเดกเดฟเดจเตเด‚ 1:1 เดฎเดพเดชเตเดชเดฟเด‚เด—เต เด‰เดฃเตเดŸเต. เด‡เดคเดพ เดจเดฟเด™เตเด™เดณเตเดŸเต† เดฑเต‹เดธเต†เดฑเตเดฑ เดธเตเดฑเตเดฑเต‹เตบ.

เดฒเตŠเด•เตเด•เต‡เดทเดจเตเด‚ เดŸเตเดฐเดพเด•เตเด•เดฟเด‚เด—เตเด‚ โ†’ GeoConfig

Before โ†’ Tracelet โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ desiredAccuracy (int: -2โ€ฆ100) โ†’ geo.desiredAccuracy (DesiredAccuracy enum) .high / .medium / .low / .veryLow / .passive distanceFilter โ†’ geo.distanceFilter (default 10m) stationaryRadius โ†’ geo.stationaryRadius (default 25m) locationTimeout โ†’ geo.locationTimeout (default 60s) disableElasticity โ†’ geo.disableElasticity elasticityMultiplier โ†’ geo.elasticityMultiplier (default 1.0) stopAfterElapsedMinutes โ†’ geo.stopAfterElapsedMinutes (-1 = disabled) enableTimestampMeta โ†’ geo.enableTimestampMeta maxMonitoredGeofences โ†’ geo.maxMonitoredGeofences (-1 = platform default)

Android-เดจเดฟเตผเดฆเตเดฆเดฟเดทเตเดŸ เดซเต€เตฝเดกเตเด•เตพ โ†’ AndroidConfig:

Before โ†’ Tracelet โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ locationUpdateInterval โ†’ android.locationUpdateInterval (1000ms) fastestLocationUpdateInterval โ†’ android.fastestLocationUpdateInterval (500ms) deferTime โ†’ android.deferTime allowIdenticalLocations โ†’ android.allowIdenticalLocations geofenceModeHighAccuracy โ†’ geofence.geofenceModeHighAccuracy (cross-platform; android.* is deprecated) scheduleUseAlarmManager โ†’ android.scheduleUseAlarmManager

iOS-เดจเดฟเตผเดฆเตเดฆเดฟเดทเตเดŸ เดซเต€เตฝเดกเตเด•เตพ โ†’ IosConfig:

Before โ†’ Tracelet โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ activityType โ†’ ios.activityType (LocationActivityType enum) useSignificantChangesOnly โ†’ ios.useSignificantChangesOnly showsBackgroundLocationIndicator โ†’ ios.showsBackgroundLocationIndicator pausesLocationUpdatesAutomatically โ†’ ios.pausesLocationUpdatesAutomatically locationAuthorizationRequest โ†’ ios.locationAuthorizationRequest disableLocationAuthorizationAlert โ†’ ios.disableLocationAuthorizationAlert preventSuspend โ†’ ios.preventSuspend

๐Ÿ†• Tracelet-exclusive GeoConfig เดซเต€เตฝเดกเตเด•เตพ:

  • geo.enableAdaptiveMode - เด†เด•เตเดฑเตเดฑเดฟเดตเดฟเดฑเตเดฑเดฟ + เดฌเดพเดฑเตเดฑเดฑเดฟ + เดธเตเดชเต€เดกเต เด…เดจเตเดธเดฐเดฟเดšเตเดšเต เดฆเต‚เดฐเด‚ เดซเดฟเตฝเดŸเตเดŸเตผ เดชเตŠเดฐเตเดคเตเดคเดชเตเดชเต†เดŸเตเดคเตเดคเตเดจเตเดจเต
  • geo.periodicLocationInterval โ€” เดกเดฟเดซเต‹เตพเดŸเตเดŸเต 900เดธเต† (15 เดฎเดฟเดจเดฟเดฑเตเดฑเต)
  • geo.periodicDesiredAccuracy โ€” เดกเดฟเดซเต‹เตพเดŸเตเดŸเต .medium
  • geo.filter (LocationFilter) - เด•เตฝเดฎเดพเตป, เดฎเต‹เด•เตเด•เต เดกเดฟเดฑเตเดฑเด•เตเดทเตป, เด•เตƒเดคเตเดฏเดค เดคเตเดฐเต†เดทเต‹เตพเดกเตเด•เตพ

๐Ÿงน เดฒเตŠเด•เตเด•เต‡เดทเตป เดซเดฟเตฝเดŸเตเดŸเตผ โ†’ LocationFilter (เดŸเตเดฐเต‡เดธเตโ€Œเดฒเต†เดฑเตเดฑเต-เดŽเด•เตโ€Œเดธเตโ€Œเด•เตเดฒเต‚เดธเต€เดตเต!)

  • ๐Ÿ†• filter.policy โ€” LocationFilterPolicy.adjust / .ignore / .discard
  • ๐Ÿ†• filter.useKalmanFilter โ€” 4-เดธเตเดฑเตเดฑเต‡เดฑเตเดฑเต เดŽเด•เตเดธเตเดฑเตเดฑเต†เตปเดกเดกเต เด•เตฝเดฎเดพเตป เดซเดฟเตฝเดŸเตเดŸเตผ โ€” เด’เดฐเต เดชเตเดฐเต‹ เดชเต‹เดฒเต† GPS เดถเดฌเตเดฆเด‚ เดธเตเด—เดฎเดฎเดพเด•เตเด•เตเด•
  • ๐Ÿ†• filter.mockDetectionLevel โ€” .disabled / .basic / .heuristic โ€” เด† เด•เดฌเดณเดฟเดชเตเดชเดฟเดšเตเดš เดธเตเดฅเดฒเด™เตเด™เตพ เดชเดฟเดŸเดฟเด•เตเด•เตเด•
  • ๐Ÿ†• filter.rejectMockLocations โ€” เดฎเต‹เด•เตเด•เต เดฒเตŠเด•เตเด•เต‡เดทเดจเตเด•เตพ เดธเตเดตเดฏเดฎเต‡เดต เดจเดฟเดฐเดธเดฟเด•เตเด•เตเด•
  • ๐Ÿ†• filter.maxImpliedSpeed โ€” เดธเตเดชเตˆเด•เตเด•เต เดซเดฟเตฝเดŸเตเดŸเตผ โ€” โ€œเด‡เดฒเตเดฒ, เด‰เดชเดฏเต‹เด•เตเดคเดพเดตเต เดŸเต†เดฒเดฟเดชเต‹เตผเดŸเตเดŸเต เดšเต†เดฏเตเดคเดฟเดฒเตเดฒโ€
  • ๐Ÿ†• filter.trackingAccuracyThreshold โ€” เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เดพเดจเตเดณเตเดณ เดเดฑเตเดฑเดตเตเด‚ เด•เตเดฑเดžเตเดž เด•เตƒเดคเตเดฏเดค
  • ๐Ÿ†• filter.odometerAccuracyThreshold โ€” เด“เดกเต‹เดฎเต€เดฑเตเดฑเตผ เด…เดชเตโ€Œเดกเต‡เดฑเตเดฑเตเด•เตพเด•เตเด•เตเดณเตเดณ เดเดฑเตเดฑเดตเตเด‚ เด•เตเดฑเดžเตเดž เด•เตƒเดคเตเดฏเดค

เดฎเต‹เดทเตป เดกเดฟเดฑเตเดฑเด•เตเดทเตป โ†’ MotionConfig

Before โ†’ Tracelet โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ stopTimeout โ†’ motion.stopTimeout (default 5 min) motionTriggerDelay โ†’ motion.motionTriggerDelay disableMotionActivityUpdates โ†’ motion.disableMotionActivityUpdates (set true for accelerometer-only, no permission!) isMoving โ†’ motion.isMoving (initial state) activityRecognitionInterval โ†’ motion.activityRecognitionInterval (10000ms) minimumActivityRecognitionConfidence โ†’ motion.minimumActivityRecognitionConfidence (75) disableStopDetection โ†’ motion.disableStopDetection stopDetectionDelay โ†’ motion.stopDetectionDelay stopOnStationary โ†’ motion.stopOnStationary triggerActivities โ†’ motion.activityTypes (Set<ActivityType>)

๐Ÿ†• Tracelet-exclusive MotionConfig เดซเต€เตฝเดกเตเด•เตพ:

  • motion.motionDetectionMode โ€” .accelerometer / .speed / .smart โ€” เดŽเด™เตเด™เดจเต†เดฏเดพเดฃเต เดšเดฒเดจเด‚ เด•เดฃเตเดŸเต†เดคเตเดคเตเดจเตเดจเดคเต (เดธเตเดฎเดพเตผเดŸเตเดŸเต = เด†เด•เตเดธเดฟเดฒเดฑเต‹เดฎเต€เดฑเตเดฑเตผ เด’เดชเตเดชเด‚ เดœเดฟเดชเดฟเดŽเดธเต เดตเต‡เด—เดค; เดถเตเดชเดพเตผเดถ เดšเต†เดฏเตเดฏเตเดจเตเดจเต)
  • motion.shakeThreshold โ€” เด†เด•เตเดธเดฟเดฒเดฑเต‹เดฎเต€เดฑเตเดฑเตผ เดฎเดพเดคเตเดฐเดฎเตเดณเตเดณ เดŸเตเดฏเต‚เดฃเดฟเด‚เด—เต (เดกเดฟเดซเต‹เตพเดŸเตเดŸเต 2.5)
  • motion.stillThreshold โ€” เด†เด•เตเดธเดฟเดฒเดฑเต‹เดฎเต€เดฑเตเดฑเตผ เดฎเดพเดคเตเดฐเดฎเตเดณเตเดณ เดŸเตเดฏเต‚เดฃเดฟเด‚เด—เต (เดกเดฟเดซเต‹เตพเดŸเตเดŸเต 0.4)
  • motion.stillSampleCount โ€” เด†เด•เตเดธเดฟเดฒเดฑเต‹เดฎเต€เดฑเตเดฑเตผ เดฎเดพเดคเตเดฐเดฎเตเดณเตเดณ เดŸเตเดฏเต‚เดฃเดฟเด‚เด—เต (เดธเตเดฅเดฟเดฐเดธเตเดฅเดฟเดคเดฟ 25)
  • motion.speedMovingThreshold / motion.speedStationaryDelay / motion.speedWakeConfirmCount โ€” เดธเตเดชเต€เดกเต-เดฎเต‹เดกเต เดŸเตเดฏเต‚เดฃเดฟเด‚เด—เต (.speed / .smart เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต)
  • motion.stationaryTrackingMode / motion.stationaryPeriodicInterval / motion.stationaryPeriodicAccuracy - เด’เดฐเดฟเด•เตเด•เตฝ เดจเดฟเดถเตเดšเดฒเดฎเดพเดฏเดฟ เดŽเดจเตเดคเตเดšเต†เดฏเตเดฏเดฃเด‚ (เด†เดจเตเด•เดพเดฒเดฟเด• เดชเดฐเดฟเดนเดพเดฐเด™เตเด™เตพ vs เดœเดฟเดฏเต‹เดซเต†เตปเดธเตเด•เตพ)

เด…เดชเต‡เด•เตเดท โ†’ AppConfig

Before โ†’ Tracelet โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ stopOnTerminate โ†’ app.stopOnTerminate (default true) startOnBoot โ†’ app.startOnBoot (default false) heartbeatInterval โ†’ app.heartbeatInterval (default 60s) schedule โ†’ app.schedule (cron-like expressions)

เดถเตเดฐเดฆเตเดงเดฟเด•เตเด•เตเด•: scheduleUseAlarmManager โ†’ android.scheduleUseAlarmManager | preventSuspend โ†’ ios.preventSuspend

๐Ÿ”” เดซเต‹เตผเด—เตเดฐเต—เดฃเตเดŸเต เดธเตผเดตเต€เดธเต เด…เดฑเดฟเดฏเดฟเดชเตเดชเต โ†’ AndroidConfig.foregroundService

เดชเตเดฐเดงเดพเดจเด‚ (2.x.x เดฎเดพเดฑเตเดฑเด‚): เดซเต‹เตผเด—เตเดฐเต—เดฃเตเดŸเต เดธเต‡เดตเดจ เด…เดฑเดฟเดฏเดฟเดชเตเดชเต เด‡เดชเตเดชเต‹เตพ android.foregroundService (เด’เดฐเต AndroidConfig) เดŽเดจเตเดจเดคเดฟเดจเต เด•เต€เดดเดฟเตฝ เด•เต‹เตบเดซเดฟเด—เตผ เดšเต†เดฏเตโ€Œเดคเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต, app เดŽเดจเตเดจเดคเดฟเดจเต เด•เต€เดดเดฟเดฒเดฒเตเดฒ. เด‡เดคเต เด†เตปเดกเตเดฐเต‹เดฏเดฟเดกเต เดฎเดพเดคเตเดฐเดฎเตเดณเตเดณ เด’เดฐเต เด†เดถเดฏเดฎเดพเดฃเต.

Before (Notification) โ†’ Tracelet (AndroidConfig.foregroundService) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ title โ†’ android.foregroundService.notificationTitle text โ†’ android.foregroundService.notificationText color โ†’ android.foregroundService.notificationColor smallIcon โ†’ android.foregroundService.notificationSmallIcon largeIcon โ†’ android.foregroundService.notificationLargeIcon priority โ†’ android.foregroundService.notificationPriority channelName โ†’ android.foregroundService.channelName channelId โ†’ android.foregroundService.channelId sticky โ†’ android.foregroundService.notificationOngoing actions โ†’ android.foregroundService.actions enabled โ†’ android.foregroundService.enabled

HTTP เดธเดฎเดจเตเดตเดฏเด‚ โ†’ HttpConfig

Before โ†’ Tracelet โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ url โ†’ http.url (null = sync disabled) method โ†’ http.method (HttpMethod.post / .put) headers โ†’ http.headers httpRootProperty โ†’ http.httpRootProperty (default 'location') batchSync โ†’ http.batchSync maxBatchSize โ†’ http.maxBatchSize autoSync โ†’ http.autoSync autoSyncThreshold โ†’ http.autoSyncThreshold httpTimeout โ†’ http.httpTimeout (default 60000ms) params โ†’ http.params extras โ†’ http.extras locationsOrderDirection โ†’ http.locationsOrderDirection (LocationOrder enum)

๐Ÿ†• Tracelet-exclusive HttpConfig เดซเต€เตฝเดกเตเด•เตพ:

  • http.disableAutoSyncOnCellular โ€” Wi-Fi-เดฎเดพเดคเตเดฐเด‚ เดธเดฎเดจเตเดตเดฏเด‚ โ€” เด† เดกเดพเดฑเตเดฑ เดชเตเดฒเดพเตป เดธเด‚เดฐเด•เตเดทเดฟเด•เตเด•เตเด•!
  • http.maxRetries โ€” เดกเดฟเดซเต‹เตพเดŸเตเดŸเต 10, เดŽเด•เตโ€Œเดธเตโ€Œเดชเต‹เดฃเตปเดทเตเดฏเตฝ เดฌเดพเด•เตเด•เตเด“เดซเต + เดตเดฟเดฑเดฏเตฝ
  • http.retryBackoffBase - เดกเดฟเดซเต‹เตพเดŸเตเดŸเต 1000ms
  • http.retryBackoffCap โ€” เดกเดฟเดซเต‹เตพเดŸเตเดŸเต 300000ms (5 เดฎเดฟเดจเดฟเดฑเตเดฑเต)

เดœเดฟเดฏเต‹เดซเต†เตปเดธเดฟเด‚เด—เต โ†’ GeofenceConfig

Before โ†’ Tracelet โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ geofenceProximityRadius โ†’ geofence.geofenceProximityRadius (default 1000m) geofenceInitialTriggerEntry โ†’ geofence.geofenceInitialTriggerEntry (default true)
  • ๐Ÿ†• geofence.geofenceModeKnockOut โ€” เด†เดฆเตเดฏ เดŽเด•เตเดธเดฟเดฑเตเดฑเดฟเดจเต เดถเต‡เดทเด‚ เดœเดฟเดฏเต‹เดซเต†เตปเดธเต เดธเตเดตเดฏเดฎเต‡เดต เดจเต€เด•เตเด•เด‚ เดšเต†เดฏเตเดฏเตเด• - เด’เดจเตเดจเต เดšเต†เดฏเตเดคเต!

เดธเตเดฅเดฟเดฐเดค โ†’ PersistenceConfig

Before โ†’ Tracelet โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ persistMode โ†’ persistence.persistMode (.all / .location / .geofence / .none) maxDaysToPersist โ†’ persistence.maxDaysToPersist (-1 = forever) maxRecordsToPersist โ†’ persistence.maxRecordsToPersist (-1 = unlimited) locationTemplate โ†’ persistence.locationTemplate (Mustache-style) geofenceTemplate โ†’ persistence.geofenceTemplate (Mustache-style) disableProviderChangeRecord โ†’ persistence.disableProviderChangeRecord extras โ†’ persistence.extras

เดฒเต‹เด—เดฟเด‚เด—เต โ†’ LoggerConfig

Before โ†’ Tracelet โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ logLevel (int const) โ†’ logger.logLevel (.verbose / .debug / .info / .warning / .error) logMaxDays โ†’ logger.logMaxDays (default 3) debug โ†’ logger.debug (alert sounds โ€” fun at demos, terrifying at 3 AM)

๐Ÿ” เด“เดกเดฟเดฑเตเดฑเต เดŸเตเดฐเดฏเตฝ โ†’ AuditConfig (เดŸเตเดฐเต‡เดธเตโ€Œเดฒเต†เดฑเตเดฑเต-เดŽเด•เตโ€Œเดธเตโ€Œเด•เตเดฒเต‚เดธเต€เดตเต)

  • audit.enabled โ€” เดธเตเดฅเดฟเดฐเดธเตเดฅเดฟเดคเดฟเดฏเดพเดฏเดฟ false. เดŽเดฒเตเดฒเดพ เดฒเตŠเด•เตเด•เต‡เดทเดจเดฟเดฒเตเด‚ SHA-256 เดนเดพเดทเต เดšเต†เดฏเดฟเตป โ€” เดŸเดพเด‚เดชเตผ = เดฌเดธเตเดฑเตเดฑเดกเต
  • audit.hashAlgorithm โ€” เดจเต‹เดŸเตเดŸเตเดŸเตเดฐเดพเตปเดธเต1เดฒเต‡เดฑเตเดฑเต
  • audit.includeExtrasInHash โ€” เดธเตเดฅเดฟเดฐเดธเตเดฅเดฟเดคเดฟเดฏเดพเดฏเดฟ false

๐Ÿ›ก๏ธ เดธเตเดตเด•เดพเดฐเตเดฏเดคเดพ เดฎเต‡เด–เดฒเด•เตพ โ†’ PrivacyZoneConfig (เดŸเตเดฐเต‡เดธเตโ€Œเดฒเต†เดฑเตเดฑเต-เดŽเด•เตโ€Œเดธเตโ€Œเด•เตเดฒเต‚เดธเต€เดตเต)

  • privacyZone.enabled โ€” เดธเตเดฅเดฟเดฐเดธเตเดฅเดฟเดคเดฟเดฏเดพเดฏเดฟ false. เดชเตเดฐเตˆเดตเดธเดฟ เดธเต‹เตบ เดŽเดžเตเดšเดฟเตป เดชเตเดฐเดตเตผเดคเตเดคเดจเด•เตเดทเดฎเดฎเดพเด•เตเด•เตเด•.

๐ŸŽฏ เด•เตƒเดคเตเดฏเดค เด•เต‹เตบเดธเตเดฑเตเดฑเตปเตเดฑเตเด•เตพ - เดŸเตˆเดชเตเดชเต เดšเต†เดฏเตเดค เดŽเดจเตเด•เตพ!

Before (int constants) โ†’ Tracelet (typed enum) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ Config.DESIRED_ACCURACY_NAVIGATION โ†’ DesiredAccuracy.high Config.DESIRED_ACCURACY_HIGH โ†’ DesiredAccuracy.high Config.DESIRED_ACCURACY_MEDIUM โ†’ DesiredAccuracy.medium Config.DESIRED_ACCURACY_LOW โ†’ DesiredAccuracy.low Config.DESIRED_ACCURACY_VERY_LOW โ†’ DesiredAccuracy.veryLow Config.DESIRED_ACCURACY_LOWEST โ†’ DesiredAccuracy.passive

๐Ÿ“ก เด‡เดตเตปเตเดฑเตเด•เตพ - เด’เดฐเต‡ เดชเต‡เดฐเตเด•เตพ, เด•เตเดฑเดšเตเดšเต เดŸเตˆเดชเตเดชเดฟเด‚เด—เต

เดŽเดฒเตเดฒเดพ 14 เด‡เดตเตปเตเดฑเต เดธเตเดŸเตเดฐเต€เดฎเตเด•เดณเตเด‚ 1:1 เดฎเดพเดชเตเดชเต. เดชเตเดฐเดฟเดซเดฟเด•เตโ€Œเดธเต เดธเตเดตเดพเดชเตเดชเต เดšเต†เดฏเตเดฏเตเด•:

Before โ†’ Tracelet Callback Type โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ onLocation(cb) โ†’ onLocation(cb) Location onMotionChange(cb) โ†’ onMotionChange(cb) Location onActivityChange(cb) โ†’ onActivityChange(cb) ActivityChangeEvent onProviderChange(cb) โ†’ onProviderChange(cb) ProviderChangeEvent onGeofence(cb) โ†’ onGeofence(cb) GeofenceEvent onGeofencesChange(cb) โ†’ onGeofencesChange(cb) GeofencesChangeEvent onHeartbeat(cb) โ†’ onHeartbeat(cb) HeartbeatEvent onHttp(cb) โ†’ onHttp(cb) HttpEvent onSchedule(cb) โ†’ onSchedule(cb) State onPowerSaveChange(cb) โ†’ onPowerSaveChange(cb) bool onConnectivityChange(cb) โ†’ onConnectivityChange(cb) ConnectivityChangeEvent onEnabledChange(cb) โ†’ onEnabledChange(cb) bool onNotificationAction(cb) โ†’ onNotificationAction(cb) String onAuthorization(cb) โ†’ onAuthorization(cb) AuthorizationEvent N/A โ†’ ๐Ÿ†• onTrip(cb) TripEvent (auto-detected trips!) N/A โ†’ ๐Ÿ†• onRemoteConfig(cb) Config (remote config applied) removeListeners() โ†’ removeListeners() Cancels all subscriptions
// Before โ€” so many characters... bg.BackgroundGeolocation.onLocation((bg.Location location) { print('[location] $location'); }); // After โ€” ahh, much better tl.Tracelet.onLocation((tl.Location location) { print('[location] $location'); });

๐Ÿ”ง เดฐเต€เดคเดฟเด•เตพ - เดธเดฎเตเดชเต‚เตผเดฃเตเดฃ เดฎเดพเดชเตเดชเดฟเด‚เด—เต

เดœเต€เดตเดฟเดค เดšเด•เตเดฐเด‚

Before โ†’ Tracelet โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ bg.BackgroundGeolocation.ready(cfg) โ†’ tl.Tracelet.ready(cfg) bg.BackgroundGeolocation.start() โ†’ tl.Tracelet.start() bg.BackgroundGeolocation.stop() โ†’ tl.Tracelet.stop() bg.BackgroundGeolocation.startGeofences() โ†’ tl.Tracelet.startGeofences() N/A โ†’ ๐Ÿ†• tl.Tracelet.startPeriodic() bg.BackgroundGeolocation.getState() โ†’ tl.Tracelet.getState() bg.BackgroundGeolocation.setConfig() โ†’ tl.Tracelet.setConfig() bg.BackgroundGeolocation.reset() โ†’ tl.Tracelet.reset() N/A โ†’ ๐Ÿ†• tl.Tracelet.getHealth()

เดธเตเดฅเดพเดจเด‚

Before โ†’ Tracelet โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ getCurrentPosition(...) โ†’ getCurrentPosition(...) same params: desiredAccuracy, timeout, maximumAge, persist, samples, extras N/A โ†’ ๐Ÿ†• getLastKnownLocation() โ€” zero battery cost! watchPosition(cb, ...) โ†’ watchPosition(cb, ...) โ€” returns watchId stopWatchPosition(id) โ†’ stopWatchPosition(id) changePace(isMoving) โ†’ changePace(isMoving) N/A โ†’ ๐Ÿ†• updateLocationProviderOptions() โ€” live accuracy/filter override, no pipeline restart getOdometer() โ†’ getOdometer() setOdometer(value) โ†’ setOdometer(value) resetOdometer() โ†’ setOdometer(0) โ€” one less method to remember

เดœเดฟเดฏเต‹เดซเต†เตปเดธเดฟเด‚เด—เต

Before โ†’ Tracelet โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ addGeofence(g) โ†’ addGeofence(g) addGeofences(list) โ†’ addGeofences(list) removeGeofence(id) โ†’ removeGeofence(id) removeGeofences() โ†’ removeGeofences() getGeofences() โ†’ getGeofences() N/A โ†’ ๐Ÿ†• getGeofence(id) โ€” get one without fetching all N/A โ†’ ๐Ÿ†• geofenceExists(id) โ€” quick existence check

เดธเตเดฅเดฟเดฐเดคเดฏเตเด‚ เดธเดฎเดจเตเดตเดฏเดตเตเด‚

Before โ†’ Tracelet โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ getLocations() โ†’ getLocations([SQLQuery?]) โ€” optional filtering! getCount() โ†’ getCount() destroyLocations() โ†’ destroyLocations() destroyLocation(uuid) โ†’ destroyLocation(uuid) insertLocation(params) โ†’ insertLocation(params) โ€” returns UUID sync() โ†’ sync()

เด…เดจเตเดฎเดคเดฟเด•เตพ โ€” เดฆเดฟเดตเดธเด™เตเด™เดณเต‹เดณเด‚ เดžเด™เตเด™เตพเด•เตเด•เต เดธเดนเดพเดฏเดฟเด•เดณเต† เดฒเดญเดฟเดšเตเดšเต

Before โ†’ Tracelet โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ requestPermission() โ†’ requestLocationAuthorization() N/A โ†’ ๐Ÿ†• getLocationAuthorization() N/A โ†’ ๐Ÿ†• hasBackgroundPermission (getter) N/A โ†’ ๐Ÿ†• getNotificationAuthorization() N/A โ†’ ๐Ÿ†• requestNotificationAuthorization() N/A โ†’ ๐Ÿ†• getMotionAuthorization() N/A โ†’ ๐Ÿ†• requestMotionAuthorization() N/A โ†’ ๐Ÿ†• requestTemporaryFullAccuracyAuthorization(purpose) โ€” iOS 14+ N/A โ†’ ๐Ÿ†• canScheduleExactAlarms() โ€” Android 12+ N/A โ†’ ๐Ÿ†• openExactAlarmSettings() N/A โ†’ ๐Ÿ†• openAppSettings() N/A โ†’ ๐Ÿ†• openLocationSettings() N/A โ†’ ๐Ÿ†• openBatterySettings() N/A โ†’ ๐Ÿ†• isIgnoringBatteryOptimizations()

เดฒเต‹เด—เดฟเด‚เด—เต

Before โ†’ Tracelet โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ getLog() โ†’ getLog([SQLQuery?]) โ€” optional filtering destroyLog() โ†’ destroyLog() emailLog(email) โ†’ emailLog(email) log(level, msg) โ†’ log(level, msg)

เดทเต†เดกเตเดฏเต‚เดณเดฟเด‚เด—เต, เดฌเดพเด•เตเด•เตเด—เตเดฐเต—เดฃเตเดŸเต เดŸเดพเดธเตเด•เตเด•เตเด•เตพ & เดนเต†เดกเตเดฒเต†เดธเตเดธเต

Before โ†’ Tracelet โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ startSchedule() โ†’ startSchedule() stopSchedule() โ†’ stopSchedule() startBackgroundTask() โ†’ startBackgroundTask() stopBackgroundTask(id) โ†’ stopBackgroundTask(id) registerHeadlessTask(cb) โ†’ registerHeadlessTask(cb)

เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟ

Before โ†’ Tracelet โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ getProviderState() โ†’ getProviderState() getSensors() โ†’ getSensors() getDeviceInfo() โ†’ getDeviceInfo() playSound(name) โ†’ playSound(name) isPowerSaveMode โ†’ isPowerSaveMode N/A โ†’ ๐Ÿ†• getSettingsHealth() โ€” detects OEM battery killers N/A โ†’ ๐Ÿ†• openOemSettings(label) โ€” opens OEM settings page N/A โ†’ ๐Ÿ†• requestSettings(action) N/A โ†’ ๐Ÿ†• showSettings(action)

๐Ÿ” เด“เดกเดฟเดฑเตเดฑเต เดŸเตเดฐเดฏเตฝ (เดŸเตเดฐเต‡เดธเตโ€Œเดฒเต†เดฑเตเดฑเต เดฎเดพเดคเตเดฐเด‚ - เดŽเตปเตเดฑเตผเดชเตเดฐเตˆเดธเต-เด—เตเดฐเต‡เดกเต เดธเดฎเด—เตเดฐเดค)

  • verifyAuditTrail() โ€” SHA-256 เดนเดพเดทเต เดšเต†เดฏเดฟเตป เดชเดฐเดฟเดถเต‹เดงเดฟเดšเตเดšเตเดฑเดชเตเดชเดฟเด•เตเด•เตเด• โ€” เดŽเดจเตเดคเต†เด™เตเด•เดฟเดฒเตเด‚ เด•เตƒเดคเตเดฐเดฟเดฎเด‚ เดจเดŸเดจเตเดจเดฟเดŸเตเดŸเตเดฃเตเดŸเต‹?
  • getAuditProof(uuid) - เด’เดฐเต เดจเดฟเตผเดฆเตเดฆเดฟเดทเตเดŸ เดฒเตŠเด•เตเด•เต‡เดทเตป เดฑเต†เด•เตเด•เต‹เตผเดกเดฟเดจเตเดณเตเดณ เด•เตเดฐเดฟเดชเตโ€Œเดฑเตเดฑเต‹เด—เตเดฐเดพเดซเดฟเด•เต เดคเต†เดณเดฟเดตเต

๐Ÿ›ก๏ธ เดธเตเดตเด•เดพเดฐเตเดฏเดคเดพ เดฎเต‡เด–เดฒเด•เตพ (เดŸเตเดฐเต‡เดธเตโ€Œเดฒเต†เดฑเตเดฑเต เดฎเดพเดคเตเดฐเด‚ - เดœเดฟเดกเดฟเดชเดฟเด†เตผ เดจเดจเตเดฆเดฟ เดชเดฑเดฏเตเดจเตเดจเต)

  • addPrivacyZone(zone) - เดชเตเดฐเดตเตผเดคเตเดคเดจเดคเตเดคเต‹เดŸเตเด•เต‚เดŸเดฟเดฏ เด’เดฐเต เดธเต‹เตบ เดšเต‡เตผเด•เตเด•เตเด•: เด’เดดเดฟเดตเดพเด•เตเด•เตเด• / เดคเดฐเด‚เดคเดพเดดเตเดคเตเดคเตเด• / เด‡เดตเตปเตเดฑเต-เดฎเดพเดคเตเดฐเด‚
  • เดจเต‹เดŸเตเดฐเดพเตปเดธเต0เดฒเต‡เดฑเตเดฑเต - เดฌเตพเด•เตเด•เต เด†เดกเต
  • removePrivacyZone(id) โ€” เดเดกเตปเตเดฑเดฟเดซเดฏเตผ เดตเดดเดฟ เดจเต€เด•เตเด•เด‚ เดšเต†เดฏเตเดฏเตเด•
  • removePrivacyZones() โ€” เดŽเดฒเตเดฒเดพเด‚ เดจเต€เด•เตเด•เด‚ เดšเต†เดฏเตเดฏเตเด•
  • getPrivacyZones() - เดŽเดฒเตเดฒเดพ เดธเต‹เดฃเตเด•เดณเตเด‚ เดฒเดฟเดธเตเดฑเตเดฑเตเดšเต†เดฏเตเดฏเตเด•

๐ŸŽ เดŸเตเดฐเต†เดฏเตโ€Œเดธเตโ€Œเดฒเต†เดฑเตเดฑเต-เดŽเด•เตโ€Œเดธเตโ€Œเด•เตเดฒเต‚เดธเต€เดตเต เดซเต€เดšเตเดšเดฑเตเด•เตพ

flutter_background_geolocation-เตฝ เดฒเดญเตเดฏเดฎเดฒเตเดฒเดพเดคเตเดค Tracelet-เตฝ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดฒเดญเดฟเด•เตเด•เตเดจเตเดจ เดธเดตเดฟเดถเต‡เดทเดคเด•เตพ:

  • เด†เดจเตเด•เดพเดฒเดฟเด• เดฎเต‹เดกเต โ€” Tracelet.startPeriodic() โ€” Work Manager เดตเดดเดฟ เด“เดฐเต‹ N เดฎเดฟเดจเดฟเดฑเตเดฑเดฟเดฒเตเด‚ GPS เดชเดฐเดฟเดนเดฐเดฟเด•เตเด•เตเดจเตเดจเต. เดซเต‹เตผเด—เตเดฐเต—เดฃเตเดŸเต เดธเตผเดตเต€เดธเต เด‡เดฒเตเดฒ, เด…เดฑเดฟเดฏเดฟเดชเตเดชเดฟเดฒเตเดฒ, เดฌเดพเดฑเตเดฑเดฑเดฟ เดกเตเดฐเต†เดฏเดฟเดจเดฟเดฒเตเดฒ.
  • เด•เตฝเดฎเดพเตป เดซเดฟเตฝเดŸเตเดŸเตผ โ€” geo.filter.useKalmanFilter: true โ€” 4-state EKF GPS เดถเดฌเตเดฆเดคเตเดคเต† เดธเตเด—เดฎเดฎเดพเด•เตเด•เตเดจเตเดจเต. เดจเดฟเด™เตเด™เดณเตเดŸเต† เดŸเตเดฐเดพเด•เตเด•เตเด•เตพ เดชเตเดฐเตŠเดซเดทเดฃเดฒเดพเดฏเดฟ เด•เดพเดฃเดชเตเดชเต†เดŸเตเดจเตเดจเต, เดฒเดนเดฐเดฟเดฏเดฟเดฒเดฒเตเดฒ.
  • เด…เดกเดพเดชเตเดฑเตเดฑเต€เดตเต เดธเดพเด‚เดชเตเดฒเดฟเด‚เด—เต โ€” geo.enableAdaptiveMode: true โ€” เด†เด•เตเดฑเตเดฑเดฟเดตเดฟเดฑเตเดฑเดฟ + เดฌเดพเดฑเตเดฑเดฑเดฟ + เดธเตเดชเต€เดกเต เด…เดŸเดฟเดธเตเดฅเดพเดจเดฎเดพเด•เตเด•เดฟ เดฆเต‚เดฐเด‚ เดซเดฟเตฝเดŸเตเดŸเตผ เดธเตเดตเดฏเดฎเต‡เดต เด•เตเดฐเดฎเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเต.
  • เดฎเต‹เด•เตเด•เต เดกเดฟเดฑเตเดฑเด•เตเดทเตป (3-เดฒเต†เดตเตฝ) โ€” geo.filter.mockDetectionLevel โ€” เดธเดพเดฑเตเดฑเดฒเตˆเดฑเตเดฑเต เด•เต—เดฃเตเดŸเต, เดคเดคเตเดธเดฎเดฏ เดกเตเดฐเดฟเดซเตเดฑเตเดฑเต, เดŸเตˆเด‚เดธเตเดฑเตเดฑเดพเดฎเตเดชเต เดตเดฟเดถเด•เดฒเดจเด‚ เดŽเดจเตเดจเดฟเดต เดตเดดเดฟ GPS เดธเตเดชเต‚เดซเดฟเด‚เด—เต เดชเดฟเดŸเดฟเด•เตเด•เตเดจเตเดจเต.
  • เดธเตเดตเด•เดพเดฐเตเดฏเดคเดพ เดฎเต‡เด–เดฒเด•เตพ - addPrivacyZone() - เดธเต†เตปเดธเดฟเดฑเตเดฑเต€เดตเต เดเดฐเดฟเดฏเด•เดณเดฟเตฝ เดŸเตเดฐเดพเด•เตเด•เดฟเด‚เด—เต เด’เดดเดฟเดตเดพเด•เตเด•เตเด•, เดคเดฐเด‚เดคเดพเดดเตเดคเตเดคเตเด• เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดชเดฐเดฟเดฎเดฟเดคเดชเตเดชเต†เดŸเตเดคเตเดคเตเด•. เด…เดจเตเดคเตผเดจเดฟเตผเดฎเตเดฎเดฟเดค GDPR เดชเดพเดฒเดฟเด•เตเด•เตฝ.
  • เด“เดกเดฟเดฑเตเดฑเต เดŸเตเดฐเดฏเตฝ โ€” verifyAuditTrail() โ€” SHA-256 เดนเดพเดทเต เดšเต†เดฏเดฟเตป. เดจเดฟเด™เตเด™เดณเตเดŸเต† เดฒเตŠเด•เตเด•เต‡เดทเตป เดกเดพเดฑเตเดฑเดฏเดฟเตฝ เด•เตƒเดคเตเดฐเดฟเดฎเด‚ เดจเดŸเดจเตเดจเดฟเดŸเตเดŸเดฟเดฒเตเดฒเต†เดจเตเดจเต เดคเต†เดณเดฟเดฏเดฟเด•เตเด•เตเด•.
  • เด†เดฐเต‹เด—เตเดฏ เดชเดฐเดฟเดถเต‹เดงเดจ โ€” getHealth() โ€” เด’เดฐเต เด•เต‹เตพ เดŽเดฒเตเดฒเดพเด‚ เดจเดฟเด™เตเด™เดณเต‹เดŸเต เดชเดฑเดฏเตเดจเตเดจเต: เด…เดจเตเดฎเดคเดฟเด•เตพ, GPS, เดฌเดพเดฑเตเดฑเดฑเดฟ, OEM เดชเตเดฐเดถเตเดจเด™เตเด™เตพ, 12 เดธเตเดตเดฏเดฎเต‡เดตเดฏเตเดณเตเดณ เดฎเตเดจเตเดจเดฑเดฟเดฏเดฟเดชเตเดชเตเด•เตพ.
  • OEM เด…เดจเตเดฏเต‹เดœเตเดฏเดค - getSettingsHealth() - Huawei, Xiaomi, Samsung, OPPO เดŽเดจเตเดจเดฟเดตเดฏเดฟเตฝ เด†เด•เตเดฐเดฎเดฃเดพเดคเตเดฎเด• เดฌเดพเดฑเตเดฑเดฑเดฟ เด•เดฟเดฒเตเดฒเดฑเตเด•เตพ เด•เดฃเตเดŸเต†เดคเตเดคเตเด•เดฏเตเด‚ เด…เดต เดŽเด™เตเด™เดจเต† เดชเดฐเดฟเดนเดฐเดฟเด•เตเด•เดพเดฎเต†เดจเตเดจเต เด‰เดชเดฏเต‹เด•เตเดคเดพเด•เตเด•เดณเต‹เดŸเต เดชเดฑเดฏเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต.
  • เดฏเดพเดคเตเดฐ เด•เดฃเตเดŸเต†เดคเตเดคเตฝ โ€” onTrip(cb) โ€” เดฆเต‚เดฐเด‚, เดฆเตˆเตผเด˜เตเดฏเด‚, เดตเดดเดฟ เดชเต‹เดฏเดฟเตปเตเดฑเตเด•เตพ, เดถเดฐเดพเดถเดฐเดฟ เดตเต‡เด—เดค เดŽเดจเตเดจเดฟเดตเดฏเตเดณเตเดณ เดฏเดพเดคเตเดฐเด•เตพ เดธเตเดตเดฏเดฎเต‡เดต เด•เดฃเตเดŸเต†เดคเตเดคเตเดจเตเดจเต.
  • เดชเต‹เดณเดฟเด—เต‹เตบ เดœเดฟเดฏเต‹เดซเต†เตปเดธเตเด•เตพ โ€” Geofence(vertices: [...]) โ€” เดธเตผเด•เตเด•เดฟเดณเตเด•เตพ เดฎเดพเดคเตเดฐเดฎเดฒเตเดฒ. เดฑเต‡-เด•เดพเดธเตเดฑเตเดฑเดฟเด‚เด—เต เดชเต‹เดณเดฟเด—เต‹เตบ เดชเดฟเดจเตเดคเตเดฃ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดเดคเต เด†เด•เตƒเดคเดฟเดฏเตเด‚ เดตเดฐเดฏเตเด•เตเด•เตเด•.
  • เดœเดฟเดฏเต‹เดซเต†เตปเดธเต เดจเต‹เด•เตเด•เต—เดŸเตเดŸเต โ€” geofence.geofenceModeKnockOut โ€” เด†เดฆเตเดฏ เดŽเด•เตเดธเดฟเดฑเตเดฑเดฟเดจเต เดถเต‡เดทเด‚ เดœเดฟเดฏเต‹เดซเต†เตปเดธเต เดธเตเดตเดฏเดฎเต‡เดต เดจเต€เด•เตเด•เด‚เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เด’เดฑเตเดฑเดคเตเดคเดตเดฃ เด…เดฒเต‡เตผเดŸเตเดŸเตเด•เตพเด•เตเด•เต เด…เดจเตเดฏเต‹เดœเตเดฏเดฎเดพเดฃเต.
  • เดœเดฟเดฏเต‹เดซเต†เตปเดธเต เดฒเตเด•เตเด•เตเด…เดชเตเดชเต โ€” getGeofence(id) โ€” เด…เดตเดฏเต†เดฒเตเดฒเดพเด‚ เดฒเต‹เดกเต เดšเต†เดฏเตเดฏเดพเดคเต† เด’เดฐเตŠเดฑเตเดฑ เดœเดฟเดฏเต‹เดซเต†เตปเดธเต เด…เดจเตเดตเต‡เดทเดฟเด•เตเด•เตเด•.
  • เด…เดจเตเดฎเดคเดฟ เดธเดนเดพเดฏเดฟเด•เตพ โ€” openAppSettings(), openBatterySettings() โ€” เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เตเดฐเดฎเต€เด•เดฐเดฃเด™เตเด™เดณเดฟเดฒเต‡เด•เตเด•เต เดจเต‡เดฐเดฟเดŸเตเดŸเต เด†เดดเดคเตเดคเดฟเดฒเตเดณเตเดณ เดฒเดฟเด™เตเด•เตเด•เตพ.
  • เดธเตเดฎเดพเตผเดŸเตเดŸเต เดตเต€เดฃเตเดŸเตเด‚ เดถเตเดฐเดฎเดฟเด•เตเด•เตเดจเตเดจเต โ€” http.maxRetries + backoff โ€” เดตเดฟเดฑเดฏเดฒเต‹เดŸเต†เดฏเตเดณเตเดณ เดŽเด•เตโ€Œเดธเตโ€Œเดชเต‹เดฃเตปเดทเตเดฏเตฝ เดฌเดพเด•เตเด•เตเด“เดซเต. เดจเดฟเด™เตเด™เดณเตเดŸเต† เดธเต†เตผเดตเตผ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดจเดจเตเดฆเดฟ เดชเดฑเดฏเตเด‚.
  • Wi-Fi-เดฎเดพเดคเตเดฐเด‚ เดธเดฎเดจเตเดตเดฏเด‚ โ€” http.disableAutoSyncOnCellular โ€” เดฎเตŠเดฌเตˆเตฝ เดกเดพเดฑเตเดฑ เดธเด‚เดฐเด•เตเดทเดฟเด•เตเด•เตเด•, เดตเตˆเดซเตˆเดฏเดฟเตฝ เดฎเดพเดคเตเดฐเด‚ เดธเดฎเดจเตเดตเดฏเดฟเดชเตเดชเดฟเด•เตเด•เตเด•.
  • เด†เด•เตเดธเดฟเดฒเดฑเต‹เดฎเต€เดฑเตเดฑเตผ เดฎเดพเดคเตเดฐเดฎเตเดณเตเดณ เดšเดฒเดจเด‚ โ€” motion.shakeThreshold โ€” เดชเตเดฐเดตเตผเดคเตเดคเดจ เดคเดฟเดฐเดฟเดšเตเดšเดฑเดฟเดฏเตฝ เด…เดจเตเดฎเดคเดฟเดฏเดฟเดฒเตเดฒเดพเดคเต† เดšเดฒเดจเด‚ เด•เดฃเตเดŸเต†เดคเตเดคเตเด•. เดชเต‚เดœเตเดฏเด‚ เด…เดจเตเดฎเดคเดฟ เดชเต‹เดชเตเดชเตเด…เดชเตเดชเต.
  • เดตเต†เดฌเต เดชเดฟเดจเตเดคเตเดฃ โ€” เด…เดคเต‡ เดกเดพเตผเดŸเตเดŸเต เดŽเดชเดฟเด เดซเต‹เตผเด—เตเดฐเต—เดฃเตเดŸเต (เด‡เตป-เดŸเดพเดฌเต) เดŸเตเดฐเดพเด•เตเด•เดฟเด‚เด—เดฟเดจเดพเดฏเดฟ เดฌเตเดฐเต—เดธเดฑเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเต. เดชเดถเตเดšเดพเดคเตเดคเดฒ เดŸเตเดฐเดพเด•เตเด•เดฟเด‚เด—เตเด‚ เดจเดฟเดฐเดตเดงเดฟ เดชเตเดฐเดพเดฆเต‡เดถเดฟเด• เดธเดตเดฟเดถเต‡เดทเดคเด•เดณเตเด‚ เดฒเดญเตเดฏเดฎเดฒเตเดฒ - เดตเต†เดฌเต เดชเดฟเดจเตเดคเตเดฃ เด•เดพเดฃเตเด•.

๐Ÿคท เดธเดตเดฟเดถเต‡เดทเดคเด•เตพ เด‡เดคเตเดตเดฐเต† Tracelet-เตฝ เด‡เดฒเตเดฒ

เดฎเตเดฎเตเดชเดคเตเดคเต† เดชเตเดฒเด—เดฟเดจเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เด•เตเดฑเดšเตเดšเต เดธเดตเดฟเดถเต‡เดทเดคเด•เตพ เด‡เดคเตเดตเดฐเต† เดฒเดญเตเดฏเดฎเดฒเตเดฒ. เด…เดต เด’เดจเตเดจเตเด•เดฟเตฝ เด†เดธเต‚เดคเตเดฐเดฃเด‚ เดšเต†เดฏเตเดคเดคเต‹ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดŽเดณเตเดชเตเดชเดคเตเดคเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเดคเต‹ เด†เดฃเต:

  • เดธเต†เตผเดตเตผ เดธเตˆเดกเต เดœเดฟเดฏเต‹เดซเต†เตปเดธเต เดธเดฎเดจเตเดตเดฏเด‚ โ€” เด†เดธเต‚เดคเตเดฐเดฃเด‚ เดšเต†เดฏเตโ€Œเดคเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต. เด‡เดชเตเดชเต‹เตพ, เดจเดฟเด™เตเด™เดณเตเดŸเต† API-เดฏเดฟเตฝ เดจเดฟเดจเตเดจเต เดŽเดŸเตเดคเตเดคเต addGeofences()-เดฒเต‡เด•เตเด•เต เดตเดฟเดณเดฟเด•เตเด•เตเด•.
  • locationTemplate เด‡เตปเตเดฑเตผเดชเต‹เดณเต‡เดทเตป โ€” เดชเตเดฐเด–เตเดฏเดพเดชเดฟเดšเตเดšเต, เดตเดฏเตผ เดšเต†เดฏเตเดคเดฟเดŸเตเดŸเดฟเดฒเตเดฒ. onLocation เด•เต‹เตพเดฌเดพเด•เตเด•เดฟเตฝ เดชเดฐเดฟเดตเตผเดคเตเดคเดจเด‚ เดšเต†เดฏเตเดฏเตเด• เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ http.extras เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด•.
  • JWT เด“เดŸเตเดŸเต‹-เดฑเดฟเดซเตเดฐเดทเต โ€” เดชเตเดฐเด–เตเดฏเดพเดชเดฟเดšเตเดšเต, เดตเดฏเตผ เดšเต†เดฏเตโ€ŒเดคเดฟเดŸเตเดŸเดฟเดฒเตเดฒ. http.headers เดธเตเดตเดฎเต‡เดงเดฏเดพ เดธเดœเตเดœเดฎเดพเด•เตเด•เตเด•; onAuthorization เด•เต‡เตพเด•เตเด•เตเด•.
  • เดกเต†เดฎเต‹ เดธเต†เตผเดตเตผ - เด†เดธเต‚เดคเตเดฐเดฃเด‚ เดšเต†เดฏเตเดคเดฟเดŸเตเดŸเดฟเดฒเตเดฒ. เดจเดฟเด™เตเด™เดณเตเดŸเต† เดธเตเดตเดจเตเดคเด‚ เดฌเดพเด•เตเด•เต†เตปเดกเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด• - เดเดคเต†เด™เตเด•เดฟเดฒเตเด‚ REST เดŽเตปเดกเตโ€Œเดชเต‹เดฏเดฟเตปเตเดฑเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเต.
  • เดฒเตˆเดธเตปเดธเต เด•เต€ เดธเดœเต€เดตเดฎเดพเด•เตเด•เตฝ โ€” ๐ŸŽ‰ เด†เดตเดถเตเดฏเดฎเดฟเดฒเตเดฒ! เด‡เดคเต เด“เดชเตเดชเตบ เดธเต‹เดดเตโ€Œเดธเดพเดฃเต.

๐Ÿ› ๏ธ เด˜เดŸเตเดŸเด‚ เด˜เดŸเตเดŸเดฎเดพเดฏเตเดณเตเดณ เดฎเตˆเด—เตเดฐเต‡เดทเตป

เด˜เดŸเตเดŸเด‚ 1: pubspec.yaml เด…เดชเตโ€Œเดกเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเด•

dependencies: tracelet: ^3.6.14

flutter_background_geolocation เด‰เด‚ เดเดคเต†เด™เตเด•เดฟเดฒเตเด‚ เดฒเตˆเดธเตปเดธเต เด•เต€ เดชเดพเด•เตเด•เต‡เดœเตเด•เดณเตเด‚ เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เตเด•. เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด…เดต เด‡เดจเดฟ เด†เดตเดถเตเดฏเดฎเดฟเดฒเตเดฒ!

เด˜เดŸเตเดŸเด‚ 2: Android เดธเดœเตเดœเต€เด•เดฐเดฃเด‚

INSTALL-ANDROID.mdย  เด•เดพเดฃเตเด•. เดชเตเดฐเดงเดพเดจ เดตเตเดฏเดคเตเดฏเดพเดธเด™เตเด™เตพ:

  • เด“เดชเตโ€Œเดทเดฃเตฝ เดกเดฟเดชเตปเดกเตปเดธเดฟเด•เตพ โ€” ๐Ÿ†• เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด‰เดฏเตผเดจเตเดจ เด•เตƒเดคเตเดฏเดคเดฏเตเดณเตเดณ เดœเดฟเดŽเด‚เดŽเดธเต เดŸเตเดฐเดพเด•เตเด•เดฟเด‚เด—เต เดตเต‡เดฃเดฎเต†เด™เตเด•เดฟเตฝ play-services-location เดŽเดจเตเดจเต เดจเดฟเด™เตเด™เดณเตเดŸเต† build.gradle-เดฒเต‡เด•เตเด•เต เดตเตเดฏเด•เตเดคเดฎเดพเดฏเดฟ เดšเต‡เตผเด•เตเด•เดพเตป เดŸเตเดฐเต‡เดธเตโ€Œเดฒเต†เดฑเตเดฑเต 2.0.0+ เด†เดตเดถเตเดฏเดชเตเดชเต†เดŸเตเดจเตเดจเต. เด…เดฒเตเดฒเดพเดคเตเดคเดชเด•เตเดทเด‚, เด…เดคเต เดธเดพเดงเดพเดฐเดฃ AOSP GPS-เดฒเต‡เด•เตเด•เต เดฎเดŸเด™เตเด™เตเดจเตเดจเต.
  • เดฒเตˆเดธเตปเดธเต เด•เต€ เด‡เดฒเตเดฒ โ€” AndroidManifest.xml เตฝ เดจเดฟเดจเตเดจเต เดเดคเต†เด™เตเด•เดฟเดฒเตเด‚ BackgroundGeolocation.org เด•เต‹เตบเดซเดฟเด—เต‡เดทเตป เดจเต€เด•เตเด•เด‚ เดšเต†เดฏเตเดฏเตเด•
  • เด…เดจเตเดฎเดคเดฟเด•เตพ โ€” Gradle เดตเดดเดฟ เดธเตเดตเดฏเดฎเต‡เดต เดฒเดฏเดฟเดชเตเดชเดฟเดšเตเดšเต, เดจเดฟเด™เตเด™เตพ เด…เดต เดชเตเดฐเด–เตเดฏเดพเดชเดฟเด•เตเด•เดฐเตเดคเต
  • minSdkVersion โ€” API 21+ (เดฎเตเดฎเตเดชเดคเตเดคเต† เดชเต‹เดฒเต†)
  • เด•เต‹เดŸเตเดฒเดฟเตป โ€” เดŽเดฒเตเดฒเดพ เดจเต‡เดฑเตเดฑเต€เดตเต เด•เต‹เดกเตเด‚ เด•เต‹เดŸเตเดฒเดฟเตป เด†เดฃเต

เด˜เดŸเตเดŸเด‚ 3: iOS เดธเดœเตเดœเต€เด•เดฐเดฃเด‚

INSTALL-IOS.mdย  เด•เดพเดฃเตเด•. เดชเตเดฐเดงเดพเดจ เดตเตเดฏเดคเตเดฏเดพเดธเด™เตเด™เตพ:

  • เดฒเตˆเดธเตปเดธเต เด•เต€ เด‡เดฒเตเดฒ โ€” เดฎเตเดฎเตเดชเดคเตเดคเต† เดชเตเดฒเด—เดฟเตปเตเดฑเต† เดชเตเดฒเดฟเดธเตเดฑเตเดฑเต เดŽเตปเดŸเตเดฐเดฟเด•เตพ เดจเต€เด•เตเด•เด‚ เดšเต†เดฏเตเดฏเตเด•
  • เดชเดถเตเดšเดพเดคเตเดคเดฒ เดฎเต‹เดกเตเด•เตพ โ€” เด…เดคเต‡: เดฒเตŠเด•เตเด•เต‡เดทเตป เด…เดชเตโ€Œเดกเต‡เดฑเตเดฑเตเด•เตพ, เดชเดถเตเดšเดพเดคเตเดคเดฒเด‚ เดฒเดญเตเดฏเดฎเดพเด•เตเด•เตฝ, เดฑเดฟเดฎเต‹เดŸเตเดŸเต เด…เดฑเดฟเดฏเดฟเดชเตเดชเตเด•เตพ
  • Info.plist โ€” เด…เดคเต‡ เด‰เดชเดฏเต‹เด— เดตเดฟเดตเดฐเดฃ เด•เต€เด•เตพ (NSLocationAlwaysAndWhenInUseUsageDescription, เดฎเตเดคเดฒเดพเดฏเดต)
  • Podfile โ€” เดฎเตเดฎเตเดชเดคเตเดคเต† เดชเตเดฒเด—เดฟเตปเตเดฑเต† เดชเต‹เดกเต เด‰เดฑเดตเดฟเดŸเด™เตเด™เตพ เดจเต€เด•เตเด•เด‚ เดšเต†เดฏเตเดฏเตเด•

เด˜เดŸเตเดŸเด‚ 4: เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เด…เดชเตเดกเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเด•

เดจเดฟเด™เตเด™เดณเตเดŸเต† เดซเตเดฒเดพเดฑเตเดฑเต Config() โ†’ เดธเด‚เดฏเตเด•เตเดคเด‚ Config() เดฐเต‚เดชเดพเดจเตเดคเดฐเดชเตเดชเต†เดŸเตเดคเตเดคเตเด•. เดฎเตเด•เดณเดฟเดฒเตเดณเตเดณ เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป: เดซเตเดฒเดพเดฑเตเดฑเดฟเตฝ เดจเดฟเดจเตเดจเต เด˜เดŸเดจเดฏเดฟเดฒเต‡เด•เตเด•เต เดตเดฟเดญเดพเด—เด‚ เด•เดพเดฃเตเด•.

เด˜เดŸเตเดŸเด‚ 5: เด‡เดตเตปเตเดฑเต เดถเตเดฐเต‹เดคเดพเด•เตเด•เดณเต† เด…เดชเตโ€Œเดกเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเด•

bg.BackgroundGeolocation.onXxx โ†’ tl.Tracelet.onXxx เด•เดฃเตเดŸเต†เดคเตเดคเดฟ เดฎเดพเดฑเตเดฑเดฟเดธเตเดฅเดพเดชเดฟเด•เตเด•เตเด•:

// Before bg.BackgroundGeolocation.onLocation((bg.Location location) { print('[location] $location'); }); // After tl.Tracelet.onLocation((tl.Location location) { print('[location] $location'); });

เด˜เดŸเตเดŸเด‚ 6: เดฒเตˆเดซเต เดธเตˆเด•เตเด•เดฟเตพ เด•เต‹เดณเตเด•เตพ เด…เดชเตโ€Œเดกเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเด•

// Before bg.BackgroundGeolocation.ready(config).then((bg.State state) { if (!state.enabled) bg.BackgroundGeolocation.start(); }); // After tl.Tracelet.ready(config).then((tl.State state) { if (!state.enabled) tl.Tracelet.start(); });

เด˜เดŸเตเดŸเด‚ 7: เดนเต†เดกเตโ€Œเดฒเต†เดธเต เดŸเดพเดธเตโ€Œเด•เต เด…เดชเตโ€Œเดกเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเด•

// Before @pragma('vm:entry-point') void backgroundGeolocationHeadlessTask(bg.HeadlessEvent event) async { switch (event.name) { case bg.Event.LOCATION: bg.Location location = event.event; break; } } void main() { bg.BackgroundGeolocation.registerHeadlessTask(backgroundGeolocationHeadlessTask); runApp(MyApp()); } // After โ€” shorter function name is a bonus ๐Ÿ˜Ž @pragma('vm:entry-point') void headlessTask(tl.HeadlessEvent event) async { switch (event.name) { case 'location': tl.Location location = event.event as tl.Location; break; } } void main() { tl.Tracelet.registerHeadlessTask(headlessTask); runApp(MyApp()); }

๐Ÿ“ฆ HTTP เดชเต‡เดฒเต‹เดกเต: เดชเดพเดฎเตเดชเต_เด•เต‡เดธเต โ†’ เด’เดŸเตเดŸเด•เด‚

เดฎเตเดจเตเดจเดฑเดฟเดฏเดฟเดชเตเดชเต, เดฌเดพเด•เตเด•เต†เตปเดกเต เดกเต†เดตเดฒเดชเตโ€Œเดฎเต†เตปเตเดฑเต! เดจเดฟเด™เตเด™เดณเตเดŸเต† เดธเต†เตผเดตเดฑเดฟเตฝ เด…เดชเตโ€Œเดกเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸ เด’เดฐเต เด•เดพเดฐเตเดฏเด‚.

flutter_background_geolocation เด‡เดคเต เด…เดฏเดฏเตเด•เตเด•เตเดจเตเดจเต:

{ "location": { "coords": { "latitude": 37.42, "longitude": -122.08, "accuracy": 12.3 }, "timestamp": "2026-03-06T10:30:00.000Z", "is_moving": true, "uuid": "abc-123", "odometer": 1234.5, "activity": { "type": "walking", "confidence": 85 }, "battery": { "level": 0.72, "is_charging": false }, "extras": { "custom_key": "custom_value" } } }

เดŸเตเดฐเต‡เดธเตเดฒเต†เดฑเตเดฑเต เด‡เดคเต เด…เดฏเดฏเตเด•เตเด•เตเดจเตเดจเต:

{ "location": { "coords": { "latitude": 37.42, "longitude": -122.08, "accuracy": 12.3 }, "timestamp": "2026-03-06T10:30:00.000Z", "isMoving": true, "uuid": "abc-123", "odometer": 1234.5, "isMock": false, "activity": { "type": "walking", "confidence": 85 }, "battery": { "level": 0.72, "isCharging": false }, "extras": { "custom_key": "custom_value" } } }

TL;DR: is_moving โ†’ isMoving, is_charging โ†’ isCharging, เด•เต‚เดŸเดพเดคเต† เด’เดฐเต เดชเตเดคเดฟเดฏ isMock เดซเต€เตฝเดกเตเด‚. เดจเดฟเด™เตเด™เดณเตเดŸเต† JSON เดชเดพเดดเตโ€Œเดธเดฟเด‚เด—เต เด…เดชเตโ€Œเดกเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเด•, เดจเดฟเด™เตเด™เตพ เดธเตเดตเตผเดฃเตเดฃเดฎเดพเดฃเต.


๐Ÿšจ เด•เต‹เดฎเตบ เด—เต‹เดšเตเดšเด•เตพ

เด‡เดคเต เด•เด เดฟเดจเดฎเดพเดฏ เดฐเต€เดคเดฟเดฏเดฟเตฝ เดชเด เดฟเด•เตเด•เดฐเตเดคเต - เดžเด™เตเด™เตพ เด‡เดคเดฟเดจเด•เด‚ เดšเต†เดฏเตเดคเต:

  • Config เด‡เดชเตเดชเต‹เตพ เดธเด‚เดฏเตเด•เตเดคเดฎเดพเดฃเต โ€” GeoConfig(...), AppConfig(...), HttpConfig(...) เดฎเตเดคเดฒเดพเดฏเดตเดฏเดฟเตฝ เดซเต€เตฝเดกเตเด•เตพ เดชเตŠเดคเดฟเดฏเตเด•.
  • desiredAccuracy: -1 เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒ โ€” DesiredAccuracy.high เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด• โ€” เดŸเตˆเดชเตเดชเต เดšเต†เดฏเตเดค enums, เดฎเดพเดœเดฟเด•เต เดจเดฎเตเดชเดฑเตเด•เดณเดฒเตเดฒ
  • logLevel: 5 เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒ โ€” LogLevel.verbose เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด•
  • resetOdometer() เด•เดฃเตเดŸเต†เดคเตเดคเดพเดจเดพเดฏเดฟเดฒเตเดฒ โ€” เด‡เดคเต เด‡เดชเตเดชเต‹เตพ setOdometer(0) เด†เดฃเต
  • notification: เดชเตเดฐเต‹เดชเตเดชเตผเดŸเตเดŸเดฟ เดชเต‹เดฏเดฟ โ€” เด‡เดคเต foregroundService: ForegroundServiceConfig(...) เด‰เดณเตเดณเดฟเตฝ android: (AndroidConfig), app เด…เดฒเตเดฒ
  • scheduleUseAlarmManager AppConfig-เตฝ เด‡เดฒเตเดฒ โ€” เด‡เดคเต เด‡เดชเตเดชเต‹เตพ android.scheduleUseAlarmManager เด†เดฃเต
  • preventSuspend AppConfig-เตฝ เด‡เดฒเตเดฒ โ€” เด‡เดคเต เด‡เดชเตเดชเต‹เตพ ios.preventSuspend เด†เดฃเต
  • เดฌเดพเด•เตเด•เต†เตปเดกเดฟเดจเต is_moving เดชเดพเดดเตโ€Œเดธเต เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเดฟเดฒเตเดฒ โ€” เด‡เดคเต เด‡เดชเตเดชเต‹เตพ isMoving เด†เดฃเต (camelCase)
  • เด‡เดชเตเดชเต‹เดดเตเด‚ เดฒเตˆเดธเตปเดธเต เด•เต€ เด•เต‹เดกเต เด‰เดฃเตเดŸเต‹? - เด…เดคเต เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เตเด• - เดŸเตเดฐเต‡เดธเตโ€Œเดฒเต†เดฑเตเดฑเดฟเดจเต เด’เดฐเต†เดฃเตเดฃเด‚ เด†เดตเดถเตเดฏเดฎเดฟเดฒเตเดฒ
  • State เดชเตเดฐเต‹เดชเตเดชเตผเดŸเตเดŸเดฟเด•เตพ เดตเตเดฏเดคเตเดฏเดธเตเดคเดฎเดพเดฏเดฟ เด•เดพเดฃเดชเตเดชเต†เดŸเตเดจเตเดจเต โ€” API เดฑเดซเดฑเตปเดธเตย  เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเด•
  • HeadlessEvent.event เดคเดฐเด‚ เดชเดฟเดถเด•เตเด•เตพ โ€” เด‡เดคเต เด•เดพเดธเตเดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเด•: event.event as tl.Location

๐Ÿ“š เด•เต‚เดŸเตเดคเตฝ เดตเดฟเดญเดตเด™เตเด™เตพ


เด“เดชเตเดชเตบ เดธเต‹เดดเตโ€Œเดธเต เดญเดพเด—เดคเตเดคเต‡เด•เตเด•เต เดธเตเดตเดพเด—เดคเด‚. เดžเด™เตเด™เตพเด•เตเด•เต เด•เตเด•เตเด•เดฟเด•เดณเตเดฃเตเดŸเต. ๐Ÿช