본문 바로가기
개린이 이야기

AppDelegate와 Scene Delegate에 관하여

by iOS 개린이 2022. 9. 20.

-스토리보드 없이 코드만으로 UI를 구성하는데 선행학습으로 AppDelegate와 SceneDelegate에 관해 공부해봐야겠다는 생각이 들어 deep diving 해본다.

 

 

-ios13 이전까지는 AppDelegate에서 Process Lifecycle과 UI Lifecycle과 같은 생명주기들을 관리했었다.

하지만 그림과 같이 ios13부터 Scene Delegate라는 것이 생기면서 AppDelegate에서 UI Lifecycle이 떨어져 나가 SceneDelegate에서 관리하게 되었고, AppDelegate는 Process Lifecycle(기존에 있던)과 Session Lifecycle(scene에 대한 정보를 관리할 수 있는)이 추가되었다.

 

-Scene Delegate의 등장 배경 : ios13 이전까지는 하나의 앱에 하나의 window(화면)를 보여줄 수 있었는데 ios13부터 window라는 개념이 scene으로 대체되면서 하나의 앱에서 여러 개의 scene을 보여줄 수 있게 되었다.

 

 

 

     

AppDelegate에서 관리하던 UI 관련 메서드들이 Scene Delegate로 이전되고 1:1 매핑되었다.

 

 

AppDelegate

-Process Lifecycle : 앱의 프로세스 수준을 관리한다. (시스템이 앱을 실행하거나 종료할 때 App Delegate에 알려줌)

Session Lifecycle : Scene Delegate에서 새로운 Scene Session이 생성되거나 기존 Scene Session이 삭제될 때  App Delegate에 알려줌

 

-하는 일

1. 앱의 가장 중요한 데이터 구조를 초기화

2. 앱의 scene 환경설정(Configuration)

3. 앱 밖에서 발생한 알림에 대응(배터리 부족, 다운로드 완료 등)

4. 특정한 scenes, views, viewController에 한정되지 않고 앱 자체를 타깃 하는 이벤트에 대응

5. 애플 푸시 알림 서비스와 같이 요구되는 모든 서비스를 등록

 

 

-default 메서드

1. didFinishLaunchingWithOptions

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        
      return true
}

 

-앱이 처음 실행될 때 호출되는 메서드이다.

-반환하는 true는 해당 메서드에 명시되어 있는 조건들을 만족할 때 앱이 실행된다는 것을 뜻한다.

 

 

2. configurationForConnecting

func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
        
    return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
}

 

-scene을 만들려고 할 때 어떻게 구성되어 있는지 알기 위해 scene과 관련된 정보를 추적한다.

-scene delegate나 storyboard 등으로 정보를 알 수 있다.

-Configuration(구성)은 info.plist를 이용하여 정적으로 정의, 해당 메서드 내에 코드를 통해 동적으로 정의가 가능하다.

 

 

3. didDiscardSceneSessions

func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
    
}

 

-앱이 종료될 때 실행된다. ex) 홈 버튼을 두 번 눌러서 나오는 app switcher를 통해 앱을 제거할 때 실행된다.

-데이터를 유지하기 위해 앱이 종료될 때 마지막 상태(복구 관련 정보)를 기억해두었다가 나중에 다시 실행할 때 사용할 수 있게 해 준다.

 

 

Scene Delegate

-UI Lifecycle : UI의 상태를 담당한다. UISceneSession의 scene생성, 해제 등과 같은 Lifecycle 이벤트를 담당한다.

-화면에 무엇을 보여줄지 관리하는 역할

 

 

-default 메서드

1.  willConnectTo

 func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        
      guard let _ = (scene as? UIWindowScene) else { return }
}

 

-UISceneSession 생명주기에서 첫 번째로 실행된다.

-새로 지정된 UI Window를 만든다.

-window를 만들었을 때 User Activity나 state Restoration Activity를 확인해야 한다.

state Restoration Activity는 상태 복원을 말하며 disconnected 된 UI를 이전 상태로 되돌리는 것이다.

-rootViewController를 설정해준다.

 

 

2. sceneWillEnterForeground

func sceneWillEnterForeground(_ scene: UIScene) {}

 

-처음 앱이 active 상태로 가거나 background 상태에서 foreground 상태로 넘어올 때 실행된다.

 

 

3. sceneDidBecomeActive

func sceneDidBecomeActive(_ scene: UIScene) { }

 

-scene이 화면에 보이고 사용될 준비가 완료되었을 때 실행된다.

-inActive 상태에서 active 상태로 전환될 때도 사용된다.

 

 

4. sceneWillResignActive

func sceneWillResignActive(_ scene: UIScene) {}

 

-active에서 inActive로 갈 때 실행된다.

-사용자가 scene과 상호작용을 중지할 때 호출된다.

 

 

5. sceneDidDisconnect

func sceneDidDisconnect(_ scene: UIScene) {}

 

-scene의 연결이 해제되었을 때 실행된다.

-앱이 길게 background 상태에 있다면 시스템에서 사용하지도 않는 scene 메모리를 해제한다. 이것은 앱의 종료를 뜻하는 것이 아니라 scene이 session과 연결이 해제되는 것을 말한다.

-메서드 내에서 해야 할 중요한 작업으로는 필요 없는 자원은 돌려주는 작업이다.

ex) 복원이 어려운 데이터는 유지하고 쉬운 데이터들은 회수

 

 

6. sceneDidEnterBackground

func sceneDidEnterBackground(_ scene: UIScene) {}

 

-foreground에서 background로 갈 때 실행된다.

-다시 foreground로 돌아갈 때 복원할 수 있도록 상태 정보, 데이터 등을 저장하는 작업을 하면 좋다.

 

 

 

앱의 Lifecycle

 

1. didFinishLaunchingWithOptions : 앱 실행 시 가장 먼저 호출되는 메서드

2. configurationForConnecting : 다음으로 호출되는 메서드로 scene에 대한 구성을 알기 위해서 관련 정보를 추적

여기까지 실행되었을 때 아직 UI를 볼 수 없다. 

 

3. Scene Delegate의 willConnectTo : 새로 지정된 UI Window를 설정. (UI 등장)

4. willResignActive

5. didEnterBackground

6. didDisconnect : scene과의 연결 해제

 

7. AppDelegate의 didDiscardSceneSessions : 앱이 종료되었을 때 호출되는 메서드

 

 

 

 

 

 

출처:

[iOS] AppDelegate와 SceneDelegate (velog.io)

[iOS] App의 생명주기 (Life Cycle) (tistory.com)

https://babywalnut.github.io/my-blog/ios/AppDelegate-SceneDelegate/

https://sueaty.tistory.com/134

[iOS 앱개발] Multiple Window를 위한 SceneDelegate (tistory.com)

[iOS] AppDelegate & SceneDelegate (tistory.com)