App의 생명 주기는 App의 실행,종료 및 App의 Foreground,Background 상태에 있을 때 시스템이 발생시키는 event에 의해 App의 상태가 전환되는 일련의 과정을 뜻한다.
1. Background
앱이 화면상에서 보여지지 않는 상태
가능한 적은 기능을 수행해야 한다.
화면 밖에 있기때문에 가급적 아무것도 하지 않는것이 좋다.
2. Foreground
앱이 화면에 올라와 있는 상태
Main Run Loop 는 유저가 일으키는 이벤트들을 처리하는 프로세스다.
UIApplication 객체는 앱이 실행될 때, Main Run Loop를 실행하고
Main Run Loop 를 View와 관련된 이벤트나 View의 업데이트에 활용 한다.Main Run Loop 는 View와 관련되어 있기 때문에 Main 스레드 에서 실행 된다.
이벤트 처리 순서
1. 유저가 이벤트를 발생 시킨다.(터치, 스와이프 등 조작)
2. 시스템을 통해 이벤트가 생성된다.
3. UIKit 프레임워크를 통해 생성된 port 로 해당 이벤트가 앱으로 전달.
4. 이벤트는 앱 내부에 Queue 형태로 저장된다.
5. Event Queue 에 있는 이벤트들이 Main Run Loop 에 하나씩 매핑된다.
6. UIApplication 객체는 어떤 이벤트를 가장 먼저 실행 되어야 하는지 결정한다.
하나의 앱에 하나의 window!
AppDelegate 가 두개의 LifeCycle 을 관리한다.
창(window)의 개념이 scene 으로 대체되고 하나의 앱에서 여러개의 scene 을 가질수 있다.
AppDelegate 와 SceneDelegate 가 LifeCycle 을 관리 한다
AppDelegate 의 기능이 SceneDelegate 로 분리되고 AppDelegate 에 Session LifeCycle 이라는 새로운 사이클을 담당하게 된다.
Session LifeCycle 은 Scene 에 대한 정보를 관리한다.
멀티 윈도우 환경을 제공하기 위해 생긴이유가 가장크다.
아이폰은 멀티 윈도우를 제공하지 않지만 아이패드 같은경우 멀티 윈도우 기능을 제공한다.
기존엔 한개의 앱이 한개의 UI instance 를 갖는 형태였지만
한개의 앱에서 여러개의 UI instance 들을 갖는 형태를 만들기 위해 Scene 이라는 개념이 생겨 났다.예를들자면 메모어플, 일정어플 등 아이패드에서 분할 화면으로 작업할때 한화면에서 작업한 내용이 다른화면에서도 반영하고 싶은경우 활용 할 수 있다.
한개의 앱에서 여러개의 window(UI instance) 를 가질수있는 것을 뜻함.
크롬의 새창 버튼과 같은 것. 앱은 하나지만 보여지는것은 각기 다른 2개의 화면을 볼수있음.
각 Scene 의 라이프 사이클(UI LifeCycle)을 관리한다.
UISceneDelegate
@MainActor protocol UISceneDelegate
scene의 라이프 사이클
1. scene()
- scene 이 앱에 추가될때 호출됨
- sceneDidDisconnect()
- scene 의 연결이 해제될때 호출됨
- sceneDidBecomeActive()
- scene 이 활성화 되었을때 호출됨
- sceneWillResignActive()
- scene 이 활성상태를 멈출때 호출됨
- sceneWillEnterForeground()
- scene 이 실행되어 사용자에게 표시될때 호출됨
- sceneDidEnterBackground()
- scene 이 백그라운드에서 실행중이며 더이상 화면에 표시되지 않을때 호출됨
@MainActor protocol UIApplicationDelegate
1. Not Running
2. Inactive
3. Active
4. Active -> Inactive
5. Background
6. Suspended
1. Unattached
2. Foreground Inactive
3. Foreground Active
4. Foreground Active -> Foreground Inactive
5. Background
앱 사용중 다른앱을 실행하거나 홈 화면 으로 나갔을떄 의 상태.
Background 에서 동작하는 코드를 추가하면 Suspended 상태로 넘어가지 않고 백그라운드 상태를 유지함.
처음부터 Background 상태로 실행되는 앱은 Inactive 대신Background 상태로 진입.(음악 실행후 화면 에서 나가도 음악이 재생되는 상태)
예정작업? 백그라운드에서 언어타치드 로 가능 이유?
백그라운드 기능중에 예정 작업 같은 기능이있는데 대강 어느정도 시간이지나면 이거를 해라 저거를 해라 지정할수 있음
6. Suspended