El evento principal del año en el mundo de los desarrolladores de iOS y MacOS, WWDC, invariablemente agrada a todas las personas involucradas en la industria con el lanzamiento de nuevas versiones del sistema operativo, marcos, hardware, en general, todo lo que realmente necesita ser trabajado.
Este año no fue la excepción y el tema de discusión activa fue la nueva versión de iOS, SwiftUI y el sistema operativo iPadOS para que usted mismo entendiera qué dispositivos.
Sin embargo, hubo temas que fueron menos cubiertos, pero no menos interesantes de esto, por ejemplo, algo tan útil como se tocó la ejecución en segundo plano de las aplicaciones.
Brevemente sobre el tema.
Para aquellos que no entienden qué es la ejecución en segundo plano, expliquemos: la ejecución en segundo plano significa que la aplicación está haciendo un trabajo en un estado en el que no se ejecuta físicamente en la pantalla del teléfono inteligente del usuario (es decir, no está en primer plano) .

Esta imagen muestra claramente en qué condiciones puede permanecer la aplicación y cómo pasar de una a otra.
Además, los desarrolladores de Apple en esta sesión se centraron en el consumo de recursos (espero que sea bastante obvio que cuando se trabaja en segundo plano, la aplicación continúa consumiendo energía). Pero es hora de ir directamente al informe.
Lo que sucedió en WWDC
En realidad, los oradores comenzaron con lo mismo que yo: hablaron brevemente sobre trabajar en segundo plano y describieron las tareas que se llevarían a cabo allí.

Nos estamos acercando al desarrollo. Hay 3 consideraciones principales para Apple cuando se trata de rendimiento de fondo:
- poder
- rendimiento
- confidencialidad
Todo es bastante simple: si una tarea de aplicación se ejecuta en segundo plano, esta ejecución puede ocurrir mientras otra aplicación se ejecuta en primer plano. Por lo tanto, existe un límite de recursos para garantizar que los recursos no se consuman en exceso. Si se exceden estos límites, Apple puede terminar su aplicación por la fuerza, lo que ralentizará aún más el tiempo de inicio. Con respecto a la privacidad, la compañía recomienda encarecidamente que los desarrolladores utilicen todas las funciones de su API para informar al usuario sobre qué datos utiliza la aplicación en su trabajo (incluso en segundo plano).
Por cierto, la lista de estas API fue bastante impresionante: no hicieron una revisión por separado, pero le aconsejo que les preste atención.
Sí, y en la sesión misma, los desarrolladores de Apple mostraron una breve descripción de las posibilidades utilizando el ejemplo de la aplicación de mensajería (vale la pena ver un video de WWDC).
Tareas de fondo
Casi la mitad del informe de este año está dedicado a este marco.
2 tipos de tareas que ofrece esta novedad:
- Tarea de actualización de la aplicación
- Tarea de procesamiento en segundo plano
Tarea de actualización de la aplicación
BG App Refresh Task es un tipo especial de tarea en segundo plano que podemos usar para actualizar los datos de la aplicación. Una cosa que hace que este tipo de tarea sea muy especial es el comportamiento del usuario. iOS aprende con qué frecuencia y a qué hora el usuario inicia su aplicación, e intenta iniciar BGAppRefreshTask en un momento en que es poco probable que el usuario use la aplicación.

Sí, no funcionará más de 30 segundos: la característica es muy desagradable, sobrante de versiones anteriores del sistema operativo.
Considere un ejemplo de código de Internet.
import UIKit import BackgroundTasks @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { BGTaskScheduler.shared.register( forTaskWithIdentifier: "pl.snowdog.example.refresh", using: DispatchQueue.global() ) { task in self.handleAppRefresh(task) } return true } private func handleAppRefresh(_ task: BGTask) { let queue = OperationQueue() queue.maxConcurrentOperationCount = 1 let appRefreshOperation = AppRefreshOperation() queue.addOperation(appRefreshOperation) task.expirationHandler = { queue.cancelAllOperations() } let lastOperation = queue.operations.last lastOperation?.completionBlock = { task.setTaskCompleted(success: !(lastOperation?.isCancelled ?? false)) } scheduleAppRefresh() } }
Hay varios puntos que debe detener y considerar mejor:
- Instale el controlador de caducidad en el objeto de tarea (expirationHandler), ya que el sistema proporciona un tiempo limitado para completar el trabajo y, si se supera, deberá borrar los recursos.
- Asegúrese de que se haya llamado al método setTaskCompleted tan pronto como se complete la operación.
- BGTaskScheduler es la clase principal que se utiliza para programar el trabajo en segundo plano.
Tarea de procesamiento en segundo plano
Otro tipo de pirateo en segundo plano es la tarea de procesamiento de BG. Puede usarlo para entrenar el modelo ML en el dispositivo o hacer una limpieza en la base de datos. Apple promete que el sistema puede asignar hasta varios minutos de tiempo para este tipo de tarea, lo cual es una innovación muy importante para trabajos pesados que no se ajustan a unos miserables 30 segundos.
De nuevo un ejemplo:
import UIKit import BackgroundTasks @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { BGTaskScheduler.shared.register( forTaskWithIdentifier: "pl.snowdog.example.train", using: DispatchQueue.global() ) { task in self.handleMLTrain(task) } return true } private func scheduleMLTrain() { do { let request = BGProcessingTaskRequest(identifier: "pl.snowdog.example.train") request.requiresExternalPower = true request.requiresNetworkConnectivity = true try BGTaskScheduler.shared.submit(request) } catch { print(error) } } }
Puntos importantes:
- requiesExternalPower es un valor booleano que indica si se requiere un dispositivo conectado a una fuente de alimentación para una tarea de procesamiento.
- requireNetworkConnectivity: un valor booleano que indica si se requiere una conexión de red para una tarea de procesamiento.
Depuración
Aquí, también, no está exento de comodidades. El retraso entre el tiempo de ejecución programado de la tarea en segundo plano y el momento en que el sistema inicia la aplicación para completarla puede ser de varias horas. Al desarrollar una aplicación, puede usar dos funciones privadas para iniciar una tarea y forzar su finalización anticipada de acuerdo con la línea de tiempo seleccionada. Las funciones de depuración solo funcionan en dispositivos.
- Lanzamiento de tarea:
e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"TASK_IDENTIFIER"]
- Terminación anticipada forzada de la tarea:
e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateExpirationForTaskWithIdentifier:@"TASK_IDENTIFIER"]
En conclusión
BackgroundTasks es una excelente manera de planificar su arduo trabajo con la mejor experiencia de usuario utilizando su entorno. Dado que desde la 13ª versión del sistema, muchos métodos para trabajar en segundo plano se están volviendo obsoletos, el marco seguirá siendo muy popular en las aplicaciones. Dadas las posibilidades anteriores, esto es bastante lógico.
También recomiendo ver un
video de WWDC , los ejemplos descritos allí son muy interesantes.