-
Application Life CycleiOS 2021. 1. 14. 19:24
안녕하세요. 그린입니다!
이번 포스팅에서는 iOS에서의 앱 생명주기에 대해 알아보겠습니다.
그리고 파생되어 AppDelegate와 SceneDelegate에 대해서도 알아보도록 하죠!
1. Application Life Cycle
: iOS에서의 앱 생명주기는 아래와 같은 순서로 볼 수 있습니다.
1) 사용자 앱 아이콘 터치 실행
2) main() 메서드 실행 (AppDelegate 파일)
3) UIApplicationMain 메서드 호출 실행 (앱 생명주기 단계 시작 메서드)
4) UIApplication 객체 인스턴스 생성 (앱 로딩 프로세스)
5) nib / Info.plist 파일에서 부가 데이터들을 Read & Load
6) AppDelegate 객체 인스턴스 생성 > App 객체 인스턴스 연결 및 런루프 생성
7) App 객체 인스턴스 > AppDelegate 객체 인스턴스에 application:didFinishLaunchingWithOptions: 메서드 전달
8) 앱 실행
-. @main
: 앱의 생명주기의 처음의 스타트를 끊는 메서드
: 스위프트 5.3 버전부터 아래와 같이 기존 @UIApplicationMain에서 @main으로 바뀌었다.
: 해당 어노테이션을 지우면 직접 main 함수를 구현하여 앱 실행 메서드를 생성할 수 있다.
@main -. 앱의 5가지 상태
1) Not Running: 종료되어있고 실행되지 않은 초기 상태
2) Inactive: 실행되었지만 사용자의 동작을 받을 수 없는 상태
-. 알림창을 내렸을때
-. 앱 스위칭 할때
-. 시스템 알림을 받을때
3) Active: 앱이 활성화되어 실행되는 상태
4) Background: 백그라운드에서 실행되는 상태
5) Suspended: 백그라운드에서 정지된 상태
앱 기반 생명주기 -. Inactive와 Active 상태는 Foreground에서 작동한다.
-. Scene 기반 라이프 싸이클
Scene 기반 생명주기 -. 점선: 시스템(운영체제)가 관리하는 동작
-. 실선: 사용자의 액션(이벤트)에 의한 동작
2. AppDelegate
: App이 해야할 일을 대신 구현해주는 Delegate를 의미한다.
-. 역할
1) Process LifeCycle
2) Session LifeCycle
: Scene과 세션을 연결하여 Scene 인스턴스를 관리한다. (Scene 설정)
3) 앱의 데이터 구조를 초기화
4) 앱의 EntryPoint(진입점)을 제공
5) 앱 이벤트 컨트롤 (알림 등)
-. 메서드
1) application:willFinishLaunchingWithOptions: // 앱 실행 시 호출
2) application:didFinishLaunchingWithOptions: // 앱 실행 직후 호출
3) applicationWillTerminate: // 앱 종료 시 호출
3. SceneDelegate
: iOS13 버전 이후 생겨난 Delegate 파일로 하나의 앱에 여러 Scene을 가질 수 있도록 하기 위해 만들어졌다.
기존 AppDelegate의 UI LifeCycle의 기능을 분리시킨것으로 UI의 상태변화를 알 수 있는 역할을 한다.
: iPad의 멀티윈도우 기능을 지원하기 위해 생겨났다.
-. 역할
: UI의 생명주기 관리
-. 메서드
1) EnteredForeground
: 앱이 Foreground / Background로 될 때 처리해야할 일
-. applicationWillEnterForeground: // 앱이 Acitive 상태가 될 예정일때 호출
-. applicationDidEnterBackground: // 앱이 백그라운드로 전환된 후 호출
2) Became Active
: 앱이 Active / Inactive 될 때 처리해야할 일
-. applicationWillResignActive // 앱이 Inactive 상태 전환될 예정일때 호출
-. applicationDidBecomeActive: // 앱이 Active 상태 전환된 후 호출
4. iOS 13 버전 이전과 이후
: iOS 13 버전이 되면서 AppDelegate의 UI 생명주기 역할을 SceneDelegate에서 할 수 있도록 따로 분리시켰다.
이전에는 하나의 앱에 하나의 Scene(Window)만 가질 수 있었는데 이후 부터는 하나의 앱에서도 여러 Scene(Window)를 지원하게 됐다.
-. 멀티윈도우와 멀티태스킹의 차이
1) 멀티윈도우: 하나의 앱을 여러개 실행할 수 있는 기능으로 iPad에서 사파리 앱을 여러개 켜서 사용하는것과 같은걸 의미한다.
2) 멀티태스킹: 여러개의 앱을 하나의 화면에서 동시에 실행하는걸 의미한다. 쉽게 생각해서 아이폰에서도 카톡을 하면서 유투브를 보는 PIP(PictureInPicture)의 기능을 생각할 수 있다.
!! 현재까지 멀티윈도우 기능은 아이폰에서는 되지 않고있다. 카플레이와 같이 외부 디스플레이 연결 지원의 경우는 하나의 앱을 여러 UI로 구현하는것이지 멀티윈도우 기능이 아니다.
iPad 체크 시 멀티윈도우 옵션 항목 iPad 체크 해제 시 사라지는 멀티윈도우 항목 위와 같이 프로젝트 General 설정에서 iPad를 체크 해제하면 멀티윈도우 지원 체크 항목이 사라지는걸 볼 수 있다.
-. 의문점?? 그럼 왜 iOS 아이폰 환경에서는 SceneDelegate를 사용하지도 않을것 같은데 파일이 생성되게 해놨을까?
프로젝트 파일 생성 시 iPad 개발여부를 체크해서 아이폰에만 배포할 경우에는 SceneDelegate 대신 이전과 같은
AppDelegate에서 모든걸 처리하게하면 안되는것인가? 그렇게된다면 iOS 13 버전 이전과 이후로 업데이트 하지 않은 기기에 대해 앱 지원도 동일하게 될것같은데 번거롭게 한 느낌이였다.
이 의문점에 생각을 해봤는데 굳이 번거롭게 그렇게 나눌 필요가 없다는것이다. 추후 아이폰에서도 충분히 멀티윈도우를 지원할 수 있으며 SceneDelegate로 역할을 이전하여 분리시켜놔서 실제로 멀티윈도우 기능을 사용하지 않더라도 문제될게 없다.
만약 Deployment Target이 iOS 13 이전이라면 간단하게 몇가지를 바꿔줌으로 이전과 같이 Xcode를 구성할 수 있음으로
전혀 문제될 소지가 없다고 생각한다.
-. Deployment Target이 iOS 13 이전일 경우
1) SceneDelegate.swift 파일 삭제
2) AppDelegate의 UISceneSession 메서드 2개 삭제
(application(_:configurationForConnecting:options:)과 application(_: didDiscardSceneSessions:))
3) window 프로퍼티 AppDelegate로 이관
4) Info.plist에서 Scene 관련 Application Scene Manifest 삭제
혹은 SceneDeleate파일을 삭제하지않고 iOS 13 이후 버전은 그대로 구동되고 iOS 13 이전 버전은 기존방식으로 구동되게 할때는
@available(iOS 13.0, *) 을 메서드와 클래스에 붙여주면된다.
-> AppDelegate
-> SceneDelegate
이상으로 오늘의 포스팅을 끝내겠습니다.
감사합니다!:D
[참고자료]
https://lena-chamna.netlify.app/post/appdelegate_and_scenedelegate/#AppDelegate와-SceneDelegate
https://jinshine.github.io/2018/05/28/iOS/앱의%20생명주기(App%20Life%20Cycle)와%20앱의%20구조(App%20Structure)/
http://monibu1548.github.io/2018/08/28/appdelegate/
'iOS' 카테고리의 다른 글
KeyChain (4) 2021.02.01 Collection View (0) 2021.01.25 단위테스트와 TDD (0) 2020.12.15 AppDelegate & SceneDelegate (0) 2020.12.07 Gesture Recognizer (0) 2020.12.02