앱 사용 시 문자와 전화처럼 예기치 못한 상황 또는 사용자의 고의/실수로 앱을 종료하거나 백그라운드 등으로 전환하는 시점에 운영체제가 자동으로 호출하는 함수(메서드)들이 존재하며, 이러한 메서드 실행의 일련 과정을 앱 라이프 사이클(App Life Cycle)이라 부릅니다.
앱 라이프 사이클(App Life Cycle)은 AppDelegate와 SceneDelegate에 의해 관리되며 각각 하는 역할이 다릅니다.
Not Running
App이 실행되지 않은 상태를 의미합니다.
Foreground
App의 실행 화면(Scene)을 사용자에게 보여주는 상태(영역)를 의미합니다.
Background
App의 실행 화면(Scene)이 내려간 상태(영역)를 의미합니다.
Suspended
실행 대기 상태(영역)를 의미합니다. App의 실행 화면(Scene)이 내려가면 대부분의 App은 대기상 태로 전환됩니다.
✔︎AppDelegate
1. didFinishLaunchingWithOptions
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. return true }
Not Running 상태의 초기 App을 실행할 때 사용자에게 화면(Scene)이 보일 수 있도록 Foreground 영역에 접근하는 메서드이며, App 화면이 보이기 직전에 호출됩니다.
(해당 메서드는 Foreground 내부에 호출되는 메서드가 아님)2. configurationForConnecting
func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { // Called when a new scene session is being created. // Use this method to select a configuration to create the new scene with. return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) }
새로운 화면(Scene)을 생성할 때 호출되는 메서드입니다.
iOS 12 이전에는 하나의 디바이스에 단일 화면(Scene)만이 존재할 수 있었지만, iOS 13 부터는 하나의 디바이스(iPad)에 여러 화면을 가질 수 있게 되었습니다. (iPad의 멀태스킹/멀티화면 기능)
3. didDiscardSceneSessions
func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) { // Called when the user discards a scene session. // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions. // Use this method to release any resources that were specific to the discarded scenes, as they will not return. }
화면의 세션(Scene Session)이 제거되기(버려지기) 직전에 호출되는 메서드입니다.
해당 메서드는 운영체제의 판단하에 호출되는 메서드이며, 화면을 영구적으로 메모리에서 해제할 때만 해당 메서드가 호출됩니다. (Background에 있는 App이 종료되려고 할 때 호출되는 메서드는
applicationWillTerminate:
메서드입니다.)
✔︎SceneDelegate
0. scene()
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`. // If using a storyboard, the `window` property will automatically be initialized and attached to the scene. // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead). guard let _ = (scene as? UIWindowScene) else { return } }
화면(Scene)이 해당 App에 추가(연결)될 때 호출되는 메서드입니다.
1. sceneDidBecomeActive()
func sceneDidBecomeActive(_ scene: UIScene) { // Called when the scene has moved from an inactive state to an active state. // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive. }
화면(Scene)을 InActive에서 Active로 이동시킬 때 호출되는 메서드입니다.
App을 처음 실행할 때 사용자가 해당 App을 100% 조작할 수 있도록 Active로 안내?/이동? 시켜주는 메서드입니다. (해당 메서드는 Foreground 영역에서만 동작합니다.)
2. sceneWillResignActive()
func sceneWillResignActive(_ scene: UIScene) { // Called when the scene will move from an active state to an inactive state. // This may occur due to temporary interruptions (ex. an incoming phone call). }
화면(Scene)을 Active에서 InActive로 이동시킬 때 호출되는 메서드입니다.
App 사용 중 전화 또는 문자 등의 특정 이벤트가 접근했을 때 해당 App의 화면은
sceneWillResignActive()
메서드를 통해 Active에서 InActive로 이동합니다. (해당 메서드는 Foreground 영역에서만 동작합니다.)3. sceneDidEnterBackground()
func sceneDidEnterBackground(_ scene: UIScene) { // Called as the scene transitions from the foreground to the background. // Use this method to save data, release shared resources, and store enough scene-specific state information // to restore the scene back to its current state. }
화면(Scene)을 InActive에서 Background 영역으로 이동시킬 때 호출되는 메서드입니다.
4. sceneWillEnterForeground()
func sceneWillEnterForeground(_ scene: UIScene) { // Called as the scene transitions from the background to the foreground. // Use this method to undo the changes made on entering the background. }
화면(Scene)을 Background 영역에서 Foreground(InActive)영역으로 이동시킬 때 호출되는 메서드입니다.
5. sceneDidDisconnect()
func sceneDidDisconnect(_ scene: UIScene) { // Called as the scene is being released by the system. // This occurs shortly after the scene enters the background, or when its session is discarded. // Release any resources associated with this scene that can be re-created the next time the scene connects. // The scene may re-connect later, as its session was not necessarily discarded (see `application:didDiscardSceneSessions` instead). }
화면(Scene)이 해제될 때 호출되는 메서드입니다.
해당 메서드는 App의 화면이 Background 영역에 들어간 직후 또는 해당 화면의 세션(Scene Session)이 버려질 때 호출되는 메서드입니다. (메모리로부터 영구적으로 버려지는 것이 아닙니다. 이는 사용자가 해당 화면에 다시 접근할 수 있는 여지가 있기 때문입니다. 즉, 완전한 App 종료가 이님!!)
작성한 내용 중 틀린 부분이 있다면 꼭 알려주세요!! (공부하면서 나름대로 이해한 부분만을 요약)
Apple Developer - UIApplicationDelegate
Apple Developer - Scene
스위프트 하이
앨런 iOS 아이폰 앱 개발