Background Fetch: qué es, cómo funciona y configuración de actualizaciones

Autor: IT Sectr Publicado: 2026-03-27 Tiempo de lectura: 8 min

Background Fetch es un mecanismo de iOS que activa periódicamente la aplicación en segundo plano para descargar contenido actualizado. El sistema analiza el comportamiento del usuario y selecciona las ventanas óptimas para la actualización. Según Apple, 2026, la aplicación tiene de 30 a 120 segundos para realizar la operación, después de lo cual el sistema suspende o finaliza el proceso.

Puntos clave

  • Background Fetch es una API de iOS para la actualización periódica de contenido en segundo plano.
  • El sistema controla la frecuencia de activaciones según el análisis del comportamiento del usuario.
  • El intervalo mínimo se define mediante UIApplication.minimumBackgroundFetchInterval.
  • Obsolescencia — desde iOS 13+ el mecanismo se considera heredado, se recomienda BGTaskScheduler.
  • Tiempo de ejecución — hasta 30 segundos, después el sistema finaliza la tarea forzosamente.

¿Qué es Background Fetch en iOS?

Background Fetch es una API de iOS que permite a la aplicación recibir datos actualizados periódicamente en segundo plano. Se introdujo por primera vez en iOS 7 junto con el mecanismo Background App Refresh. El objetivo principal es que el contenido esté actualizado cuando el usuario abra la aplicación, sin necesidad de esperar la carga.

Diferencia con las notificaciones push

Las notificaciones push son iniciadas por el servidor — este envía una señal al dispositivo y el sistema decide si activar la aplicación. Background Fetch es iniciado por el propio iOS basándose en los patrones de uso del dispositivo. Push es más adecuado para mensajes urgentes, mientras que Fetch es para actualizaciones programadas de contenido (noticias, feed de redes sociales).

Lugar en el ecosistema de tareas en segundo plano

Background Fetch es uno de los varios mecanismos de ejecución en segundo plano en iOS. BGAppRefreshTask (iOS 13+) realiza la misma tarea pero con una planificación más flexible. Background Modes (audio, ubicación) son para operaciones continuas. Silent Push son actualizaciones iniciadas por el servidor. Fetch sigue siendo relevante para proyectos compatibles con iOS 12 y versiones anteriores.

  • Background Fetch — periódico, iniciado por el sistema, iOS 7+.
  • BGAppRefreshTask — periódico, iniciado por el sistema, iOS 13+.
  • BGProcessingTask — tareas de larga duración, iOS 13+.
  • Silent Push — iniciado por el servidor, iOS 7+.

Cómo funciona Background Fetch: arquitectura y ciclo de vida

iOS utiliza un algoritmo de aprendizaje automático para determinar el momento óptimo para activar la aplicación. El sistema analiza cuándo el usuario suele abrir la aplicación, cuánto tiempo la usa y con qué frecuencia vuelve. Basándose en estos datos, iOS calcula las ventanas para Background Fetch.

Proceso de ejecución de la tarea

Cuando el sistema decide activar la aplicación, llama al método application(_:performFetchWithCompletionHandler:) en AppDelegate. La aplicación debe cargar una cantidad mínima de datos nuevos y llamar al completion handler con uno de tres estados: .newData (datos cargados), .noData (sin datos nuevos) o .failed (error). El estado afecta la frecuencia de futuras activaciones.

Impacto del completion handler en la frecuencia de llamadas

El estado .newData indica al sistema que la actualización fue útil — iOS puede aumentar la frecuencia de activaciones. .noData indica que no hay datos — la frecuencia se mantiene o disminuye. .failed señala un problema — el sistema reduce la frecuencia para ahorrar batería. El énfasis debe estar en un estado honesto, no en forzar .newData.

EstadoSignificadoImpacto
.newDataDatos cargados correctamenteLa frecuencia puede aumentar
.noDataLa comprobación no produjo datos nuevosLa frecuencia se mantiene
.failedError de red o del servidorLa frecuencia disminuye

Configuración de Background Fetch en un proyecto de Xcode

Para habilitar Background Fetch se requieren dos pasos: activar la capability en Xcode y establecer el intervalo mínimo en el código. La capability se encuentra en Target — Signing & Capabilities — Background Modes — marcar la casilla Background Fetch. Sin este paso, el sistema no activará la aplicación.

Configuración del intervalo mínimo

El método UIApplication.shared.setMinimumBackgroundFetchInterval establece el tiempo mínimo en segundos entre llamadas de Fetch. El valor UIApplication.backgroundFetchIntervalMinimum (aproximadamente 15 minutos) indica al sistema que active la aplicación con la mayor frecuencia posible de manera eficiente energéticamente. Establecer el intervalo en application(_:didFinishLaunchingWithOptions:) es una práctica estándar.

