Comprender el papel de los delegados de la aplicación y los delegados de escena en el desarrollo de iOS

Desde las primeras versiones de iOS, el protocolo UIApplicationDelegate] ha sido la columna vertebral de la gestión del ciclo de vida de aplicaciones iOS. Sin embargo, la introducción de soporte multiventana en iOS 13 ha cambiado fundamentalmente cómo los desarrolladores manejan interfaces de usuario. Apple introdujo el protocolo UISceneDelegate

¿Qué es un delegado de la aplicación?

El Delegado de Aplicación] es el punto de entrada y coordinador central de una aplicación iOS. Se ajusta al protocolo y es responsable de manejar eventos de aplicaciones de alto nivel que afectan a toda la aplicación. Estos eventos incluyen lanzamiento de aplicaciones, terminación, advertencias de memoria, captura de antecedentes y registro de notificación remota. El objeto de Delegado de la Aplicación es instantáneamente por el sistema al iniciar y permanece vivo para el proceso.

Métodos básicos del ciclo de vida

El Delegado de la Aplicación define varios métodos críticos que el sistema llama en respuesta a los cambios del estado de la aplicación:

  • ] ] — Llamado después de que la aplicación haya lanzado. Aquí es donde inicializa SDKs de terceros, configura pilas de datos básicos, establece apariencia global y restaura el estado de la aplicación. Volver indica que la aplicación no puede manejar la URL o actividad que causó el lanzamiento.
  • — Invocada cuando la aplicación pasa de estado inactivo a activo. Usa esto para reanudar tareas de pausa, refrescar la interfaz de usuario o reiniciar animaciones.
  • — Se llama cuando la aplicación está a punto de volverse inactiva (por ejemplo, llamada telefónica entrante, el usuario pulsa el botón de bloqueo). Guardar los juegos de estado, pausa y reducir el uso de recursos.
  • ] — Se lee cuando la aplicación se mueve al fondo. Realice limpieza final, libere recursos compartidos y programe tareas de fondo.
  • — Llamado justo antes de que la aplicación regrese al primer plano después de haber sido de fondo.
  • ]] — Invocada cuando la aplicación está a punto de terminarse. Guardar datos críticos y liberar recursos. Nota: esto no se llama a las versiones modernas de iOS para aplicaciones en segundo plano a menos que se mate específicamente.

Responsabilidades adicionales

Además de la gestión del ciclo de vida, el Delegado de la Aplicación gestiona varios servicios a nivel de toda la aplicación:

  • Remote and Local Notifications: Registro de notificaciones remotas a través de y maneje las notificaciones entrantes con .
  • Handling URLs and Handoff: El Delegado de Aplicación responde a esquemas de URL personalizados y Enlaces Universales a través de y administra la actividad Handoff a través .
  • Advertencias de memoria: permite que la aplicación suelte caches, imágenes y otros recursos desechables.
  • Inicio de referencia:] Implementar para descargar el contenido periódicamente mientras la aplicación está en el fondo.
  • ]Watch Connectivity and App Groups: Coordinar el intercambio de datos entre la aplicación iOS y la aplicación de Compatibilidad Watch a través del Delegado de Aplicación.

Contexto histórico

Antes de iOS 13, el Delegado de la Aplicación también fue responsable de gestionar la instancia de ventana única de la aplicación. Los desarrolladores establecieron el controlador de visión de raíz dentro . Este diseño era simple pero limitativo—no podía soportar múltiples ventanas simultáneas. La introducción de escenas en iOS 13 movió la gestión de las ventanas para separar objetos de delegado, dejando libre al Delegado de la Aplicación para centrarse exclusivamente en las preocupaciones de toda la aplicación.

¿Qué es un Delegado de Escena?

Con iOS 13 y iPadOS 13, Apple introdujo el protocolo UISceneDelegate] para soportar múltiples ventanas por aplicación. Una escena representa una instancia de la interfaz de usuario de su aplicación, normalmente respaldada por un objeto . Cada escena tiene su propio ciclo de vida y se puede mostrar en una pantalla separada o en un espacio separado en la interfaz de usuario del iPad.

Apoyo multi-Window

Para usar escenas, debes optar por configurar la tecla de tu aplicación con la tecla “Application Scene Manifest” . Este manifiesto define las configuraciones de escena, incluyendo nombres de clase de delegado y roles de sesión. Sin este manifiesto, iOS trata la aplicación como una sola ventana y continúa utilizando la gestión de ventana de App Delegate.

Métodos básicos del ciclo de vida de escena

