0Pricing
Swift Academy · Lección

Tareas y actualización en segundo plano

Programe trabajo en segundo plano con BGTaskScheduler.

Tareas y actualización en segundo plano es una lección gratuita de Swift Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Swift Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Swift Academy incluye 4 lecciones en total.

Por qué existen las tareas en segundo plano

iOS suspende las aplicaciones de forma agresiva para ahorrar batería. Para realizar tareas útiles en segundo plano —actualizar un feed o procesar una descarga—, prográmelas mediante BGTaskScheduler. El sistema decide cuándo ejecutarlas, equilibrando sus necesidades con el consumo y los patrones de uso.

import BackgroundTasks
// You request work; the system schedules it later
// at an opportune moment (charging, on Wi-Fi, etc.)

Dos tipos de tareas

Hay dos tipos: BGAppRefreshTask para actualizaciones breves y frecuentes (segundos), y BGProcessingTask para tareas más largas y pesadas (minutos), como el mantenimiento de bases de datos, que pueden requerir alimentación eléctrica o red.

import BackgroundTasks
// BGAppRefreshTask  -> quick content refresh
// BGProcessingTask  -> long maintenance, can require
//                      external power / network

Declaración de identificadores

Cada tarea necesita un identificador único que debe incluir en Info.plist, bajo BGTaskSchedulerPermittedIdentifiers. Sin esta declaración, el registro falla. Use cadenas con el formato de DNS inverso.

// Info.plist:
// BGTaskSchedulerPermittedIdentifiers = [
//   "com.example.app.refresh",
//   "com.example.app.cleanup"
// ]
let ids = "declare every identifier in Info.plist"
_ = ids

Registro de un controlador

Al iniciar la aplicación, registre un controlador para cada identificador con BGTaskScheduler.shared.register. Esto debe ocurrir antes de que termine el lanzamiento de la aplicación. El controlador se ejecuta cuando el sistema decide ejecutar la tarea.

import BackgroundTasks
func registerTasks() {
    BGTaskScheduler.shared.register(
        forTaskWithIdentifier: "com.example.app.refresh",
        using: nil) { task in
        handleRefresh(task as! BGAppRefreshTask)
    }
}

Envío de una solicitud

El registro solo configura el controlador. Para solicitar realmente una ejecución, cree un BGAppRefreshTaskRequest, establezca la fecha de inicio más temprana y envíelo con submit. El sistema considera esa fecha una sugerencia, no una garantía.

import BackgroundTasks
func scheduleRefresh() {
    let request = BGAppRefreshTaskRequest(
        identifier: "com.example.app.refresh")
    request.earliestBeginDate = Date(
        timeIntervalSinceNow: 15 * 60)
    try? BGTaskScheduler.shared.submit(request)
}

Reprogramación constante

Una solicitud enviada se ejecuta como máximo una vez. Para mantener las actualizaciones, el controlador debe enviar la siguiente solicitud antes de terminar. Reprográmela primero y realice el trabajo después, para que un bloqueo durante la tarea no detenga el ciclo.

import BackgroundTasks
func handleRefresh(_ task: BGAppRefreshTask) {
    scheduleRefresh() // queue the next run first
    // ... then perform this run's work
}

Indicación de finalización

Debe llamar a task.setTaskCompleted(success:) al terminar. Si lo olvida, desperdiciará su presupuesto de ejecución en segundo plano y es posible que las tareas futuras pierdan prioridad. Indique si el trabajo se realizó correctamente para que el sistema pueda adaptar la programación.

import BackgroundTasks
func handleRefresh(_ task: BGAppRefreshTask) {
    scheduleRefresh()
    Task {
        let ok = await fetchLatest()
        task.setTaskCompleted(success: ok)
    }
}
func fetchLatest() async -> Bool { true }

Respeto del controlador de expiración

El sistema puede recuperar el tiempo antes de lo previsto. Configure task.expirationHandler para cancelar el trabajo en curso y realizar la limpieza necesaria, de modo que la aplicación termine correctamente si se interrumpe. Trátelo como una alarma de fecha límite.

import BackgroundTasks
func handle(_ task: BGAppRefreshTask) {
    let work = Task { await fetchLatest() }
    task.expirationHandler = {
        work.cancel() // stop before the OS suspends us
    }
}
func fetchLatest() async -> Bool { true }

Procesamiento de tareas con requisitos

Para trabajos pesados, BGProcessingTaskRequest permite establecer requiresNetworkConnectivity y requiresExternalPower. El sistema espera a que se cumplan esas condiciones, por lo que las tareas largas pueden ejecutarse mientras el dispositivo se carga durante la noche con conexión Wi-Fi.

import BackgroundTasks
func scheduleCleanup() {
    let req = BGProcessingTaskRequest(
        identifier: "com.example.app.cleanup")
    req.requiresExternalPower = true
    req.requiresNetworkConnectivity = false
    try? BGTaskScheduler.shared.submit(req)
}

Pruebas en el depurador

No tendrá que esperar horas a que el sistema programe la tarea. Pause la ejecución en el depurador y ejecute un comando de LLDB para forzar el lanzamiento inmediato de una tarea registrada, de modo que pueda verificar el controlador de principio a fin.

// In LLDB while paused:
// e -l objc -- (void)[[BGTaskScheduler sharedScheduler]
//   _simulateLaunchForTaskWithIdentifier:
//   @"com.example.app.refresh"]
let test = "force-launch task via LLDB"
_ = test

Un ciclo completo de actualización

En conjunto: registre la tarea al iniciar, envíe la solicitud al pasar a segundo plano y, en el controlador, reprograme la siguiente ejecución, configure un controlador de expiración, realice el trabajo asíncrono e informe de la finalización.

import BackgroundTasks
func handleRefresh(_ task: BGAppRefreshTask) {
    scheduleRefresh()
    let work = Task { await fetchLatest() }
    task.expirationHandler = { work.cancel() }
    Task {
        let ok = await work.value
        task.setTaskCompleted(success: ok)
    }
}
func fetchLatest() async -> Bool { true }

Comprobación rápida

Recuerde el ciclo de vida de una tarea de actualización recurrente.

Resumen

Ha aprendido a programar tareas en segundo plano:

  • BGAppRefreshTask para actualizaciones breves y BGProcessingTask para tareas de mantenimiento largas con requisitos de alimentación eléctrica o red.
  • Declare los identificadores en Info.plist, registre los controladores al iniciar con register y envíe las solicitudes con submit y una earliestBeginDate.
  • Programe la siguiente ejecución dentro del controlador, configure un expirationHandler y llame siempre a setTaskCompleted.
  • Fuerce el lanzamiento de las tareas mediante LLDB para probarlas.

Preguntas frecuentes

¿La lección «Tareas y actualización en segundo plano» es gratis?

Sí — el texto completo de «Tareas y actualización en segundo plano» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Swift Academy, actualiza a CoddyKit PRO. El curso de Swift Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Tareas y actualización en segundo plano»?

Programe trabajo en segundo plano con BGTaskScheduler. Practicas Swift Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Swift Academy?

No se requiere experiencia previa. Swift Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «Tareas y actualización en segundo plano»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Swift Academy?

Sí. Cada lección de Swift Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Registrarse para recibir notificaciones push
  2. Gestión de cargas de notificaciones
  3. Tareas y actualización en segundo plano
  4. Acciones y categorías de notificaciones
← Volver a Swift Academy