기존의 `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>