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 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.
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).
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.
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.
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.
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.
| Estado | Significado | Impacto |
|---|---|---|
| .newData | Datos cargados correctamente | La frecuencia puede aumentar |
| .noData | La comprobación no produjo datos nuevos | La frecuencia se mantiene |
| .failed | Error de red o del servidor | La frecuencia disminuye |
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.
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.
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions options: [UIApplication.LaunchOptionsKey : Any]?
)-> Bool {
UIApplication.shared.setMinimumBackgroundFetchInterval(
UIApplication.backgroundFetchIntervalMinimum
)
return true
}
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.
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.
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()
}
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.
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()
}
}
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.
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.
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.
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.
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.
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.
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.
// 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)
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.
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
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.
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%.
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.
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.
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
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.
Lea también