O ciclo de vida da aplicação é muito importante para todos os desenvolvedores iOS que desejam tornar a experiência do usuário enriquecida, imersiva e suave. O gerenciamento desse ciclo de vida é responsável por lidar com ações do sistema quando o aplicativo estiver em primeiro ou em segundo plano e também eventos relacionados ao sistema.
Há diversos estados que são executados com o uso da aplicação e à medida que o estado muda, deve-se ajustar seu comportamento. O aplicativo que estiver em primeiro plano tem a prioridade sobre os recursos do sistema. E os aplicativos que estão em segundo plano devem fazer o mínimo possível de execuções e, de preferência, nada, porque estão fora da tela.
A cada alteração de estado, o UIKit é responsável por invocar o método apropriado. Até a versão 12 do iOS utilizamos eventos do ciclo de vida com base em aplicativos (App-Based) através do UIApplicationDelegate. No iOS 13 em diante foi introduzido eventos com base em cenas (Scene-Based) com UISceneDelegate
Ciclo de vida com base em aplicativos
Esse ciclo é utilizado no iOS 12 e versões anteriores, e em aplicativos que não suportam cenas. Aqui o AppDelegate gerencia todas as telas do aplicativo.
Ao iniciar um aplicativo, o sistema o coloca no estado inativo ou em segundo plano, dependendo se a interface está prestes a aparecer na tela. Ao iniciar em primeiro plano, o sistema faz a transição do aplicativo para o estado ativo automaticamente. Depois disso, o estado varia entre ativo e em segundo plano até o aplicativo ser fechado.
A imagem abaixo representa as transições com AppDelegate:
Métodos com base em aplicativos
Essas são os métodos executados em cada transição com base em aplicativos:
-
Os métodos responsáveis para o início do aplicativo são:
- application(_:willFinishLaunchingWithOptions:)
- application(_:didFinishLaunchingWithOptions:)
-
Ao entrar em primeiro plano esses métodos são executados:
- applicationWillEnterForeground(_:)
- applicationDidBecomeActive(_:)
-
Em segundo plano os métodos:
- applicationWillResignActive(_:)
- applicationDidEnterBackground(_:)
-
Método de finalização:
- applicationWillTerminate(_:)
Ciclo de vida com base em cenas
Para os aplicativos que suportam cenas há um novo ciclo de vida. Isso é resultado do novo suporte de multi-window que chegou com o iPadOS. Uma cena no iOS representa uma instância da interface do usuário do aplicativo em execução.
Enquanto o AppDelegate é responsável pelo ciclo de vida do aplicativo, o SceneDelegate é responsável pelo que é mostrado na tela; as cenas ou janelas. Dessa forma, cada cena tem seu próprio ciclo de vida, cada uma pode estar em um estado de execução diferente.
A imagem a seguir mostra as transições de estado para cenas:
Métodos com base em cenas
Essas são os métodos executados em cada transição com base em cenas:
-
Ao entrar em primeiro plano é executado:
- sceneWillEnterForeground(_:)
- sceneDidBecomeActive(_:)
-
Em segundo plano os métodos:
- sceneWillResignActive(_:)
- sceneDidEnterBackground(_:)
-
Ao adicionar uma nova cena:
- scene(_:willConnectTo:options:)
-
Remove a cena do aplicativo:
- sceneDidDisconnect(_:)
Responder a outros eventos significativos
Além dos eventos de ciclo de vida, os aplicativos também devem estar preparados para lidar com outras situações.
-
Avisos de memória:
- applicationDidReceiveMemoryWarning(_:)
- didReceiveMemoryWarning()
- didReceiveMemoryWarningNotification
-
Dados protegidos ficam disponíveis / indisponíveis:
- applicationProtectedDataDidBecomeAvailable(_:)
- applicationProtectedDataWillBecomeUnavailable(_:)
-
Tarefas do Handoff:
- application(_:didUpdate:)
-
Mudanças de horários:
- applicationSignificantTimeChange(_:)
-
Abrir algum um recurso:
- application(_:open:options:)