-
AppDelegate & SceneDelegateiOS/Study 2024. 8. 5. 11:49
iOS 13 이전 이후로
이전에는 AppDelegate만 사용하여,
앱에 단 하나의 Window만 존재하고, AppDelegate가 App Life Cycle, UI Life Cycle 을 모두 처리하였음.
1. 앱의 가장 중요한 데이터 구조를 초기화
2. 앱의 scene을 환경설정(Configuration)
3. 앱 밖에서 발생한 알림(배터리 부족, 다운로드 완료 등)에 대응
4. 앱 자체를 타겟하는 이벤트에 대응.
5. 실행시 요구되는 모든 서비스(ex. PushNotification ... )를 등록하는것.UI구조
이후에는 AppDelegate,SceneDelegate 동시 사용하여,
window 대신 하나의 앱에 여러 scene을 가질수 있게 되었음
UILifecycle을 SceneDelegate 에서 처리
UI구조
Scene -> 디바이스에서 실행 중인 앱 UI의 하나의 인스턴스.
Scene은 iOS 13 이상에서 도입된 개념으로, 사용자가 앱과 상호작용하는 단위입니다.
각 Scene은 앱의 하나의 창(window)을 나타내며, 앱이 동시에 여러 창을 가질 수 있는 멀티창 인터페이스를 지원합니다.
하나의 Scene은 하나의 뷰 계층 구조를 가지며, 해당 Scene에 표시되는 사용자 인터페이스를 정의합니다.
예를 들어, 앱의 메인 화면과 같은 개별적인 화면 요소는 하나의 Scene으로 표현됩니다.UIKit는 UIWindowScene 객체를 사용하는 앱 UI의 각 인스턴스를 관리합니다. Scene에는 UI의 하나의 인스턴스를 나타내는 windows와 view controllers가 들어있습니다. 또한 각 scene에 해당하는 UIWindowSceneDelegate 객체를 가지고 있고, 이 객체는 UIKit와 앱 간의 상호 작용을 조정하는 데 사용합니다. Scene들은 같은 메모리와 앱 프로세스 공간을 공유하면서 서로 동시에 실행됩니다. 결과적으로 하나의 앱은 여러 scene과 scene delegate 객체를 동시에 활성화할 수 있습니다.
Scene 의 상태와 전환
scene은 앱의 실행동안 3개의 단계를 거치게 된다.
- active : scene이 foreground에 존재하여 사용자와 상호작용이 가능한 상태
- inactive : scene이 보이지만, 시스템에 의해서 상호작용이 불가한 상태, 멀티태스킹 모드에서 활성화중이지 않은 창
- background : 앱이 실행되고 있지만 scene이 보이지 않는 상태, 앱이 종료되기 전에 이 단계를 거치게 된다.
Scene Session ->
UISceneSession 객체는 scene의 고유의 런타임 인스턴스를 관리합니다. 사용자가 앱에 새로운 scene을 추가하거나 프로그래밍적으로 scene을 요청하면, 시스탬은 그 scene을 추적하는 session 객체를 생성합니다. 그 session에는 고유한 식별자와 scene의 구성 세부사항(configuration details)가 들어있습니다. UIKit는 session 정보를 그 scene 자체의 생애(life time)동안 유지하고 app switcher에서 사용자가 그 scene을 클로징하는 것에 대응하여 그 session을 파괴합니다. session 객체는 직접 생성하지않고 UIKit가 앱의 사용자 인터페이스에 대응하여 생성합니다.
- 13 이전 방식 (Deployment Target이 13 이하)
1. SceneDelegate 삭제
2. AppDelegate 에서
// MARK: UISceneSession Lifecycle 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. }
부분 삭제
3. info.plist에서Application Scene Manifest 삭제
- 해당 옵션을 아예삭제하는 경우는 iOS 13이전 처럼 App Delegate를 통해 window를 통해 App을 관리.
- Enable Multiple Windows를 NO로 주면 단일 Scene 만을 가지고 App을 관리.'iOS > Study' 카테고리의 다른 글
STUDY - SwiftUI 핵심 (0) 2025.01.13 STUDY - iOS Structure/LifeCycle (2) 2024.08.05 STUDY - iOS Project (0) 2024.08.05 SwiftGen (0) 2024.07.29