Expo Application Services
API Reference


expo-task-manager provides an API that allows you to manage long-running tasks, in particular those tasks that can run while your app is in the background. Some features of this module are used by other modules under the hood. Here is a list of Expo modules that use TaskManager:
  • Location
  • BackgroundFetch

Platform Compatibility

Android DeviceAndroid EmulatoriOS DeviceiOS SimulatorWeb


→ npx expo install expo-task-manager

If you're installing this in a bare React Native app, you should also follow these additional installation instructions.

TaskManager works out of the box in the Expo Go app on Android, but on iOS you'll need to test using a development build
Standalone apps need some extra configuration: on iOS, each background feature requires a special key in UIBackgroundModes array in your Info.plist file. In standalone apps this array is empty by default, so in order to use background features you will need to add appropriate keys to your app.json configuration. Here is an example of an app.json configuration that enables background location and background fetch:
  "expo": {
    "ios": {
      "infoPlist": {
        "UIBackgroundModes": [
For bare React Native apps, you need to add those keys manually. You can do it by clicking on your project in Xcode, then Signing & Capabilities, adding the BackgroundMode capability (if absent), and checking either Location updates or Background fetch, depending on your needs.

import React from 'react';
import { Text, TouchableOpacity } from 'react-native';
import * as TaskManager from 'expo-task-manager';
import * as Location from 'expo-location';

const LOCATION_TASK_NAME = 'background-location-task';

const requestPermissions = async () => {
  const { status } = await Location.requestPermissionsAsync();
  if (status === 'granted') {
    await Location.startLocationUpdatesAsync(LOCATION_TASK_NAME, {
      accuracy: Location.Accuracy.Balanced,

const PermissionsButton = () => (
  <TouchableOpacity onPress={requestPermissions}>
    <Text>Enable background location</Text>

TaskManager.defineTask(LOCATION_TASK_NAME, ({ data, error }) => {
  if (error) {
    // Error occurred - check `error.message` for more details.
  if (data) {
    const { locations } = data;
    // do something with the locations captured in the background

export default PermissionsButton;

import * as TaskManager from 'expo-task-manager';

taskNamestringName of the task. It must be the same as the name you provided when registering the task.
taskExecutorTaskManagerTaskExecutorA function that will be invoked when the task with given taskName is executed.

Defines task function. It must be called in the global scope of your JavaScript bundle. In particular, it cannot be called in any of React lifecycle methods like componentDidMount. This limitation is due to the fact that when the application is launched in the background, we need to spin up your JavaScript app, run your task and then shut down — no views are mounted in this scenario.

  • Undo-iconvoid

Provides information about tasks registered in the app.

A promise which fulfills with an array of tasks registered in the app. Example:

    taskName: 'location-updates-task-name',
    taskType: 'location',
    options: {
      accuracy: Location.Accuracy.High,
      showsBackgroundLocationIndicator: false,
    taskName: 'geofencing-task-name',
    taskType: 'geofencing',
    options: {
      regions: [...],

taskNamestringName of the task.

Retrieves options associated with the task, that were passed to the function registering the task (eg. Location.startLocationUpdatesAsync).

A promise which fulfills with the options object that was passed while registering task with given name or null if task couldn't be found.

Determine if the TaskManager API can be used in this app.

A promise fulfills with true if the API can be used, and false otherwise. On the web it always returns false.

taskNamestringName of the task.

Checks whether the task is already defined.

  • Undo-iconboolean

taskNamestringName of the task.

Determine whether the task is registered. Registered tasks are stored in a persistent storage and preserved between sessions.

A promise which fulfills with a boolean value whether or not the task with given name is already registered.

Unregisters all tasks registered for the running app. You may want to call this when the user is signing out and you no longer need to track his location or run any other background tasks.

A promise which fulfills as soon as all tasks are completely unregistered.

taskNamestringName of the task to unregister.

Unregisters task from the app, so the app will not be receiving updates for that task anymore. It is recommended to use methods specialized by modules that registered the task, eg. Location.stopLocationUpdatesAsync.

A promise which fulfills as soon as the task is unregistered.

Error object that can be received through TaskManagerTaskBody when the task fails.

codestring | number-

Represents an already registered task.

optionsanyProvides options that the task was registered with.
taskNamestringName that the task is registered with.
taskTypestringType of the task which depends on how the task was registered.

Represents the object that is passed to the task executor.

dataTAn object of data passed to the task executor. Its properties depends on the type of the task.
errornull | TaskManagerErrorError object if the task failed or null otherwise.
executionInfoTaskManagerTaskBodyExecutionInfoAdditional details containing unique ID of task event and name of the task.

Additional details about execution provided in TaskManagerTaskBody.

'active' | 'background' | 'inactive'Only for:

State of the application.
eventIdstringUnique ID of task event.
taskNamestringName of the task.

Type of task executor – a function that handles the task.