iOS 개발 공부를 하는 도중, 프로젝트 탭에 있는 두 가지의 클래스 Scene Delegate vs App Delegate가 언제 사용되는지, 어떤 역할을 하는지, 차이점이 무엇인지 등 몇 개의 블로그 및 공식 문서를 참조하여 정리한 글입니다. iOS 공부 초기이므로 잘못된 정보나 공식 문서 번역 과정에서 오역이 있을 수도 있습니다.
xcode 프로젝트를 생성하면 자동으로 생성되는 2가지 파일
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를 설명하기 전에 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
공식문서 번역 과정에서 오역이 있을 수도 있습니다. 잘못된 내용이나, 틀린 내용, 오타 및 오역은 댓글로 남겨주세요