관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - SceneDelegate] iOS13이상 버전의 SceneDelegate 본문

Git, CocoaPods, Xcode, Shell

[iOS - SceneDelegate] iOS13이상 버전의 SceneDelegate

jake-kim 2020. 4. 20. 22:03

1. iOS12이하 버전 : App하나는 오로지 각각 하나의 Process와 UI를 유지 (AppDelegate에서 모두 관여)

출처 : Apple WWDC 2019

- Process Lifecycle : Process 상태

- UI Lifecycle : active, inactive, background, foreground 상태 관여

 

2. iOS13이상 버전 : App하나에 

여러 UI 인스턴스 존재 가능 (App Delegate가 Session을 관리하므로)    

_ : App Delegate

_ : Scene Delegate

call stack : 앱 클릭 ->didFinishLaunchingWithOptions->configurationForSession->willConnectToSession

                  (아직 화면에는 앱이 안뜬 상태)

                    -> scene(_:willConnectTo)에서, window = UIWindow(windowScene: scene as! UIWindowScene)

                  (화면에 앱이 등장)

                    -> willResignActive, didEnterBackground -> didDisconnect

                  (앱 화면을 명시적으로 종료할 시 ) -> didDiscardSceneSceneSessions : scene이 didDisconnect됐을 경우(유저의 포커스

 에서 벗어난 후 다시 포커스를 받은 경우 데이터를 유지 하기 위해, 이곳에서 복구관련 정보를 획득 == 한 앱을 여러 화면 띄울 수 있음)

AppDelegate에 있는 메소드들이 1:1로 UISceneDelegate로 마이그레이션 됨

 

3. (Scene) Session LifeCycle

1) Scene Delegate에서 Scene Session이 생성되가나 삭제될 때, AppDelegate에 보고

App Delegate는 Session Lifecycle도 관리함

2)  사용자가 앱을 클릭하면 AppDelegate에 Scene Session을 추가하기 위해 Configuration을 요청

 : 일반적으로 정적으로 info.plist에서 작성

 

   * 동적으로 설정하는 방법 - 밑의 메소드에 작성

동적 설정 : AppDelegate에서 Scene Session을 연결

※ 아직 화면에 보이는 상태는 아님(단순히 AppDeleagate에서 Scene Session을 연결한 것)

 

3) 화면에 보이게끔 해당 Scene에 window생성

1
2
3
4
5
6
7
8
9
       // 하나의 씬에 해당되는 윈도우 생성 - 윈도우가 생성되면 화면에 드디어 보이기 시작
        self.window = UIWindow(windowScene: scene as! UIWindowScene)
        
        // 객체 생성
        let tbc = UITabBarController()
        tbc.view.backgroundColor = .white
        
        // 윈도우의 루트 뷰 컨트롤러로 등록
        self.window?.rootViewController = tbc
=

 

cf) scene, window, windowScene

UIWindowScene객체를 이용해서 앱의 UI를 관리함

scene은 windows들과 view controller포함하며 하나의 UI의 인스턴스를 표현

scene은 UIWindowSceneDelegate객체를 가지고 있음 (각 same memory를 공유하며 동기화)

4. Scene 동기화

1) 기존의 방법 : view 변화 -> ViewController가 감지 -> View에게 알린 후 Model에게 알림

만약, Scene이 여러개인 iOS13에서 이렇게 된다면, 또 다른 View Controller는 갱신안됨

 

2) 현재의 방법 : view 변화 -> View Controller가 감지 -> Model에 알림 -> Model (Controller)가 다른 View Controller에게 알림

 

 

* iOS13에서 iOS12버전 사용하기

 - iOS12이하 버전 사용법 출처 : https://velog.io/@dev-lena/iOS-AppDelegate와-SceneDelegate

 

5. SceneDelegate.swift 생명주기 메서드

1) scene(_: willConnectTo: options:)

 scene이 앱에 추가될 때 호출, 단 여기서 ViewController와 같은 클래스 객체를 만들어 사용할 때, 아직 viewDidLoad()가 호출되지 않음

 

2) sceneDidDisconnect(_:)

 scene의 연결이 해제될 때 호출

 

3) sceneDidBecomeActive(_:)

 app switcher에서 선택되는 등 scene과의 상호작용이 시작될때 호출

* app switcher 홈 버튼을 두 번누르거나 아이폰 하단에서 위로 스와이프 했을 때 현재 실행중인 앱들이 보이는 화면

 

4) sceneWillResignActive(_:)

사용자가 scene과의 상호작용을 중지할 때 호출(다른 화면으로의 전환과 같은 경우)

 

5) sceneWillEnterForeground(_:)

 scene이 foreground로 진입할 때 호출

 

6) sceneDidBackground(_:)

 scene이 background로 진입할 때 호출

 

cf) AppDelegate.swift

 - process변화에 호출 (SceneDelegate는 UI적인 요소 담당)

//애플리케이션이 실행된 직후 사용자의 화면에 보여지기 직전에 호출 
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool	

//애플리케이션이 최초 실행될 때 호출되는 메소드 
func application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool		
//애플리케이션이 InActive 상태로 전환되기 직전에 호출 
func applicationWillResignActive(_ application: UIApplication)	

//애플리케이션이 백그라운드 상태로 전환된 직후 호출
func applicationDidEnterBackground(_ application: UIApplication)	

//애플리케이션이 Active 상태가 되기 직전, 화면에 보여지기 직전에 호출 
func applicationWillEnterForeground(_ application: UIApplication)	

//애플리케이션이 Active 상태로 전환된 직후 호출
func applicationDidBecomeActive(_ application: UIApplication)

//애플리케이션이 종료되기 직전에 호출 
func applicationWillTerminate(_ application: UIApplication)
Comments