[iOS] AppDelegate와 SceneDelegate

2dubu·2022년 6월 20일
1

iOS

목록 보기
1/1
post-thumbnail

개요

Xcode에서 프로젝트를 생성하면 AppDelegate.swift와 SceneDelegate.swift 파일이 자동으로 생성됩니다.
평소 구글링을 하면서 어찌어찌 사용해왔는데 이번 글을 통해서 이 두 swift 파일에 있는 AppDelegate클래스와 SceneDelegate클래스에 대해서 제대로 정리해보려 합니다!

SceneDelegate의 등장

iOS 12이하의 버전에서는 앱이 하나의 프로세스와 하나의 유저 인터페이스 인스턴스만을 가지고 있었습니다. 그래서 AppDelegate만을 사용하여 앱의 생명주기와 UI의 생명주기에 관련된 로직들을 모두 다룰수 있었죠!

하지만 이후 iPad OS에서 multi- window가 가능해지면서 AppDelegate가 혼자서 맡던 역할 중 일부가 SceneDelegate에게 나눠지게 되었고

iOS 13 이후 버전부터는 AppDelegate는 앱의 생명주기를 관리하고, SceneDelegatesms 앱에서 스크린에 표시되어지는 UI의 생명주기를 관리하도록 변경되었습니다.

이렇게 SceneDelegate라는 친구가 등장하게 됩니다!


AppDelegate와 SenceDelegate의 역할은?

그렇다면 이제 본론으로! AppDelegate와 SenceDelegate는 어떤 역할을 할까요?

AppDelegate

AppDelegate는 iOS 버전에 무관하게 application의 entry point역할과 application level의 life-cycle을 관리합니다. iOS 13 이후의 버전에서도 여전히 AppDelegate는 앱의 시작점을 맡고 있습니다.

AppDelegate는 아래의 3가지 메서드를 기본적으로 가지고 있습니다. 메서드 별 역할은 다음과 같습니다!


1. func application(_: didFinishLaunchingWithOptions: ) -> Bool

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

첫 번째 메서드 didFinishLaunchingWithOptions는 앱을 처음 실행되고 앱의 초기 설정이 완료될 때 호출됩니다. iOS 13 이전 버전에서는 UIWindow 객체를 구성하고 해당 UIWindow에 Viewcontroller 인스턴스를 할당해 보여지는 화면을 설정하기 위해 사용하기도 했다고 합니다. 하지만 iOS 13 이후 버전부터는 앱이 Scene을 가지고 있다면 AppDelegate에서 처리하지 않고, SceneDelegate가 관리하도록 변경되었습니다.

주로 application의 setup을 이 메소드 안에서 진행하게 됩니다!



2. func application(_: configurationForConnecting:options: ) -> UISceneConfiguration

func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration

두 번째 메서드 configurationForConnecting사용자나 새로운 Scene이 생성될 때 호출됩니다. 해당 메서드가 리턴하는 객체를 통해 Scene에 대한 어떤 SceneDelegate를 사용하는지, 어떤 Storyboard를 사용하는지, 필요에 따라 어떤 Scene subclass를 사용하는지 등 Scene의 여러 Configuration을 설정합니다.

info.plist에 scene-configuration data를 정적으로 설정하여 해당 메서드를 대체할 수 있습니다!



3. func application (_ : didDiscardSceneSessions :)

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

scene이 background로 들어갔을 때 시스템이 자원을 확보하기 위해 disconnect하려고 할 수도 있습니다. (disconnect는 app을 종료시킨 것과는 다르다고 합니다! scene이 이 메소드로 전달되면 session에서 끊어진다는 것 뿐입니다.) 세 번째 메서드는 didDiscardSceneSessions는 이 상황에서 호출됩니다.

사용자가 앱을 종료시키면 applicationWillTerminate(_:) 함수가 실행됩니다! (테스트 해봤음!! 😁)


SceneDelegate

앞서 잠깐 설명 했듯이 iOS 13버전부터는 SceneDelegate가 AppDelegate로부터 UIWindow와 관련된 부분을 담당합니다. 앱은 하나 이상의 scene을 가질 수 있으며 이제 scene은 앱의 사용자 인터페이스 및 콘텐츠의 배경으로 사용됩니다. 따라서 SceneDelegate는 UI 및 데이터에 대한 권한을 가지고 있습니다.

SceneDelegate는 아래의 6가지 메소드를 기본적으로 가지고 있습니다. SceneDelegate도 마저 알아보도록 하겠습니닷.


1. scene(_:willConnectTo:options:)

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions)

첫 번째 메서드는 UISceneSession의 생명주기에서 첫번째로 호출되는 메서드이며, scene이 앱에 추가될 때 호출됩니다. 해당 메서드에서 새로운 UIWindow를 만들고, root view controller를 설정해주고, 디스플레이에 보여질 key window를 설정할 수 있습니다. 🥸


2. sceneDidDisconnect(_:)

func sceneDidDisconnect(_ scene: UIScene)

두 번째 메서드는 scene의 연결이 해제될 때 호출됩니다. (사용자가 앱을 종료할 때 호출됩니다.) 즉, scene이 메모리에서 제거되기 전의 최종 작업을 이 메서드에서 처리할 수 있습니다!
메모리를 확보하기 위해 시스템이 scene의 연결을 끊을 수 있는데 이 상황에서 또한 해당 메서드가 호출됩니다.



3. sceneDidBecomeActive(_:)

func sceneDidBecomeActive(_ scene: UIScene)

세 번째 메서드는 주로 WillEnterForeground(다섯 번째 메서드) 바로 뒤에 호출되며, Scene이 설정되고 화면에 표시할 준비할 때 사용합니다. App Switcher 모드였다가 돌아올 때 또한 호출됩니다!


4. sceneWillResignActive(_:)

func sceneWillEnterForeground(_ scene: UIScene)

네 번째 메서드는 사용자가 scene과의 상호작용을 중지할 때(active -> inactive) 호출됩니다. 즉, 홈 바를 쓸어올렸을 경우 또는 홈 버튼을 두 번 눌렀을 경우에 호출 됩니다! 이를 App Switcher 모드라 부릅니다.


5. sceneWillEnterForeground(_:)

func sceneWillEnterForeground(_ scene: UIScene)

다섯 번째 메서드는 앱이 처음 실행될 때나 완전한 backgound 상태에서 foreground 상태로 전환될 때 호출됩니다. (background 상태로 갔다가 바로 돌아오면 호출되지 않아요. background 상태에서 1초 이상 있어야 호출됩니다!)
또한 Scene이 화면에 표시되기 위해 foreground에 들어가기 때문에 이 메서드는 항상 sceneDidBecomeActive(_:) 메서드를 호출합니다.


6. sceneDidEnterBackground(_:)

func sceneDidEnterBackground(_ scene: UIScene)

마지막 여섯 번째 메서드는 scene이 화면에 표시되지 않고 완전한 background 상태로 진입할 때 호출됩니다. 사용자가 foreground에 돌아올 때 복원할 수 있도록 state정보를 저장하거나, 데이터를 저장하는 등의 작업을 처리할 수 있습니다!


참고한 글

AppDelegate와 SceneDelegate에 대해서 조사해보면서 앱 자체의 LifeCycle도 깊게 알아볼 수 있는 시간이었다. iOS 개발자라면 빈 프로젝트 파일을 만들어 어느 시점에 어떤 메서드가 호출되는지 한번 쯤은 테스트 해보는 것도 좋을 것 같다!

부족한 글 읽어주셔서 감사합니다. 틀린 부분이 있다면 알려주세요! 😊

profile
iOS Developer 👶🏻

0개의 댓글