What's Fixed
- iOS: DartWorker works in debug / integration-test mode —
FlutterCallbackCachereturns nil in JIT builds; fixed by routing through the existing main method channel instead of a secondary engine. All iOS integration tests now pass. - iOS: DartWorker callback input correctly decoded — input was wrapped as
{'raw': '...'}instead of the actual decoded map; callbacks now receive{'key': 'value'}as expected. - iOS: False disk-space failure on small downloads — removed the fixed 50 MB constant from
hasEnoughDiskSpace(); formula now matches Android:requiredBytes × 1.2. - iOS: Chain cancel handle stored before execution —
handleEnqueueChainnow stores the Task handle inactiveTasksbefore starting, socancel()finds it correctly. - iOS: Chain enqueue was blocking — returns
"ACCEPTED"immediately; result delivered via EventChannel. - iOS: Data race on
taskStartTimes— all reads/writes now usestateQueuewith.barrierwrites. - Android: Hot restart skipped Koin reload —
isKoinInitializednow reset inonDetachedFromEngine(). - Android: Path traversal hardened — replaced
contains("..")withFile.canonicalPathacross all 7 workers. - Android:
HttpDownloadWorkernull body NPE —response.body!!replaced with explicit null check. - Dart:
TaskEventnull-safety — replaced unsafe casts with null-safe fallbacks. - Dart:
TaskEvent.operator==ignoredmessage— fixed equality to includemessagefield. - README: API examples corrected — all 9 code sample inaccuracies fixed against the actual Dart API.
Version Alignment
pubspec.yaml, native_workmanager.podspec, and android/build.gradle all set to 1.0.8.