@capgo/capacitor-background-task

June 16, 2026 ยท View on GitHub

Capgo - Instant updates for Capacitor

Get instant updates for your app with Capgo

Need a plugin feature? We can build it

Periodic background task scheduling for Capacitor apps. It follows the practical feature set of Expo BackgroundTask: named tasks, persistent registration, status checks, unregistering, a testing trigger, and iOS expiration events.

What It Does

  • Schedules periodic background work on Android with WorkManager.
  • Schedules background processing on iOS with BGTaskScheduler.
  • Supports multiple named tasks with minimumInterval in minutes.
  • Emits retained task events so task runs recorded before JavaScript is ready can be drained.
  • Provides a small react-native-background-task compatible API: define, schedule, cancel, statusAsync, and finish.

Limits

  • Background tasks are not exact timers. Android and iOS decide when work actually runs.
  • Android enforces a 15 minute minimum interval.
  • iOS may delay runs substantially based on battery, network, and user behavior.
  • iOS background tasks do not run in the simulator; use a physical device.
  • This plugin cannot make an app run indefinitely in the background.

Compatibility

Plugin versionCapacitor compatibilityMaintained
v8.*.*v8.*.*โœ…
v7.*.*v7.*.*On demand
v6.*.*v6.*.*On demand

Policy:

  • New plugins start at version 8.0.0 (Capacitor 8 baseline).
  • Backward compatibility for older Capacitor majors is supported on demand.

Install

You can use our AI-Assisted Setup to install the plugin. Add the Capgo skills to your AI tool using the following command:

npx skills add https://github.com/cap-go/capacitor-skills --skill capacitor-plugins

Then use the following prompt:

Use the `capacitor-plugins` skill from `cap-go/capacitor-skills` to install the `@capgo/capacitor-background-task` plugin in my project.

If you prefer Manual Setup, install the plugin by running the following commands and follow the platform-specific instructions below:

npm install @capgo/capacitor-background-task
npx cap sync

iOS Setup

Add the background processing mode and permitted task identifier to ios/App/App/Info.plist:

<key>UIBackgroundModes</key>
<array>
  <string>processing</string>
</array>
<key>BGTaskSchedulerPermittedIdentifiers</key>
<array>
  <string>app.capgo.backgroundtask.processing</string>
</array>

Usage

Define tasks at module scope so they are available as soon as the app is started by the OS.

import { BackgroundTask, BackgroundTaskResult } from '@capgo/capacitor-background-task';

const SYNC_TASK = 'sync-offline-data';

BackgroundTask.defineTask(SYNC_TASK, async () => {
  try {
    await fetch('https://example.com/sync', { method: 'POST' });
    return BackgroundTaskResult.Success;
  } catch {
    return BackgroundTaskResult.Failed;
  }
});

await BackgroundTask.registerTaskAsync(SYNC_TASK, {
  minimumInterval: 30,
  requiresNetwork: true,
});

Testing

await BackgroundTask.triggerTaskWorkerForTestingAsync();

React Native Compatibility

import { BackgroundTask } from '@capgo/capacitor-background-task';

BackgroundTask.define(async () => {
  await fetch('https://example.com/sync', { method: 'POST' });
});

await BackgroundTask.schedule({
  period: 1800,
});

Example App

The example-app/ folder is linked via file:.. and is intended for validating native wiring during development.

API

defineTask(...)

defineTask(taskName: string, callback: BackgroundTaskCallback) => void

Define the JavaScript callback for a task. Call this at module/global scope.

ParamType
taskNamestring
callbackBackgroundTaskCallback

registerTaskAsync(...)

registerTaskAsync(taskName: string, options?: BackgroundTaskOptions | undefined) => Promise<void>

Register a named periodic background task.

ParamType
taskNamestring
optionsBackgroundTaskOptions

unregisterTaskAsync(...)

unregisterTaskAsync(taskName: string) => Promise<void>