El Delegado de Escena implementa métodos análogos al Delegado de la Aplicación pero abarcados a una escena:

  • — Llamado cuando se va a añadir una nueva escena a la aplicación. Aquí es donde se establece el controlador de visión de raíz y la interfaz de usuario inicial de la escena. Recibimos un objeto que proporciona información sobre la URL, actividad o atajo que provocó la escena.
  • — La escena se vuelve activa (delante y en foco). Reanuda las actividades pausadas, inicia las animaciones y actualiza los datos.
  • — La escena está a punto de convertirse en inactiva (por ejemplo, gesto multitarea, conmutador de aplicaciones). Guardar operaciones estatales y de pausa.
  • — La escena se mueve al fondo. Libera recursos, ahorra datos y programa las tareas de fondo para esta escena.
  • — La escena está a punto de hacerse activa en primer plano.
  • — Llamado cuando el sistema elimina la escena de la aplicación (por ejemplo, el usuario cierra una ventana en el iPad, o la aplicación se mueve al fondo y el sistema decide deshacer la escena). Realizar limpieza final específica para esa escena.

Sesiones y roles de escenario

Cada escena se asocia con un objeto que persiste en los lanzamientos. Se pueden reutilizar o crear nuevamente sesiones. La sesión contiene una propiedad que indica si la escena es para la interfaz principal de aplicación () o una pantalla externa ().El Delegado de Escena puede comprobar el papel de la sesión para adaptar su comportamiento.

Delegado de escena en SwiftUI

Para aplicaciones SwiftUI, el Delegado de Escena es a menudo autogenerado cuando usted comienza un nuevo proyecto orientado a iOS 14+. Sin embargo, todavía puede crear un Delegado de Escena personalizado utilizando el envoltorio de propiedades en su estructura. SwiftUI escena utiliza implícitamente

Diferencias clave entre el Delegado de la Aplicación y el Delegado de Escena

Si bien ambos delegados gestionan el ciclo de vida, su alcance y sus responsabilidades difieren significativamente:

  • Escopo:] El Delegado de la Aplicación opera a nivel de proceso de aplicación; sólo hay una por aplicación. El Delegado de Escena funciona a nivel de escena (o ventana); puede tener varios delegados de escena funcionando simultáneamente.
  • Introducción:] La aplicación Delegado ha existido desde iOS 2. Delegado de escena se introdujo en iOS 13 para permitir el soporte de varias ventanas.
  • Gestión de Windows: En aplicaciones heredadas, el Delegado de la Aplicación posee la ventana. En aplicaciones basadas en escena, cada Delegado de Escena posee la ventana de su escena. El Delegado de la Aplicación ya no accede directamente a la ventana.
  • Preservación del Estado: Las aplicaciones que utilizan escenas deben implementar la preservación y restauración del estado a nivel de escena (vía o ), no sólo a través del Delegado de la Aplicación.
  • Tareas de fondo: En general, las tareas de fondo pueden ser activadas a nivel de toda la aplicación (a través de Delegado de la Aplicación) o por escena (a través de Delegado de Escena). Sin embargo, ciertos modos de fondo como el feto de fondo siguen siendo gestionados por el Delegado de la Aplicación.

Cómo trabajan juntos en una aplicación moderna

En una aplicación iOS basada en escena, el Delegado de App y el Delegado de Escena forman una arquitectura estratificada. El Delegado de App inicializa la infraestructura compartida —logging, analytics, base de datos central— y maneja eventos que no pertenecen a una escena particular. Cuando el sistema necesita mostrar contenido nuevo, crea una escena y asocia a un Delegado de Escena.

Coordinación durante el lanzamiento

Cuando un usuario abre la aplicación, el sistema llama al Delegado de la Aplicación . Después de este retorno, el sistema crea una escena y llama en el Delegado de Escena. Si la aplicación se reabria a través de Handoff o un atajo, el entrega la actividad pertinente, URL o actividad de usuario al Delegado de Escena apropiado.

Restauración del Estado A través de escenas

La restauración del Estado es crucial para el multitarea sin costuras. Cada escena debe codificar su estado utilizando en el método del Delegado de Escena . El Delegado de la Aplicación es responsable de proporcionar tipos de actividad a través de al crear una sesión de escena. Esta coordinación asegura que las escenas reabiertasen su contenido, por ejemplo, una aplicación de documentos puede reabrir el archivo exacto que el usuario fue el usuario.

Manejo de pantallas externas

En el iPad, se puede crear una escena en un monitor externo a través de “AirPlay” o “Sidecar”. Al inspeccionar el papel , el Delegado de Escena puede ajustar su interfaz de usuario para que coincida con la resolución y las capacidades de la pantalla externa. El Delegado de la Aplicación sigue sin saber cuál es la escena, manteniendo las responsabilidades limpiamente separadas.

Ejemplo práctico: Configurar una aplicación iOS basada en escena

Paseemos por los pasos para configurar una nueva aplicación UIKit con los delegados de escena. Supongamos que está empezando por un proyecto Xcode vacío con la opción "Delegado de escena del uso" habilitada.

