기존의 `AppDelegate` 클래스는 **`UIApplicationDelegate`** 프로토콜을 채택하여 앱의 전반적인 라이프사이클을 관리하고 앱의 동작을 제어하는 역할을 했지만, **iOS 13 이후부터는 라이프사이클을 관리하는 일부 역할을 [[Scene과 UISceneDelegate|SceneDelegate]]에게 넘겨줬다.** ![[WWDC_2019_Architecting_Your_App_for_Mulitiple_Windows_Session_Lifecycle.png|center|600]] 현재는 `AppDelegate`와 `SceneDelegate`가 앱의 전반적인 라이프사이클을 협력해 관리하고 있으며, `SceneDelegate`는 주로 **각 Scene에 대한 특화된 라이프사이클 이벤트**를 다루고, `AppDelegate`는 **전반적인 앱 라이프사이클과 여러 Scene 간의 상호작용을 관리**하는 역할을 한다. → [[iOS 앱의 life cycle 관리하기 (app-based, scene-based)]] 글 참고하기 → [WWDC 2019 Architecting Your App for Multiple Windows](https://developer.apple.com/videos/play/wwdc2019/258/) 영상 참고하기 <br> ## 주요 메서드 #### **앱의 시작과 종료 관리** ```swift optional func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil ) -> Bool ``` - **`application(_:didFinishLaunchingWithOptions:)`** - 앱이 처음 **실행될 때** 호출됨 - **초기 설정** 관련된 코드는 여기서 수행 - 앱이 시작된 이유를 나타내는 파라미터 `launchOption` 은 **앱이 외부 이벤트에 의해 시작되었을 때** 주로 사용됨 - 외부에서 푸시 알림을 통해 실행되는 경우 - URL 스키마를 통해 실행되는 경우 <br> ```swift optional func application( _ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil ) -> Bool ``` - **`application(_:willFinishLaunchingWithOptions:)`** - **앱 실행 직전**에 호출됨 - [[iOS 앱이 실행되는 순서]] <br> ```swift optional func applicationWillTerminate(_ application: UIApplication) ``` - **`applicationWillTerminate(_:)`** ^036e79 - 앱이 종료되기 직전에 호출됨 - 종료 전에 필요한 코드는 여기서 수행 <br> #### **앱의 상태 변화 감지** ```swift optional func applicationDidBecomeActive(_ application: UIApplication) ``` - **`applicationDidBecomeActive(_:)`** - 앱이 활성화될 때 호출됨 - 앱이 비활성화된 상태에서 일시 중지되거나 아직 시작되지 않은 태스크를 시작함 - 타이머를 다시 시작하거나 OpenGL 프레임 속도 조절 - 앱이 백그라운드에 있었다면 앱의 UI를 새로 고치기 위한 코드 수행 - 이 메서드를 호출한 후, UIKit은 상태 변화에 대응해야 하는 객체를 위해  [`didBecomeActiveNotification`](https://developer.apple.com/documentation/uikit/uiapplication/1622953-didbecomeactivenotification)을 post함 <br> ```swift optional func applicationDidEnterBackground(_ application: UIApplication) ``` - **`applicationDidEnterBackground(_:)`** - 앱이 백그라운드로 전환될 때 호출됨 - 백그라운드에서 실행되는 코드나 리소스 저장과 같은 작업 수행 - 나중에 앱이 종료될 경우 앱을 현재 상태로 복원하기 위한 앱 상태 정보 저장 - **가능한 빨리 return하기** - 작업을 수행하고 반환하기 까지 보통 약 5초가 걸리는데, 시간이 다 되기 전에 메서드를 반환하지 않으면 앱이 종료되고 메모리에서 제거됨 - 추가 시간이 필요한 경우 [`beginBackgroundTask(expirationHandler:)`](https://developer.apple.com/documentation/uikit/uiapplication/1623031-beginbackgroundtask) 호출하기 - 이 요청 또한 최대한 빨리 호출하기 - 요청 처리하는데도 시간이 걸리기 때문에 요청이 승인되기 전에 앱이 일시 중단될 가능성이 있음 - 마지막에 호출하지 말 것 - 앱이 일시 중단된 상태에서 백그라운드 작업이 시작되기 전에 앱이 중지될 수 있음 - 이 메서드를 호출한 후, UIKit은 상태 변화에 대응해야 하는 객체를 위해 [`didEnterBackgroundNotification`](https://developer.apple.com/documentation/uikit/uiapplication/1623071-didenterbackgroundnotification) 을 post함 <br> #### **메모리 경고 및 오류 처리** ```swift optional func applicationDidReceiveMemoryWarning(_ application: UIApplication) ``` - **`applicationDidReceiveMemoryWarning(_:)`** ^89e449 - 시스템이 메모리 부족 상태를 감지할 때 호출됨 - 불필요한 리소스를 해제하거나 메모리 사용을 최적화하는 등 메모리 관리와 관련된 작업을 수행할 수 있음 <br> #### **원격 푸시 알림 처리** ```swift optional func application( _ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void ) ``` - **`application(_:didReceiveRemoteNotification:fetchCompletionHandler:)`** - 원격 푸시 알림을 수신할 때 호출됨 - 알림을 처리하고 필요한 작업을 수행할 수 있음 <br><br><br><br><br> 바쁘다바빠 ![[아수라.jpeg|150]] <br> --- **참고 문서** https://developer.apple.com/documentation/uikit/uiapplicationdelegate <br> <br> <br> <br>