Table of Contents
Compreender o papel dos Delegados de App e Delegados de Cena no desenvolvimento do iOS
Desde as primeiras versões do iOS, o protocolo UIApplicationDelegate foi a espinha dorsal do gerenciamento do ciclo de vida do aplicativo iOS. No entanto, a introdução do suporte multijanela no iOS 13 mudou fundamentalmente como os desenvolvedores lidam com interfaces de usuário. A Apple introduziu o protocolo UISceneDelegate[] para dissociar responsabilidades amplas de aplicativos da gestão por janela. Compreender os papéis precisos desses dois delegados é essencial para a construção de aplicativos iOS modernos, multijaneladores – se se se se direcionam para iPhones, iPads ou Mac Catalyst. Este artigo fornece uma exploração abrangente de ambos os delegados, seus métodos de ciclo de vida, e melhores práticas para usá-los de forma eficaz.
O que é um Delegado do App?
O Excelente de App é o ponto de entrada e coordenador central para uma aplicação iOS. Ele está em conformidade com o protocolo e é responsável pelo tratamento de eventos de aplicativo de alto nível que afetam toda a aplicação. Estes eventos incluem lançamento de aplicativos, terminação, avisos de memória, busca de fundos e registro de notificação remoto. O objeto do Delegado de App é instanciado automaticamente pelo sistema no lançamento e permanece vivo durante o tempo de todo o processo.
Métodos de ciclo de vida principal
O Delegado do App define vários métodos críticos que o sistema chama em resposta às alterações de estado do aplicativo:
- — Chamado após o início do aplicativo. É aqui que você inicializa SDKs de terceiros, configura pilhas de dados de núcleo, configura a aparência global e restaura o estado do aplicativo. Retornando indica que o aplicativo não pode lidar com a URL ou atividade que causou o lançamento.
- — Invocado quando o aplicativo passa do estado inativo para o ativo. Use isso para retomar tarefas pausadas, atualizar UI ou reiniciar animações.
- — Chamado quando o aplicativo está prestes a ficar inativo (por exemplo, chamada telefônica recebida, usuário pressiona o botão Bloqueio). Salve o estado, pause jogos e reduza o uso de recursos.
- — Enviado quando o aplicativo se mover para o fundo. Execute a limpeza final, solte recursos compartilhados e agendar tarefas de fundo.
- — Chamado pouco antes da aplicação voltar ao primeiro plano após ser em segundo plano. Desfazer as alterações feitas em .
- — Invocado quando o aplicativo está prestes a ser encerrado. Salve dados críticos e recursos de liberação. Nota: isso não é chamado em versões modernas do iOS para aplicativos em segundo plano, a menos que especificamente morto.
Responsabilidades adicionais
Além da gestão do ciclo de vida, o Delegado do App lida com vários serviços de aplicação:
- Notificações remotas e locais: Registre-se para notificações remotas via e lide com notificações recebidas com .
- Handling URLs and Handoff:] O Delegado do App responde a esquemas de URL personalizados e Links Universais através de e gerencia a atividade Handoff via .
- Advertências de memória: permite que o aplicativo libere caches, imagens e outros recursos descartáveis.
- Antecedentes Buscar: Implementar para baixar conteúdo periodicamente enquanto o aplicativo está em segundo plano.
- Assista Conectividade e Grupos de aplicativos: Coordene o compartilhamento de dados entre o aplicativo iOS e o app Watch acompanhante através do Delegado do App.
Contexto Histórico
Antes do iOS 13, o Delegado do App também era responsável pela gestão da única instância de janela do aplicativo. Os desenvolvedores definiram o controlador de visualização raiz dentro . Este design era simples, mas limitante – não poderia suportar várias janelas simultâneas. A introdução de cenas no iOS 13 moveu o gerenciamento de janelas para separar objetos delegados, deixando o Delegado do App livre para focar exclusivamente em preocupações amplas de aplicativos.
O que é um Delegado da Cena?
Com o iOS 13 e iPadOS 13, a Apple introduziu o protocolo UISceneDelegate para suportar várias janelas por app. Uma cena representa uma instância da interface de usuário do seu aplicativo, tipicamente apoiada por um objeto . Cada cena tem seu próprio ciclo de vida e pode ser exibida em um display separado ou em um espaço separado no iPad. O Scene Delegate[] gerencia um ciclo de vida específico da cena, estado de interface do usuário e interações.
Ativando o Suporte a Multi- Janelas
Para usar cenas, você deve optar por configurar o aplicativo com a chave “Application Scene Manifest”. Este manifesto define as configurações da cena, incluindo os nomes de classe delegados e funções de sessão. Sem este manifesto, o iOS trata o aplicativo como uma janela única e continua usando o gerenciamento de janelas do aplicativo legado Delegado.
Métodos de ciclo de vida da cena principal
O Delegado da Cena implementa métodos análogos ao Delegado do App, mas escopos em uma cena:
- — Chamado quando uma nova cena está prestes a ser adicionada ao aplicativo. Aqui é onde você configura o controlador de visão raiz da cena e a UI inicial. Você recebe um objeto que fornece informações sobre o URL, atividade ou atalho que desencadeou a cena.
- — A cena torna-se ativa (antecedente e em foco). Retomar atividades pausadas, iniciar animações e atualizar dados.
- — A cena está prestes a ficar inativa (por exemplo, gesto multitarefa, troca de aplicativos). Salve as operações de estado e pausa.
- — A cena move-se para o fundo. Release recursos, salve dados e agendar tarefas de fundo para esta cena.
- — A cena está prestes a tornar-se activa em primeiro plano. Desfaça as alterações de fundo.
- — Chamado quando o sistema remove a cena da aplicação (por exemplo, o utilizador fecha uma janela no iPad, ou a aplicação vai para o fundo e o sistema decide descartar a cena). Realizar limpeza final específica para essa cena.
Sessões e Funções da Cena
Cada cena está associada a um objeto que persiste em lançamentos. As sessões podem ser reutilizadas ou criadas de novo. A sessão contém uma propriedade que indica se a cena é para a interface principal do aplicativo () ou para uma exibição externa (). O Delegado de Cenas pode verificar o papel da sessão para adaptar seu comportamento.
Delegado da cena em SwiftUI
Para aplicativos SwiftUI, o Delegado de Cenas é muitas vezes gerado automaticamente quando você inicia um novo projeto com o objetivo de iOS 14+. No entanto, você ainda pode criar um Delegado de Cena personalizado usando o invólucro de propriedade na sua estrutura . A cena da SwiftUI] usa implicitamente , mas você pode sobrepor o comportamento delegando-se a ] em um adaptador.
Principais diferenças entre o Delegado do App e o Delegado da Cena
Enquanto ambos os delegados gerem o ciclo de vida, o seu âmbito e responsabilidades diferem significativamente:
- Scope: O Delegado do App opera no nível do processo de aplicação; existe apenas um por aplicativo. O Delegado da Cena opera no nível da cena (ou janela); você pode ter vários delegados da cena em execução simultaneamente.
- Introdução: O Delegado de App existe desde iOS 2.O Delegado de Cena foi introduzido no iOS 13 para permitir suporte a janelas múltiplas.
- Gestão de janelas: Em aplicações legados, o Delegado do App possui a janela. Em aplicações baseadas em cenas, cada Delegado de Cenas possui a janela da sua cena. O Delegado do App já não acessa a janela diretamente.
- Preservação do Estado: Os aplicativos que utilizam cenas devem implementar a preservação e restauração do estado no nível da cena (via ] ou , não apenas através do Delegado do App.
- Atribuições de Antecedentes: Em geral, as tarefas de fundo podem ser acionadas em toda a aplicação (via App Delegate) ou por cena (via Scene Delegate). No entanto, certos modos de fundo, como a recolha de fundos, ainda são geridos pelo App Delegate.
Como eles trabalham juntos em uma aplicação moderna
Em uma aplicação iOS baseada em cena, o Delegado do App e Delegado da Cena formam uma arquitetura em camadas. O Delegado do App inicializa infraestrutura compartilhada – logging, analytics, base de dados central – e lida com eventos que não pertencem a uma determinada cena. Quando o sistema precisa exibir novo conteúdo, cria uma cena e associa um Delegado da Cena. O Delegado da Cena então constrói a UI, conecta-se à sessão de cena e gerencia interações de usuário dentro dessa cena.
Coordenação durante o lançamento
Quando um usuário abre o aplicativo, o sistema chama o Delegado do App . Depois disso, o sistema cria uma cena e chama no Delegado da Cena. Se o aplicativo for reaberto via Handoff ou um atalho, o entrega a atividade relevante, URL ou atividade do usuário ao Delegado apropriado.
Restauração do Estado nas Cenas
A restauração do estado é crucial para uma multitarefa sem costura. Cada cena deve codificar seu estado usando no método do Delegado da Cena . O Delegado da Aplicação é responsável por fornecer tipos de atividade através de ao criar uma sessão de cena. Esta coordenação garante que as cenas reabertas restabeleçam seu conteúdo – por exemplo, um aplicativo de documento pode reabrir o arquivo exato que o usuário estava editando em cada janela.
Manuseando telas externas
No iPad, uma cena pode ser criada em um monitor externo via "AirPlay" ou "Sidecar". Ao inspecionar o papel , o Delegado da Cena pode ajustar sua interface de usuário para corresponder à resolução e capacidades do display externo. O Delegado da App permanece inconsciente de que exibição a cena está ligada, mantendo responsabilidades perfeitamente separadas.
Exemplo prático: Configurar um aplicativo iOS baseado em cenas
Vamos percorrer os passos para configurar um novo aplicativo UIKit com delegados de cena. Suponha que você está começando a partir de um projeto Xcode vazio com a opção “Use Scene Delegate” ativada.
Passo 1: Configuração do Info.plist
Xcode automatically adds the “Application Scene Manifest” entry. Open the Info.plist and verify it contains a dictionary with:
- Ativar várias janelas : SIM (se você quiser permitir várias janelas; caso contrário, NÃO).
- Configurações da cena: Uma matriz de dicionários, cada um definindo uma função de cena (por exemplo, “Aplicação de janela”) e um nome de classe delegado (por exemplo, “$(PRODUCT MODULE NAME).
Para uma aplicação de janela única, pode deixar várias janelas desactivadas, mas ainda necessita da configuração da cena para usar o Delegado da Cena.
Passo 2: Implementar o Delegado do App
Em , remova qualquer propriedade da janela. Em vez disso, implemente apenas métodos de aplicação:
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)
}
}
Passo 3: Implementar o Delegado da Cena
Em , gerencie o ciclo de vida da janela e da cena:
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
}
}
Passo 4: Manuseando opções de conexão de cena
O em fornece atalhos, contextos de URL e atividades do usuário. Por exemplo, para abrir um documento específico quando o usuário toca em um arquivo:
if let urlContext = connectionOptions.urlContexts.first {
// Intialize a document viewer with the URL
urlContext.url.startAccessingSecurityScopedResource()
// Load document and set root view controller
}
Esta separação mantém o Delegado App magro e cada Delegado Cena focado em sua própria janela.
Melhores práticas e armadilhas comuns
Quando usar o Delegado de App vs. Delegado de Cena
- Use o App Delegate para inicialização que deve acontecer exatamente uma vez por lançamento do aplicativo, como relatórios de falhas, autenticação do usuário ou migração de banco de dados.
- Use o Delegado de Cena para configuração de UI, instanciação de visor de controle e gerenciamento de estado específico de cena.
- Fazer ]not acessar o compartilhado para obter a janela; em vez disso, recuperar a janela do delegado da cena ativa. Em UIKit, use mas prefira passar cenas explicitamente.
Migrando de aplicativos legados
Se você tiver uma aplicação de janela única existente que utiliza o App Delegate para gerenciamento de janelas, você pode adotar cenas adicionando o manifesto de cena e movendo o código relacionado a uma nova ferramenta. Teste completamente, especialmente se sua aplicação depender de , que está desprecado no iOS 13+.
Memória e Considerações de Desempenho
Cada cena consome memória e recursos. No iPad, o sistema pode desconectar cenas quando a memória está baixa. Implemente para liberar recursos específicos da cena. Evite armazenar caches grandes ou dados no Delegado da Cena; use o Delegado do aplicativo para caches amplas que possam sobreviver à desconexão da cena.
Lidando com Delegados na SwiftUI
No SwiftUI, você pode anexar um Delegado de App personalizado via . No entanto, para gerenciamento de cenas, o SwiftUI’s usa automaticamente a configuração padrão da cena. Se você precisar de comportamento personalizado de cena (por exemplo, lidar com contextos URL por janela), crie uma classe conforme com e atribua-a no manifesto ou através do modificador .
Conclusão
O Delegado de App e o Delegado de Cena são pilares complementares da arquitetura moderna de aplicativos iOS. O Delegado de App fornece um único ponto de controle para eventos de nível de aplicação, enquanto os Delegados de Cena gerenciam por ciclo de vida de janela e interface de usuário. Ao entender suas responsabilidades distintas e como eles colaboram, você pode construir aplicativos que suportam graciosamente várias janelas, restauração de estado e experiências de usuário responsivas em todos os dispositivos iOS. Para leitura adicional, consulte o UIAplicaçãoDelegar documentação, o UISceneDelegar documentação[, e o Gerenciando o ciclo de vida do aplicativo.