iOS앱은 수명주기 동안 몇가지 상태를 거친다.
앱은 활성화되어 사용자의 이벤트에 반응하거나,
백그라운드에서 음악을 플레이 하거나,
사용자나 OS에 의해 종료될 수 도있다.
Not Running
앱이 시작되지 않았거나 실행되었지만 시스템에 의해 종료된 상태를 나타낸다.
이 상태에서 앱은 아무것도 처리할 수 없다.
Inactive
앱이 전면에서 실행중이만 아무런 이벤트를 받지 않는 상태를 나타낸다.
예를들어 앱이 실행중에 전화가 온다거나 하는 상태이다.
이 상태는 앱이 다른 상태로 넘어가기전에 항상 거치는 상태이다.
not running -> inactive -> active
active -> inactive -> background
backgorund -> inactive -> active
Active
앱이 전면에서 실행중이며, 이벤트를 받는 상태이다.
Background
앱이 백그라운드에 있지만 여전히 코드를 실행중인 상태이다.
사용자는 다른앱을 사용하고 있을수도 있지만 우리앱은 어떠한 행동을 할 수 있다.
다운로드나, 업로드, 연산처리 등
Suspended
앱이 백그라운드에 있고 메모리에 유지되지만 코드는 실행되지 않는 상태이다.
메모리가 부족해지는 상황이 오면 OS 시스템은 메모리 공간을 확보하기위해 이 상태에 있는 앱들을 특별한 알림없이 정리한다.
(출처: https://developer.apple.com/documentation/uikit/app_and_environment/managing_your_app_s_life_cycle)
iOS 12 이전 버전의 앱들은
Scene을 지원하지 않기때문에 UIkit의 모든 수명주기 이벤트는 AppDelegate로 위임되어 전달 된다.
Not Running -> InActive 넘아기기전
application:willFinishLaunchingWithOptions
앱 시작시 코드를 실행할수 있는 가장 처음 기회
라이프 사이클중 딱 한번 호출될수 있는 녀석이다.
Not Running -> InActive 넘어가고 나서
application:didFinishLaunchingWithOptions
사용자에게 나타나기 전 최종 단계
라이프 사이클중 딱 한번 호출될수 있는 녀석이다.
이 두 단계 에서는
앱설정, 초기View 세팅(로그인 하지않은경우 로그인페이지), Apple 푸시 알림 등록
등등 코드를 작성하는것이 가능하다.
InActive -> Active
applicationDidBecomeActive
앱이 InActive에서 Aactive로 전환
라이프 사이클중 여러번 호출될수 있는 녀석이다.
Active -> InActive
applicationWillResignActive
Active에서 Inactive로 전환
라이프 사이클중 여러번 호출될수 있는 녀석이다.
InActive -> Background
applicationDidEnterBackground
InActive에서 Background로 전환
라이프 사이클중 여러번 호출될수 있는 녀석이다.
Background -> InActive
applicationWillEnterForeground
Background 에서 Inactive로 전환
라이프 사이클중 여러번 호출될수 있는 녀석이다.
사용자에 의해서 종료될때 (시스템에 의해서 종료될때는 X, 크래시 같은거)
applicationWillTerminate(_:)
iOS 13버전 이후 생긴 Scene이라는 개념 이후 생긴 라이프 사이클
iOS 12까진 하나의 앱이 하나의 프로세스와 하나의 앱UI객체만을 가지고 있었는데
iOS 13이후에 하나의 앱이 하나의 프로세스와 여러 앱UI객체를 가질수 있게 되었다.
그때 생겨난것이 바로 Scene이라는 개념이다.
기존에 모든 책임을 AppDelegate가 가지고 있었지만
이 책임을
AppDelegate와 SceneDelegate로 나눠서 관리하게 되었다.
이로인해 하나의 앱에서 여러개의 창을 사용할수 있게 되었다.
AppDelegate는 앱이 실행할때 한번만 생성된다.
Not Running -> InActive 넘아기기전
application:willFinishLaunchingWithOptions
앱 시작시 코드를 실행할수 있는 가장 처음 기회
라이프 사이클중 딱 한번 호출될수 있는 녀석이다.
Not Running -> InActive 넘어가고 나서
application:didFinishLaunchingWithOptions
사용자에게 나타나기 전 최종 단계
라이프 사이클중 딱 한번 호출될수 있는 녀석이다.
사용자에 의해서 종료될때 (시스템에 의해서 종료될때는 X, 크래시 같은거)
applicationWillTerminate(_:)
위에 3개는 기존 AppDelegate도 동일
Scene 생성
application(_:configurationForConnecting:options:)
Scene의 Configuration을 설정 가능
새로운 Scene이 생성될때 마다 호출
Scene 연결 해제
func application (_ : didDiscardSceneSessions :)
Scene이 사용자의 의해 수동적으로 영구적으로 해제될때만 이 메서드가 호출된다.
Scene이 bacgkround로 들어간뒤에 메모리를 확보하기위할때는 Scene객체를 삭제하지만 세션은 유지하기때문에 호출되지 않는다.
SceneDelegate는 Scene이 생성될때마다 새로운 인스턴스가 생성된다.
Scene 연결
scene(_:willConnectTo:options:)
Scene이 앱에 연결되고 데이터 로드를 시작하면 이 메서드가 호출된다.
bacgkround -> foreground
sceneWillEnterForeground
완전한 백그라운드에서 포그라운드 왔을때 호출
1초만에 백그라운드로 갔다 다시 오는경우 호출이 안됨
앱 첫실행시에는 반드시 실행
active
sceneWillResignActive
active상태가 될때마다 실행
바로 위에 sceneWillEnterForeground는 호출 되지 않아도 이 상태는 호출 되는 경우도 있음 (나갔다 바로 들어오기)
resign active
sceneWillResignActive
active 상태를 벗어날때 호출
바로 아래 sceneDidEnterBackground가 호출 되지 않아도 이 상태는 호출 되는 경우도 있음 (나갔다 바로 들어오기)
foreground -> background
sceneDidEnterBackground
완전한 백그라운드 상태가 되었을때 호출
1초반에 백그라운드로 갔다 다시 오는경우 호출이 안됨
수동으로 앱 종료시에도 호출이 안됨
Scene 종료
sceneDidDisconnect
앱을 수동으로 종료하는 경우에만 호출
Scene이 bacgkround로 들어간뒤에 메모리를 확보하기위할때 Scene 객체를 삭제하는데 이때도 호출된다.