# APPDelegate - 앱의 공유 동작을 관리하는 메서드 집합체! #### 12와 13의 차이 - UILifecycle 관리의 차이가 있다. - 12 AppDelegate - 12까지 AppDelegate에서는 UILifecycle까지 관리하였다. - 13 AppDelegate - UILifeCycle은 13이후로 AppDelegate에서 하지않고 Scene Delegate로 이동하여 관리를 진행하게된다. 1. iOS12 까지는 대부분의 앱에 하나의 `window`였지만 iOS13 부터는 `window`의 개념이 `scene`으로 대체되고 하나의 앱에서 여러개의 `scene`을 가질 수 있습니다. 2. AppDelegate의 역활중 UI상태를 알 수 있는 UILifeCycle에 대한 부분을 SceneDelegate가 하게 되었습니다. 3. AppDelegate에 Session lifecycle에 대한 역할이 추가 됐습니다. Scene Session이 생성되거나 삭제 될때 AppDelegate에 알리는 두 메소드가 추가 되었습니다. Scene Session은 앱에서 생성한 모든 scene의 정보를 관리합니다.<br> ```swift 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) } 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. } ``` |UIApplicationDelegagte|UISceneDelegate| |:------:|:---:| |x(이동 ->)|o(생김)| |application:willEnterForeground|scene:willEnterForground| |application:didEnterBackground|scene:didEnterBackground| |application:willResignActive|scene:willResignActive| |application:didBecomeActive|scene:didBecomeActive| 근데 Scene 가 뭔데? 민트가 했을꺼다.. 자 민트 알려줘! 해줘! 민트가 해줘! 앱의 라이프싸이클넘겨놓고 이제 넌 뭐해?? iOS13부터 AppDelegate가 하는일 1. 앱의 가장 중요한 데이터 구조를 초기화 하는것?? 2. 앱의 scene을 환경설정(configuration)하는것 3. 앱 밖에서 발생한 알림(배터리, 다운로드)에 대응 4. 애플 푸쉬 알림 서비스와 같이 실행시 요구되는 모든 서비스를 등록하는것. ### 앱 상태 1. Not Running - 앱이 실행되지 않았거나, 완전히 종료되어 동작하지 않을때 2. Inactive(Foreground) - 앱이 실행 되면서 foreground에 진입하지만, 어떠한 이벤트도 받지않는 상태 앱의 상태 전환 과정에서 잠깐 머무는 단계 3. Active(Foreground) - 앱이 실행 중이며, foreground에 있고, 이벤트를 받고 있는 상태 4. Background - 앱이 백그라운드에 있으며 다른 앱으로 전환되었거나 홈버튼을 눌러 밖으로 나갔을때 상태 5. Suspended - 앱이 Background상태에 있지만, 아무 코드도 실행하지않는상태 - 백그라운드에서 특벽한 작업이 없을 경우 Suspended상태가된다. ### AppDelegate 객체의 메소드 호출 - Not Runung 상태 일때 ```swift func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. return true } 앱 실행을 위한 모든 준비가 끝난 후 화면이 사용자에게 보여지기 직전에 호출됩니다. ``` 이거 하나 사용하고 나머지 상태일때는 다 `scene`에서 쓰는거같다. - 추가적으로 앱델이게이트에서 쓸수 있는 메서드이다. 기본적으로 코드가 작성되어있지않기에 추가해주면된다. ```swift applicationWillResignActive: 앱이 active에서 inactive로 이동될때 사용 applicationDidEnterBackground: 앱이 backgrund 상태일 때 실행 applicationWillEnterForeground: 앱이 background에서 foreground로 이동 될때실행 applicationDidBecomeActive: 앱이 active 상태가 되어 실행 중일때 apllicationWillTerminate: 앱이 종료될때 ``` ### 얼추 마무리 단계? - iOS12까지는 하나의 앱이 하나의 윈도우(window)만 가지기 때문에 AppDelegate클래스가 UI생명주기 관리까지 했습니다. - 하지만 iOS13부터 하나의 앱에 여러 개의 윈도우(window)를 동시에 사용할 수 있게 되었기 때문에 UI생명주기를 전담 관리해줄 클래스가 필요해졌다. 그렇기에 SceneDelegate가 생겼습니다~ - window 뭔데? 당신이 대장인가요?? - 사용자 인터페이스의 기본적인 컨테이너이다. 13부터 SceneDelegate를 통해서 다중 창 환경에 있어 효율적으로 관리를 할 수 있다. - SceneDelegate는 다중 창 환경에서 각각의 Scene(화면)에 대한 라이프사이클 관리 및 설정을 담당합니다. 각 Scene은 하나의 UIWindow와 연결되어 있을 수 있습니다. 따라서 SceneDelegate는 앱의 여러 창에서 각각의 창에 대한 UI와 상태를 관리합니다.