[iOS] Scene Delegate vs App Delegate

LEEHAKJIN-VV·2022년 7월 6일
0

iOS 정리

목록 보기
2/7

iOS 개발 공부를 하는 도중, 프로젝트 탭에 있는 두 가지의 클래스 Scene Delegate vs App Delegate가 언제 사용되는지, 어떤 역할을 하는지, 차이점이 무엇인지 등 몇 개의 블로그 및 공식 문서를 참조하여 정리한 글입니다. iOS 공부 초기이므로 잘못된 정보나 공식 문서 번역 과정에서 오역이 있을 수도 있습니다.

xcode 프로젝트를 생성하면 자동으로 생성되는 2가지 파일

App Delegate 클래스

App Delegeate 클래스의 역할은 무엇일까??

먼저 공식문서를 보자

번역을 하면 대충 이렇다.

app delegate 객체는 앱의 공유되는 behaviors를 관리한다. app delegate는 앱의 루트(핵심?) 객체이며 UIApplication과 같이 시스템과 상호작용을 관리한다. app delegate 객체는 앱의 실행 초기에 UIkit이 만들며, 앱이 종료될 때까지 유지된다.

여기서 app delegate라는 용어가 사용되는데, app delegate는 App Delegate 클래스의 인스턴스이다. 즉 App Delegate 클래스는 인스턴스인 app delegate를 오직 1개 만들어 앱을 관리하는 역할을 하는 것이다.

애플에서는 app delegate를 사용하여 다음 작업을 처리할 것을 권장한다.

  • 앱의 central 자료구조를 초기화

  • 앱의 scenes를 configuring

  • 배터리 부족, 다운로드 완료 알림과 같이 앱의 외부에서 발생하는 알림에 응답

  • 앱의 scenes, view, view controller에 특정하는 것이 아닌 앱 자체를 대상으로 하는 이벤트에 응답

  • 앱이 시작될 때 Apple Push Notification 서비스와 같이 필요한 서비스를 등록

지금 소개하는 App delegate는 iOS 13 이후에 사용되는 App delegate 클래스에 대한 설명이다. iOS13이전( ~ iOS12)에는 역할이 달랐다. 아래에 iOS 13에 추가로 생긴 역할과 Scene Delegate에 대한 설명을 기술한다.

Scene Delegate vs App Delegate

Scene Delegate를 설명하기 전에 iOS 13이전의 App Delegate 클래스의 역할을 보자.

(WWDC 2019 자료)

사진과 같이 2가지의 Lifeclycle을 관리하는데 각각 Process(앱), UI의 사이클을 관리한다.

그러나 iOS13 이후부터는 역할이 다음과 같이 변경되었다.

App Delegate는 UI의 라이프사이클을 관리하지 않는다. 그러면 UI의 라이프 사이클은 누가 관리할까?

바로 새로 나타난 Scene Delegate 클래스가 UI 라이프사이클을 관리한다. 아래 그림과 같이 기존에는 아래 메소드를 사용하여 AppDelegate가 UILifeCycle을 관리하였는데 이들이 사라지고 SceneDeleage에 다음 메소드가 추가되면서 관리를 한다.

각 메소드에 대해 간단히 설명하면 다음과 같다.

  • sceneDidDisconnect(_:): scene가 background에 진입하거나 discarded된 직후에 호출됨, scene와 관련된 모드 리소스를 해지함(나중에 다시 연결될 수 있음)

  • sceneDidBecomeActive: scene가 inactive(비활성)상태 에서 active(활성)상태로 이동할 떄 호출, scene가 inactive상태일 때 중단되었던 작업을 다시 시작하려면 메소드를 사용하면 됨.

  • sceneWillResignActive: scene가 active 상태에서 inactive 상태로 이동할 때 호출. ex) 전화 수신

  • sceneWillEnterForeground: scene가 background에서 foreground로 전환될 때 호출

  • sceneDidEnterBackground: scene가 foreground에서 background로 전환될 때 호출, 현재 상태로 되돌아 오기 위해 데이터를 저장하거나 공유된 자원을 해지하는 작업을 할때 이 메소드에서 작업하면 됨.

그런데 Scene Delegate 클래스가 생겨난 이유가 단순히 UI 라이프사이클을 관리하기 위해서 생겨났을까??