swift
func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions options: [UIApplication.LaunchOptionsKey : Any]?
)-> Bool {
    UIApplication.shared.setMinimumBackgroundFetchInterval(
        UIApplication.backgroundFetchIntervalMinimum
    )
    return true
}

Info.plist y capability

Al habilitar Background Fetch en Xcode, este actualiza automáticamente Info.plist — añade la clave UIBackgroundModes con el valor fetch. Este es un paso obligatorio: sin ello, la aplicación no recibirá la llamada a performFetchWithCompletionHandler. Puede verificarlo a través de P list Source o Build Settings.

Ejemplos de código de Background Fetch en Swift

Veamos una implementación completa de Background Fetch para una aplicación de noticias. La implementación incluye carga de datos, caché y llamada al completion handler. El código se ejecuta en AppDelegate — el único lugar donde el sistema llama a fetch.

swift
func application(
    _ application: UIApplication,
    performFetchWithCompletionHandler handler: @escaping (UIBackgroundFetchResult) -> Void
) {
    let url = URL(string: "https://api.example.com/latest")!

    URLSession.shared.dataTask(with: url) { data, response, error in
        guard let data = data, error == nil else {
            handler(.failed)
            return
        }

        do {
            let articles = try JSONDecoder().decode([Article].self, from: data)
            cacheArticles(articles)
            handler(articles.isEmpty ? .noData : .newData)
        } catch {
            handler(.failed)
        }
    }.resume()
}

Caché de datos cargados

Después de cargar los datos mediante Background Fetch, es necesario guardarlos en el almacenamiento local — CoreData, UserDefaults o File Manager. Al abrir la aplicación, los datos ya deben estar disponibles. Utilice CoreData con un contexto en segundo plano para una escritura segura en cuanto a hilos. Después de guardar, actualice la interfaz de usuario en el hilo principal.

swift
func cacheArticles(_ articles: [Article]) {
    let container = NSPersistentContainer(name: "AppModel")
    container.performBackgroundTask { context in
        articles.forEach { article in
            let entity = ArticleEntity(context: context)
            entity.id = Int64(article.id)
            entity.title = article.title
            entity.body = article.body
        }
        try? context.save()
    }
}

Prueba de Background Fetch

Para las pruebas, utilice el Simulador — seleccione Debug — Simulate Background Fetch en Xcode. En un dispositivo físico, debe esperar a que el sistema decida ejecutar fetch. Para acelerar, puede establecer el intervalo mínimo en 1 minuto, pero el sistema puede ignorarlo cuando la batería está baja.

Limitaciones y dificultades

Background Fetch tiene varias limitaciones importantes a considerar al diseñar la arquitectura de la aplicación. La principal es que el sistema controla completamente la frecuencia de las llamadas y el desarrollador no puede garantizarla. Incluso con un intervalo mínimo establecido, el sistema puede no llamar a fetch durante horas.

Límite de tiempo de ejecución

El sistema asigna tiempo limitado a la aplicación para ejecutar la tarea — normalmente hasta 30 segundos. Si la aplicación no llama al completion handler dentro de ese tiempo, el sistema finaliza forzosamente el proceso y reduce la frecuencia de futuras activaciones. Todas las solicitudes de red deben ser compactas — no más de 1-2 por llamada.

Dependencia de la batería

iOS tiene en cuenta el nivel de batería al programar Background Fetch. Cuando la carga está por debajo del 20%, la frecuencia de activaciones disminuye. Cuando el Modo de bajo consumo está activado, el sistema puede desactivar completamente las actualizaciones en segundo plano para todas las aplicaciones. El usuario también puede desactivar Background App Refresh para una aplicación específica en los ajustes.

Limitaciones de red

URLSession iniciada desde Background Fetch funciona en modo estándar — sin soporte de sesiones en segundo plano. Para descargas grandes, utilice URLSession con configuración en segundo plano. El sistema continuará la descarga incluso después de que finalice fetch, pero el progreso no se rastreará hasta la próxima activación.

Migración de Background Fetch a BGTaskScheduler

A partir de iOS 13, Apple recomienda BGTaskScheduler como reemplazo de Background Fetch. BGTaskScheduler proporciona una planificación más flexible, dos tipos de tareas (refresh y processing) y registro de tareas con identificadores. La migración incluye varios pasos y se recomienda para todos los proyectos nuevos.

Migración paso a paso