Paso 1: Configuración de la lista de datos

Xcode automatically adds the “Application Scene Manifest” entry. Open the Info.plist and verify it contains a dictionary with:

  • Permitir múltiples Windows: Sí (si quieres permitir múltiples ventanas; de lo contrario NO).
  • Configuraciones de escena: Una serie de diccionarios, cada uno de los cuales define un papel de escena (por ejemplo, “Aplicación de Windows”) y un nombre de clase delegado (por ejemplo, “$(PRODUCT MODULE NAME).SceneDelegate”).

Para una aplicación de una sola ventana, puede dejar varias ventanas desactivadas, pero todavía necesita la configuración de la escena para utilizar el Delegado de Escena.

Paso 2: Implementar el Delegado de Aplicación

En , eliminar cualquier propiedad de ventana. En lugar de ello, implementar sólo métodos de aplicación:

import UIKit

@main
class AppDelegate: UIResponder, UIApplicationDelegate {
 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
 // Configure analytics, core data, third-party SDKs
 return true
 }

 func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
 // Return a scene configuration to use for the new scene
 return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
 }

 func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) {
 // Called when the user discards a scene (e.g., closing a window)
 }
}

Paso 3: Implementar el Delegado de Escena

En , manejar la ventana y el ciclo de vida de escena:

import UIKit

class SceneDelegate: UIResponder, UIWindowSceneDelegate {
 var window: UIWindow?

 func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
 guard let windowScene = (scene as? UIWindowScene) else { return }
 let window = UIWindow(windowScene: windowScene)
 let viewController = ViewController()
 window.rootViewController = viewController
 self.window = window
 window.makeKeyAndVisible()
 }

 func sceneDidDisconnect(_ scene: UIScene) {
 // Called when the scene is being removed from the app
 }

 func sceneDidBecomeActive(_ scene: UIScene) {
 // Resume tasks
 }

 func sceneWillResignActive(_ scene: UIScene) {
 // Pause tasks
 }
}

Paso 4: Manejo de opciones de conexión de escenario

El en proporciona atajos, contextos de URL y actividades de usuario. Por ejemplo, para abrir un documento específico cuando el usuario toca un archivo:

if let urlContext = connectionOptions.urlContexts.first {
 // Intialize a document viewer with the URL
 urlContext.url.startAccessingSecurityScopedResource()
 // Load document and set root view controller
}

Esta separación mantiene el Delegado de la Aplicación inclinado y cada Delegado de Escena enfocado en su propia ventana.

Mejores prácticas y saltos comunes

Cuándo utilizar App Delegate vs. Delegado de Escena

  • Utilice el Delegado de Aplicación para la inicialización que debe suceder exactamente una vez por lanzamiento de la aplicación, como informes de fallos, autenticación de usuario o migración de bases de datos.
  • Utilice el Delegado de Escena para la configuración de la UI, ver la instantánea del controlador y la gestión estatal específica de la escena.
  • no acceder al compartido ] para obtener la ventana; en cambio, recuperar la ventana del delegado de la escena activa. En UIKit, utilizar pero prefiere pasar escenas explícitamente.

Migrando desde las aplicaciones de Legacy

Si tienes una aplicación de ventanilla única existente que utiliza el Delegado de Aplicación para la gestión de ventanas, puedes adoptar escenas añadiendo el código de escena y moviendo ventana a un nuevo Delegado de Escena. Prueba a fondo, especialmente si tu aplicación depende de , que está deprecatado en iOS 13+.

Consideraciones de memoria y rendimiento

Cada escena consume memoria y recursos. En el iPad, el sistema puede desconectar escenas cuando la memoria es baja. Implementar para liberar recursos específicos de escena. Evite almacenar grandes caches o datos en el Delegado de Escena; utilice el Delegado de Aplicación para caches de todo el app que pueden sobrevivir la desconexión de escena.

Manejo de delegados en SwiftUI

En SwiftUI, puede adjuntar un delegado de aplicación personalizado a través de . Sin embargo, para la gestión de escena, SwiftUI utiliza automáticamente la configuración de escena predeterminada. Si necesita comportamiento de escena personalizada (por ejemplo, manejo de contextos de URL por ventana), cree una clase conforme a y cedételalo en el manifiesto o a través del modificador]

Conclusión

El Delegado de App y el Delegado de Escena son pilares complementarios de la arquitectura moderna de aplicaciones iOS. El Delegado de App proporciona un único punto de control para eventos de nivel de aplicación, mientras que los Delegados administran ciclo de vida y interfaz de usuario per-ventana. Al entender sus distintas responsabilidades y cómo colaboran, puede crear aplicaciones que apoyen con gracia múltiples ventanas, restauración del estado y experiencias de usuario sensibles en todos los dispositivos iOS.