사실 iOS 13부터는 iPad에서 multipe windows(scene)을 지원하기 시작했다. 이전에 앱에는 1개의 window만 존재했지만 iOS 13부터는 window가 scene으로 대체되고 하나의 앱이 여러 개의 scene을 가지게 되면서 이를 관리하는 새로운 클래스가 필요하기 때문에 Scene Delegate가 생겨난 게 아닐까 라고 추측한다.(개인적인 생각)

그러면 여기서 말하는 Scene는 무엇일까?? 공식문서 를 확인해 보면...

UIKit은 UIWindowScene 객체를 사용하여 앱의 UI의 인스턴스를 관리한다. 각각의 scene는 window와 view controller를 가지며 UI 하나당 1개의 인스턴스가 생성된다. 또한 UIWinodwSeceneDelegate 객체를 사용하여 UIKit과 앱 사이에서 상호작용을 조정하는 데 도움을 준다. Scenes들은 같은 메모리와 앱 프로세스 공간을 공유하면서, 동시에 실행된다. 그 결과, 하나의 앱은 여러 가지의 scene와 scene delegate 객체를 동시에 활성화시킬 수 있다.

공식 문서를 쭉 읽어봤는데, scene라는 객체가 VC와 window를 가지며, UI 하나당 1개의 scene가 생성 되며, 1개의 앱은 multiple scenes가 가능하다는 정도로만 이해했다.

그리고 또 UIWindowScene, UIWinodwSeceneDelegate와 같은 용어가 새로 나와 각각 정리하자면 아래와 같다.

  • UIScene: 앱의 UI(user interface)의 인스턴스를 나타내는 객체로, 일반적으로 UIKit은 UIScene 객체 대신 UIWindowScene 객체를 생성하지만 UIScene 객체의 메소드나 프로퍼티를 사용하여 scene에 접근함.

  • UIWindowScene: 앱에서 1개 이상의 scene를 관리하는 클래스로, UIScene클래스를 상속한다.UIWindowScene 클래스의 인스턴스를 직접 생성할 수 없는 대신, UIKit이 info.plist파일에서 사용자가 추가하기를 원하는 scene와 일치하는 정보를 찾아 생성한다.

  • UISceneConfiguration: scene를 생성할 때 UIkit이 참고할 객체 및 스토리보드 정보를 가지고 있는 클래스

  • UIWindowSceneDelegate: UI의 인스턴스의 생명주기를 관리하는 프로토콜로, UISceneDelegate프로토콜을 따른다. scene가 화면에 연결되거나, foreground로 전환되거나 등 알림을 받을 때 사용하거나, scene에 변화가 생긴 경우 이에 반응하기를 원할 때 사용할 수 있다.

(애플 공식문서 Scenes) 사진

이렇게 새로운 scene라는 개념이 생겨나면서 App Delegate에도 Session LifeCycle 관리라는 새로운 역할이 생겼다.

그러면 Session LifeCycle을 관리한다는 게 무슨 의미일까?? 우선 scene라는 개념이 생겨나면서 UILifecycle 관리를 Scene Delegate가 수행한다. 그러면 App Delegate는 Scene Session을 통해서 scene에 대한 정보를 받는 것이다. 그렇기 때문에 이 Secene Session을 관리하는 것이 필요하다. 이를 위해 사용되는 메소드 중 아래 2가지를 소개한다.

AppDelegate의 UISession 관리 메소드

  • application(_:configurationForConnecting:options:): application이 iOS의 화면에 새로운 scene를 생성하려고 할 때 호출되는 메소드.

  • application(_:didDiscardSceneSessions:): 사용자가 scene를 제거할 때 호출되는 메소드로 사용자는 scene를 위해 할당하였던 자원을 해지할 수 있음.

참고 자료

공식문서

https://developer.apple.com/documentation/uikit/uiscenedelegate
https://developer.apple.com/documentation/uikit/app_and_environment/scenes
https://developer.apple.com/documentation/uikit/uiwindowscene
https://developer.apple.com/documentation/uikit/uiscene
https://developer.apple.com/documentation/uikit/uiapplicationdelegate
https://developer.apple.com/videos/play/wwdc2019/258/

다른 블로그

https://velog.io/@dev-lena/iOS-AppDelegate%EC%99%80-SceneDelegate
https://zeddios.tistory.com/811
https://manasaprema04.medium.com/scene-delegate-vs-appdelegate-86e22dc17fcb

공식문서 번역 과정에서 오역이 있을 수도 있습니다. 잘못된 내용이나, 틀린 내용, 오타 및 오역은 댓글로 남겨주세요

0개의 댓글