El primer paso es definir los identificadores de tareas en Info.plist mediante la clave BGTaskSchedulerPermittedIdentifiers. El segundo es registrar las tareas en AppDelegate a través de BGTaskScheduler.shared.register. El tercero es reemplazar la llamada a performFetchWithCompletionHandler por el handler pasado a register. El cuarto es llamar a submit para programar la tarea.

swift
// Antes (Background Fetch)
UIApplication.shared.setMinimumBackgroundFetchInterval(
    UIApplication.backgroundFetchIntervalMinimum
)

// Después de la migración (BGTaskScheduler)
BGTaskScheduler.shared.register(
    forTaskWithIdentifier: "com.example.refresh",
    using: nil
) { task in
    self.handleAppRefresh(task: task as! BGAppRefreshTask)
}

let request = BGAppRefreshTaskRequest(
    identifier: "com.example.refresh"
)
request.earliestBeginDate = Date(timeIntervalSinceNow: 15 * 60)
try? BGTaskScheduler.shared.submit(request)

Ventajas de BGTaskScheduler

BGTaskScheduler proporciona más control: BGProcessingTask para operaciones largas (hasta 10 minutos), condiciones de ejecución mediante requiresNetworkConnectivity y requiresExternalPower, y un expiration handler para finalización controlada. El sistema también analiza el uso de la aplicación, pero el desarrollador puede establecer requisitos más precisos.

Cuándo mantener Background Fetch

Si la aplicación es compatible con iOS 12 y versiones anteriores, Background Fetch sigue siendo la única opción para actualizaciones periódicas. BGTaskScheduler solo está disponible desde iOS 13+. En este caso, utilice un envoltorio: verifique la disponibilidad mediante if #available(iOS 13, *) y llame a la API correspondiente.

Preguntas frecuentes

¿Con qué frecuencia iOS llama a Background Fetch?

La frecuencia exacta no está documentada y depende del comportamiento del usuario. El sistema analiza con qué frecuencia el usuario abre la aplicación y ajusta la frecuencia en consecuencia. En promedio, con un uso activo, fetch puede llamarse de 1 a 3 veces por hora. Con uso poco frecuente — de 1 a 2 veces al día.

¿Por qué no se llama a mi Background Fetch?

Verifique tres condiciones: la capability Background Fetch está habilitada en Xcode, se ha establecido minimumBackgroundFetchInterval y el usuario no ha desactivado Background App Refresh para la aplicación en los ajustes. También verifique que el dispositivo no esté en Modo de bajo consumo y que el nivel de batería supere el 20%.

¿Cuál es la diferencia entre Background Fetch y BGAppRefreshTask?

Background Fetch es la API antigua (iOS 7), BGAppRefreshTask es la nueva API (iOS 13+). BGAppRefreshTask proporciona más control: expiration handler, capacidad de reprogramación y verificación de estado. Background Fetch es más simple de implementar pero menos flexible. Apple recomienda usar BGAppRefreshTask para proyectos nuevos.

¿Puedo descargar archivos grandes mediante Background Fetch?

No se recomienda. Background Fetch tiene un límite de tiempo (hasta 30 segundos). Para descargas grandes, use URLSession con configuración en segundo plano — el sistema continuará la descarga incluso después de que finalice fetch. Una alternativa es BGProcessingTask (iOS 13+), que permite hasta 10 minutos y condiciones de carga.

¿Background Fetch consume batería?

Sí, cada activación consume energía para encender el procesador, inicializar la pila de red y cargar datos. iOS optimiza la frecuencia para minimizar el impacto. Con una implementación correcta — carga solo de datos nuevos, llamada rápida al completion handler — el impacto en la batería es mínimo.

Resumen

  • Background Fetch es una API de iOS para la carga periódica de datos en segundo plano, disponible desde iOS 7 y recomendada para ser reemplazada por BGTaskScheduler.
  • El sistema controla la frecuencia de las llamadas analizando el comportamiento del usuario — el desarrollador no puede garantizar el momento de activación.
  • Tres estados del completion handler — .newData, .noData, .failed — afectan la frecuencia de futuras activaciones de la aplicación.
  • Límite de 30 segundos — no ejecute operaciones largas ni múltiples solicitudes de red secuenciales.
  • La capability es obligatoria — Background Fetch en Xcode + establecimiento de minimumBackgroundFetchInterval en el código.
  • BGTaskScheduler es el reemplazo moderno desde iOS 13+, que proporciona más control y dos tipos de tareas.
  • Para proyectos compatibles con iOS 12 y versiones anteriores, use Background Fetch con verificación de disponibilidad de BGTaskScheduler mediante if #available.

Desarrollaremos una aplicación móvil llave en mano

IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.

Discutir el proyecto

Lea también