NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev · #1242 most downloaded on pub.dev
Periodic callbacks in the background for both iOS and Android. Includes Android Headless implementation.
Last release 4 months ago
25 May 2026
Release timing varies
gaps range from 1 weeks to 6 months
Nearly every release is documented
notes for 49 of 54 stable releases
Nothing withdrawn
no release was ever pulled
8 years old
58 releases · first in 2018
[iOS] Adopt FlutterSceneLifeCycleDelegate for Flutter 3.41 UIScene lifecycle support.
FlutterSceneLifeCycleDelegate for Flutter 3.41 UIScene lifecycle support.>=3.38.0.[Android] Fix MissingPluginException on com.transistorsoft/flutter_background_fetch/methods after app relaunch when a foreground service kept the proc
MissingPluginException on com.transistorsoft/flutter_background_fetch/methods after app relaunch when a foreground service kept the process alive post-termination. HeadlessTask now destroys its background FlutterEngine when the main Activity re-attaches, and BackgroundFetchModule tracks method channels per-BinaryMessenger so destroying one engine (e.g. a sibling plugin's headless isolate) no longer strips the handler from another engine's channel.One column per quarter.
[iOS] Migrate /example to Flutter 3.41 UIScene lifecycle (adopt FlutterImplicitEngineDelegate, register plugins via didInitializeImplicitFlutterEngine
/example to Flutter 3.41 UIScene lifecycle (adopt FlutterImplicitEngineDelegate, register plugins via didInitializeImplicitFlutterEngine:, add UIApplicationSceneManifest with FlutterSceneDelegate). TSBackgroundFetch 4.1's +load auto-registers BGTask launch handlers before the BGTaskScheduler deadline, which is required for UIScene apps where the plugin's application:didFinishLaunchingWithOptions: is delivered too late via Flutter's scene fallback.[Changed] Renamed HeadlessTask class to HeadlessEvent to align with TypeScript API. A typedef HeadlessTask = HeadlessEvent alias is provided for backw
HeadlessTask class to HeadlessEvent to align with TypeScript API. A typedef HeadlessTask = HeadlessEvent alias is provided for backwards compatibility.Add CLAUDE.md with SDK architecture, build commands, and conventions
Both the plugin's iOS and Android core libs (TSBackgroundFetch.xcframework, tsbackgroundfetch.aar) are now published to Cocoapods, Swift Package Manag
TSBackgroundFetch.xcframework, tsbackgroundfetch.aar) are now published to Cocoapods, Swift Package Manager and Sonatype for android. This is especially wonderful for android, as now there's no more need of the custom maven url in the root build.gradle.[iOS] Add Swift Package Manager support
[Android] Update gradle config. Default compileSdkVersion 34
Merge branch 'remove-unused-imports'
Merge branch 'remove-unused-imports'
Merge branch 'update-android-dependencies'
Merge branch 'update-android-dependencies'
appcompat.androidx.lifecycle:lifecycle-runtime version to 2.7.0.@NonNull annotations to flutter plugin methods.multidex in Android /example.Merge branch 'release-1.3.5'
Merge branch 'release-1.3.5'
Change return-type of BackgroundFetch.finish from void to Future .
BackgroundFetch.finish from void to Future<void>.Merge branch 'codesign'
Merge branch 'codesign'
TSBackgroundFetch.xcframework with new Apple Organization (9224-2932 Quebec Inc) certificate.Merge branch 'PrivacyInfo'
Merge branch 'PrivacyInfo'
TSBackgroundFetch.xcframework.PrivacyInfo.xcprivacy into .podfile config.[iOS] Move PrivacyInfo -> TSBackgroundFetch.xcframework.
PrivacyInfo -> TSBackgroundFetch.xcframework.Merge branch 'PrivacyInfo'
Merge branch 'PrivacyInfo'
Merge branch 'release-1.2.4'
Merge branch 'release-1.2.4'
[iOS] ensure scheduleTask callback is executed on main-thread.
scheduleTask callback is executed on main-thread.flutter >= 3.19.0 (New Android Architecture).[Android] Remove deprecated registerWith V1 flutter plugin architecture.
BGProcessingTasks (Permitted background task scheduler identifiers) in Info.plist which are prefixed with com.transistorsoft. Any other task identifier will be ignored.registerWith V1 flutter plugin architecture.[Android] Detect and dispose of duplicate events. Android JobService has a bug for devices running <= Android M where multiple backgrou nd-fetch event
JobService has a bug for devices running <= Android M where multiple backgrou nd-fetch events could fire within the same second.[Android] Android 14 (SDK 34) support..
forceAlarmManager: true, you must now optionally add the permission android.permission.SCHEDULE_EXACT_ALARM to your AndroidManifest to schedule exact alarms. Otherwise AlarmManager will use in-exact alarms.
:open_file_folder: AndroidManifest. NOTE You must include the permission exactly as-shown with android:minSdkVersion="34".<manifest>
<!-- [background-fetch] OPTIONAL: allows forceAlarmManager: true to use exact alarms -->
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" android:maxSdkVersion="33" />
.
.
.
</manifest>
flutter run with screen off where plugin incorrectly detects the app is headless.[Android] Gradle v8 now requires namespace attribute in gradle files.
namespace attribute in gradle files.[Android] Fix NPE in mEventChannelTask in certain situations. See #322.
mEventChannelTask in certain situations. See #322.[Android] [Fix] Add a null-check in didDetachFromEngine, fixing a reported null-pointer exception.
adb shell.[Android] Fix error FlutterJNI was detached from native C++ when Android back button is pressed. In this case, Flutter detaches the MainActivity from
FlutterJNI was detached from native C++ when Android back button is pressed. In this case, Flutter detaches the MainActivity from the app and headless-mode was not being detected.[Android] add @pragma('vm:entry-point') to lib's _headlessCallbackDispatcher, required for *release* builds on Flutter >= 3.3.0.
@pragma('vm:entry-point') to lib's _headlessCallbackDispatcher, required for release builds on Flutter >= 3.3.0.[Android] Use LifecycleManager for modern headless-detection instead of legacy mechanism requiring permission GET_TASKS.
LifecycleManager for modern headless-detection instead of legacy mechanism requiring permission GET_TASKS.[iOS] Fix type-error when .start() raises an error
[Fixed][Android] Fix typo related to requiredNetworkType, causing null pointer error.
[Changed][Android] Remove deprectated jcenter repository. Replaced with mavenCentral.
jcenter repository. Replaced with mavenCentral.[Changed][Android] Allow multiple calls to .configure to allow re-configuring the fetch task. Existing task will be cancelled and a new periodic fetch
android:exported="false" on BootReceiver to resolve reported security analysis.Release 1.0.0-nullsafety.3 as 1.0.0
[Fixed][Android] null check in FetchStreamHandler that mEventSink != null
[Fixed][Android] Flutter 2 broke Android Headless Task with Null-pointer exception.
[Fixed][Android] Fix java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.transistorsoft.tsbackgroundfetch.BGTask.ge
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.transistorsoft.tsbackgroundfetch.BGTask.getTaskId()' on a null object reference[Changed] Implement null-safety (Thanks to @GinoTerlouw).
Nothing published for this version
Nothing published for this version
Nothing published for this version
[Added][iOS] Implement two new iOS options for BackgroundFetch.scheduleTask:
[Added][iOS] Implement two new iOS options for BackgroundFetch.scheduleTask:
bool requiresNetworkConnectivitybool requiresCharging (previously Android-only).[Changed][iOS] Migrate TSBackgroundFetch.framework to new .xcframework for MacCatalyst support with new Apple silcon.
cocoapods >= 1.10+.iOS' new .xcframework requires cocoapods >= 1.10+:
$ pod --version
// if < 1.10.0
$ sudo gem install cocoapods
BackgroundFetch.configure now accepts a 3rd argument onTimeout callback. This callback will be executed when the operating system has signalled your task has expired before your task has called BackgroundFetch.finish(taskId). You must stop whatever you're task is doing and execute BackgroundFetch.finish(taskId) immediately.BackgroundFetch.configure(BackgroundFetchConfig(
minimumFetchInterval: 15
), (String taskId) { // <-- task callback.
print("[BackgroundFetch] taskId: $taskId");
BackgroundFetch.finish(taskId);
}, (String taskId) { // <-- NEW: task-timeout callback.
// This task has exceeded its allowed running-time. You must stop what you're doing immediately finish(taskId)
print("[BackgroundFetch] TIMEOUT taskId: $taskId");
BackgroundFetch.finish(taskId);
});
BackgroundFetch.registerHeadlessTask) can only receive a single parameter, your headless-task will now receive a HeadlessTask task instance rather than String taskId in order to differentiate task-timeout events.OLD
void myBackgroundFetchHeadlessTask(String taskId) async { // <-- OLD: String taskId
print("[BackgroundFetch] Headless task: $taskId");
BackgroundFetch.finish(taskId);
}
BackgroundFetch.registerHeadlessTask(myBackgroundFetchHeadlessTask);
NEW
void myBackgroundFetchHeadlessTask(HeadlessTask task) async { // <-- NEW: HeadlessTask now provided.
String taskId = task.taskId; // <-- NEW: Get taskId from HeadlessTask
bool isTimeout = task.timeout; // <-- NEW: true if this task has timed-out.
if (isTimeout) {
// This task has exceeded its allowed running-time. You must stop what you're doing immediately finish(taskId)
print("[BackgroundFetch] Headless TIMEOUT: $taskId");
BackgroundFetch.finish(taskId);
return;
}
print("[BackgroundFetch] Headless task: $taskId");
BackgroundFetch.finish(taskId);
}
BackgroundFetch.registerHeadlessTask(myBackgroundFetchHeadlessTask);
[Fixed][Android] com.android.tools.build4.0.0 no longer allows "*direct local aar dependencies*". The Android Setup now requires a custom __maven url_
com.android.tools.build:gradle:4.0.0 no longer allows "direct local aar dependencies". The Android Setup now requires a custom maven url to be added to your app's root android/build.gradle:allprojects {
repositories {
google()
jcenter()
+ maven {
+ // [required] background_fetch
+ url "${project(':background_fetch').projectDir}/libs"
+ }
}
}
[Fixed][Android] using forceAlarmManager: true fails to restart fetch events after reboot.
forceAlarmManager: true fails to restart fetch events after reboot.wakeLock.isHeld() before executing wakeLock.release().[Fixed] [iOS] bug with start plugin after executing stop.
start plugin after executing stop.[Fixed] [Android] Add @Keep annotation to HeadlessTask.java to prevent minifying this classs in release builds since the SDK uses reflection to find t
@Keep annotation to HeadlessTask.java to prevent minifying this classs in release builds since the SDK uses reflection to find this class.[Fixed] [Android] stopOnTerminate not cancelling scheduled job / Alarm when fired task fired after terminate.
stopOnTerminate not cancelling scheduled job / Alarm when fired task fired after terminate.[Android] Fix Android NPE in hasTaskId for case where plugin is installed first time in had previous version of plugin
hasTaskId for case where plugin is installed first time in had previous version of pluginNothing published for this version
[Changed] Migrate iOS deprecated "background-fetch" API to new BGTaskScheduler. See new required steps in iOS Setup.
forceAlarmManager for bypassing JobScheduler mechanism in favour of AlarmManager for more precise scheduling task execution.BackgroundFetch.scheduleTask method for scheduling custom "onehot" and periodic tasks in addition to the default fetch-task.BackgroundFetch.configure(BackgroundFetchConfig(
minimumFetchInterval: 15,
stopOnTerminate: false
), (String taskId) { // <-- [NEW] taskId provided to Callback
print("[BackgroundFetch] taskId: $taskId");
switch(taskId) {
case 'foo':
// Handle scheduleTask 'foo'
break;
default:
// Handle default fetch event.
break;
}
BackgroundFetch.finish(taskId); // <-- [NEW] Provided taskId to #finish method.
});
// This event will end up in Callback provided to #configure above.
BackgroundFetch.scheduleTask(TaskConfig(
taskId: 'foo', //<-- required
delay: 60000,
periodic: false
));
[Changed] Upgrade to new Flutter Plugin API "V2". Requires flutter sdk version 1.12. See Upgrading pre 1.12 Android Projects
[Fixed] Resolve Android StrictMode violations; typically from accessing SharedPreferences on main-thread.
Fix error FlutterMain.findBundleAppPath(). The plugin modified a deprecated API for flutter 1.9.1, breaking those on previous flutter versions. Will u…
FlutterMain.findBundleAppPath(). The plugin modified a deprecated API for flutter 1.9.1, breaking those on previous flutter versions. Will use deprecated API for now.Implement Android JobInfo constraints.
JobInfo constraints.NSLog warnings casting to longstartOnBoot: true in example* Use AndroidX.
Fixed bug with setting jobServiceClass using a reference to HeadlessJobService.class. This crashes devices < api 21, since Android's JobService wasn't
jobServiceClass using a reference to HeadlessJobService.class. This crashes devices < api 21, since Android's JobService wasn't available until then. Simply provide the class name as a String.Fixed issue with Android headless config.
* First working implementation
Nothing published for this version
* First working implementation
Your coding agent can read these notes before it upgrades. Set up the MCP server →