- iOS 13부터는 SceneDelegate 등장으로 window 변수가 SceneDelegate로 이동
- 구조의 변화도 있음, SceneDelegate 설명
- iOS 12 이하는 앱에 하나의 window를 가짐(multi window를 사용하지 않는다.)
- iOS 12 이하에서는 AppDelegate에 window: UIWindow? 변수가 있다.
- iOS 12 이하에서는 앱에 하나의 window를 가진다. (Multi window를 사용하지 않는다.)
- iOS 13 이상에서는 AppDelegate의 UILifecycle이 SceneDelegate로 이동
- iOS 13 이상에서는 여러개의 window를 가질 수 있다 -> Multi window 사용
What is SceneDelegate?
iOS 13이상 버전에서의 Session Lifecycle
- iOS13부터는 Delegate는 Push알림이나 더욱 직접적인 앱의 이벤트 전달에만 관여하게 바뀌어짐
- 따라서 몇몇 메소드와 Session lifecycle이 변동되어짐
- UI의 상태를 알게하는 UI Lifecycle이 SceneDelegate에서 작동하게됨
iOS 12 이하의 버전에서는 위와 같은 UILifecycle 메소드 들은 appdelegate에 존재했습니다. multiview 지원을 하며 지금과 같이 구조가 바뀌게 된거죠! UILifecycle에 관한건 appdelegate 포스팅과 밑의 설명을 보시면 이해하기 편합니다!
didFinishLaunchingWithOptions 메소드는 앱이 not running 상태에서 앱을 실행할때 앱에 필요한 초기화를 진행하는 메소드 입니다!!
예를들어 원격 푸쉬 알림 서비스를 앱에서 지원한다면, 이 메소드 안에서 초기화를 진행합니다. 또한 다른 데이터 쓰기나 구조 수정을 해야한다면 이 메소드 안에서 초기화 합니다.
Scene?
UIKit은 UIWindowScene 객체를 사용하여 앱 UI의 각 인스턴스를 관리합니다. 장면에는 UI의 한 인스턴스를 표시하기위한 창과 뷰 컨트롤러가 포함됩니다. 각 장면에는 UIKit와 앱 간의 상호 작용을 조정하는 데 사용하는 해당 UIWindowSceneDelegate 객체도 있습니다. 장면은 서로 동시에 실행되며 동일한 메모리와 앱 프로세스 공간을 공유합니다.
결과적으로 단일 앱에 여러 장면과 장면 대리자 개체가 동시에 활성화 될 수 있습니다.
13에서의 App Delegate Scene Delegate 구동 순서
먼저 App Delegate의 didFinishLaunching -> configurationForSession -> (이 부분 부터 Scene Delegate 메소드) willConnectToSession -> willResignActive -> didEnterBackground 등등 사용자가 홈으로 가거나 다시 앱을 불러들이는 앱상태 변화에 따라 메소드 들이 실행되게 됩니다.
또한, 명시적으로 Scene을 삭제하게 되면 App Delegate의 didDiscardSceneSession 메소드가 호출되어 저장 되지 않은 scene, user data를 포함한 것들이 모두 삭제되게 됩니다!
UISceneSession
앱에 새 장면을 추가하거나 프로그래밍 방식으로 하나를 요청할 때 시스템은 해당 장면을 추적하는 세션 개체를 만듭니다. 세션에는 장면의 고유 식별자와 구성 세부 정보가 포함됩니다. UIKit은 장면 자체의 수명 동안 세션 정보를 유지하여 사용자가 앱 전환기에서 장면을 닫으면 세션을 파괴합니다. 세션 개체를 직접 만들지 않습니다. UIKit은 앱과의 사용자 상호 작용에 대한 응답으로 세션을 생성합니다. UIApplication의 requestSceneSessionActivation (_ : userActivity : options : errorHandler :) 메서드를 호출하여 프로그래밍 방식으로 새 장면 및 세션을 생성하도록 UIKit에 요청할 수도 있습니다. UIKit은 앱의 Info.plist 파일 내용을 기반으로하는 기본 구성 데이터로 세션을 초기화합니다.
잠깐 짚고 넢어가기, AppDelegate
13 이후의 AppDelegate
App Delegate object는 앱의 공유 동작을 관리합니다. App delegate 는 효과적으로 앱의 루트 개체이며 UIApplication과 함께 작동하여 시스템과의 일부 상호 작용을 관리합니다. UIApplication 객체와 마찬가지로 UIKit은 앱 시작주기 초기에 앱 델리게이트 객체를 생성하므로 항상 존재합니다.
- App Delegate object를 사용하여 다음과 같은 작업을 처리합니다.
- 앱의 중앙 데이터 구조를 초기화합니다.
- 앱의 장면을 구성합니다.
- 메모리 부족 경고, 다운로드 완료 알림 등과 같이 앱 외부에서 발생하는 알림에 응답합니다.
- 앱 자체를 대상으로하며 앱의 장면,보기 또는보기 컨트롤러에 국한되지 않는 이벤트에 응답합니다.
- Apple 푸시 알림 서비스와 같은 시작시 필요한 서비스를 등록합니다.
12 이하의 AppDelegate (+ 우리에게 더 친숙하고 iOS 13이전의 앱을 지원한다면..)
iOS 12 및 이전 버전의 수명주기 관리 iOS 12 및 이전 버전에서는 앱 위임을 사용하여 앱의 주요 수명주기 이벤트를 관리합니다. 특히 앱 델리게이트의 메서드를 사용하여 앱이 포 그라운드로 들어가거나 백그라운드로 이동할 때 앱의 상태를 업데이트합니다.
- 앱이 포 그라운드로 들어갈 때 수행 할 작업에 대한 정보는 포 그라운드에서 실행할 UI 준비를 참조하십시오.
- 앱이 백그라운드로 전환 될 때 수행 할 작업에 대한 자세한 내용은 백그라운드에서 실행할 UI 준비를 참조하세요.
- 앱의 수명주기에 대한 일반적인 정보는 앱의 수명주기 관리를 참조하세요.
Multi Window?
위의 화면이 Multi Window (하나의 앱이 두개의 화면을 동시에 띄울 수 있다. iPad지원)
- But iPad에서 지원하는 기능이므로, 이 기능을 호환하지 않는다면 SceneDelegate를 삭제하고 기존의 iOS 12 방식처럼도 구현 가능!
-
SceneDelegate를 삭제해주고 iOS12처럼 변경해야 위 코드가 정상작동
-
SceneDelegate 파일 삭제
-
Info.plist에서 ApplicationSceneManifest 부분 삭제
-
빌드 타겟 iOS 12로 바꾸지 않아도 정상작동함
참고) lena-chamna.netlify.app/post/appdelegate_and_scenedelegate/
'Deep Dive iOS' 카테고리의 다른 글
앱이 inactive 상태가 되는 경우 (0) | 2020.11.11 |
---|---|
iOS/Swift) UIKit 이란? (0) | 2020.11.10 |
시뮬레이터에서 할 수 없는 것과 실제 iPhone과의 차이 (0) | 2020.11.05 |
앱의 상태 및 수명주기에 관련한 메소드 (0) | 2020.11.05 |
frame and bounds (0) | 2020.11.05 |