Unregister a named periodic background task.

ParamType
taskNamestring

isTaskRegisteredAsync(...)

isTaskRegisteredAsync(taskName: string) => Promise<boolean>

Check whether a named task is registered.

ParamType
taskNamestring

Returns: Promise<boolean>


getRegisteredTasksAsync()

getRegisteredTasksAsync() => Promise<string[]>

Return all registered task names.

Returns: Promise<string[]>


getPendingTaskRunsAsync()

getPendingTaskRunsAsync() => Promise<BackgroundTaskEvent[]>

Return pending task runs that native recorded before JavaScript was ready.

Returns: Promise<BackgroundTaskEvent[]>


getStatusAsync()

getStatusAsync() => Promise<BackgroundTaskStatus>

Return native background task availability.

Returns: Promise<BackgroundTaskStatus>


triggerTaskWorkerForTestingAsync()

triggerTaskWorkerForTestingAsync() => Promise<boolean>

Trigger all registered tasks immediately for development/testing.

Returns: Promise<boolean>


addExpirationListener(...)

addExpirationListener(listener: (event: BackgroundTaskEvent) => void) => Promise<PluginListenerHandle>

Listen for iOS expiration callbacks.

ParamType
listener(event: BackgroundTaskEvent) => void

Returns: Promise<PluginListenerHandle>


define(...)

define(callback: BackgroundTaskCallback) => void

React Native background-task compatible single-task define helper.

ParamType
callbackBackgroundTaskCallback

schedule(...)

schedule(options?: ReactNativeBackgroundTaskOptions | undefined) => Promise<void>

React Native background-task compatible single-task scheduler.

ParamType
optionsReactNativeBackgroundTaskOptions

cancel()

cancel() => Promise<void>

React Native background-task compatible single-task cancel helper.


statusAsync()

statusAsync() => Promise<ReactNativeBackgroundTaskStatus>

React Native background-task compatible status helper.

Returns: Promise<ReactNativeBackgroundTaskStatus>


finish(...)

finish(result?: BackgroundTaskResult | undefined) => Promise<void>

React Native background-task compatible finish helper. Normal Expo-style callbacks are finished automatically.

ParamType
resultBackgroundTaskResult

Interfaces

BackgroundTaskEvent

Payload emitted when native scheduling asks JavaScript to run a task.

PropTypeDescription
taskNamestringName passed to registerTaskAsync.
taskIdstringNative run identifier. The JavaScript wrapper finishes it automatically when the defined callback resolves.
timestampnumberNative timestamp for the run.
testbooleanTrue when triggered through triggerTaskWorkerForTestingAsync.

BackgroundTaskOptions

Options for registering a periodic background task.

PropTypeDescription
minimumIntervalnumberInexact interval in minutes between task runs. Defaults to 720 minutes. Android enforces a 15 minute minimum. iOS treats this as an earliest begin date and may run much later.
requiresNetworkbooleanRequire an active network before running the native scheduler. Defaults to true.

PluginListenerHandle

PropType
remove() => Promise<void>

ReactNativeBackgroundTaskOptions

React Native background-task compatible schedule options.

PropTypeDescription
periodnumberDesired seconds between each execution. Mapped to minimumInterval minutes.
timeoutnumberAndroid-only timeout hint kept for API compatibility.

ReactNativeBackgroundTaskStatus

React Native background-task compatible status payload.

PropTypeDescription
availablebooleanWhether background tasks are available to the app.
unavailableReasonstringReason when unavailable.

Type Aliases

BackgroundTaskCallback

Function executed for a background task.

(event: BackgroundTaskEvent): void | BackgroundTaskResult | Promise<void | BackgroundTaskResult>

Enums

BackgroundTaskResult

MembersValueDescription
Success1The task finished successfully.
Failed2The task failed.

BackgroundTaskStatus

MembersValueDescription
Restricted1Background task scheduling is unavailable or restricted.
Available2Background task scheduling is available.