앱 생명주기 (Application Life Cycle)

rnfxl92·2020년 10월 21일
0

iOS

목록 보기
2/26

App Life Cycle

App의 생명 주기는 App의 실행/종료 및 App이 Foreground/Background 상태에 있을 때, 시스템이 발생시키는 event에 의해 App의 상태가 전환되는 일련의 과정을 뜻합니다.

Overview

  • App의 현재 상태에 따라 할 수 있는 것과 할 수 없는 것이 결정됩니다. 예를 들어 Foreground App은 사용자의 주의를 끌기 때문에 CPU를 포함한 시스템 리소스보다 우선순위가 높습니다. 반대로 Background App은 offscreen이기 때문에 가능한 적은 작업을 수행해야하고, 되도록 아무것도 수행하지 않아야 합니다. 또한 앱의 상태가 변경될 때 마다 그에 맞는 동작을 조정해야 합니다.

App State

App State는 총 다섯가지 상태로 구분할 수 있습니다.

1. Not Running

Not Running은 앱이 아직 실행되지 않았거나, 완전히 종료되어 동작하지 않는 상태.

2. Foreground - Inactive

Inactive는 app이 실행중이지만 사용자로부터 event를 받을 수 없는 상태. multitasking window로 진입하거나 app 실행중 전화, 알림 등에 의해 app을 사용할 수 없게 되는 경우 이 상태로 진입.

3. Foreground - Active

Active는 app이 실제 실행중이고 사용자 event를 받아서 상호작용할 수 있는 상태.
(바로 Active가 되지 않고 Inactive 상태를 거쳐 Active상태가 된다.)

4. Backgound - Running

Background는 홈화면으로 나가거나 다른 app으로 전환되어 현재 app이 실질적인 동작을 하지 않는 상태. 예를 들어 Music app을 닫아도 재생한 음악이 계속 실행되는 경우. 사용자가 app을 사용하지 않는 동안 서버와 데이터를 동기화하거나 타이머가 실행되어야 하는 등의 작업을 이 상태에서 할 수 있습니다.

5. Backgound - Suspended

Suspended는 app을 다시 실행했을 때 최근 작업을 빠르게 로드하기 위해 메모리에 관련 데이터만 저장되어있는 상태. app이 background 상태에 진입했을 때 다른 작업을 하지 않으면 Suspended 상태로 진입하게 됩니다.(보통 2~3초 이내) Suspended 상태의 app들은 iOS의 메모리가 부족해지면 가장 먼저 메모리에서 해제됨. 따라서 app을 종료시킨 적이 없더라도 app을 다시 실행하려고 하면 처음부터 다시 실행됩니다.

Managing App's Life Cycle

App의 상태를 전환시키는 시스템 Notification에 반응하여 현재 상태변화에 대응되는 method를 통해 작업을 할 수 있습니다.

  • App State가 변경될 때 UIKit은 적절한 Delegate객체의 method를 호출해 알려줍니다.
  • iOS 12와 이전 버전은 전체 Life Cycle을 UIApplicationDelegate 객체에서 관리했었습니다. 따라서 해당 protocol을 채택하는 AppDelegate에서 대응되는 method를 구현합니다.
  • iOS 13과 이후 버전은 Scene 개념이 도입되면서 하나의 앱이 여러 UI Life Cycle을 가질 수 있게 되었다. 각각의 Scene에서 관리하는 UI Life Cycle은 UISceneDelegate에서 관리하고, 해당 protocol을 채택하고 있는 SceneDelegate가 각각의 Scene에서 관리하는 UI Life Cycle에 대응되는 method들을 구현하게 되었습니다.
  • 정리하면, 앱 실행 및 종료와 관련된 Process Life Cycle은 AppDelegate에서, 앱이 Foreground와 Background 상태에 있을 때 상태 전환과 관련된 UI Life Cycle은 SceneDelegate에서 관리합니다. SceneDelegate를 사용하지 않도록 설정하면 예전처럼 AppDelegate가 모든 Life Cycle에 대한 관리 책임을 갖지만, 그렇지 않으면 UI Life Cycle은 SceneDelegate를 통해 관리해야 합니다.

Respond to App-Based Life Cycle

iOS 12이전 또는 Scene을 사용하지 않는다면 모든 Process/UI Life Cycle eventsms AppDelegate로 전달됩니다.

1. 앱 실행: Not Running - Inactive - Active

앱이 실행되면 Not Running에서 Inactive를 거쳐 Active로 상태가 전환됩니다. 이 때, AppDelegate는 시스템에 다음 method를 호출하도록 요청합니다.

  • application(_:didFinishLaunchingWithOptions:)
    앱이 실행되고 앱을 화면에 띄우기 위한 모든 설정이 완료된 뒤, 실제로 화면에 나타나기 직전에 호출됩니다. UIWindow를 생성하는 등의 작업을 할 수 있습니다. Storyboard를 사용한다면 storyboard에서 entry point를 찾아 내부적으로 UIWindow를 생성합니다.
  • applicationDidBecomeActive(_:)
    앱이 Inactive에서 Active 상태로 전환되었을 때 호출됩니다.

2. To Background(offscreen): Active - Inactive - Background ( - Suspended)

앱 실행 후 홈 화면으로 나가면 Active에서 Inactive를 거쳐 Background로 상태가 전환됩니다. 이 때, AppDelegate는 시스템에 다음 method를 호출하도록 요청합니다.

  • applicationWillResignActive(_:)
    앱이 Active에서 Inactive 상태로 전환될 때 호출됩니다.
  • applicationDidEnterBackground(_:)
    앱이 Background 상태로 전환되었을 때 호출됩니다.

3. To Foreground(onscreen): Background - Inactive - Active

Background 상태에 있는 앱을 다시 실행하면 Inactive를 거쳐 Active 상태로 전환됩니다. 이 때, AppDelegate는 시스템에 다음 method를 호출하도록 요청합니다.

  • applicationWillEnterForeground(_:)
    앱이 Background에서 Inactive 상태로 전환될 때 호출됩니다.
  • applicationDidBecomeActive(_:)
    앱이 Inactive에서 Active 상태로 전환될 때 호출됩니다.

4. 앱 종료: (some States) - Background or Suspended - Not Running

사용자가 직접 앱을 종료시키는 경우, 앱은 다시 Not Running 상태로 돌아갑니다. 이 때, AppDelegate는 시스템에 다음 method를 호출하도록 요청합니다.

  • applicationWillTerminate(_:)

앱이 사용자에 의해 종료될 때 호출됩니다. 시스템에 의해 예기치 못한 상황에서 종료될 때는 호출되지 않습니다.

Respond to Scene-Based Life Cycle

iOS 13 이후의 앱에서 Scene을 사용한다면 각각의 분리된 Scene의 UI Life Cycle event들은 SceneDelegate로 전달됩니다.

1. 앱 실행

앱이 실행되면 앱을 화면에 보여주기 위한 모든 설정이 끝나고 다음 method가 호출됩니다.

  • application(_:didFinishLaunchingWithOptions:)
    앱이 실행되고 앱을 화면에 띄우기 위한 모든 설정이 완료된 뒤, 실제로 화면에 나타나기 직전에 호출됩니다.

2. Scene 연결

앱이 실행되면 UIKit에 Scene을 연결해야 합니다. Scene이 연결되고 화면에 나타나기까지 과정에서 다음 순서로 method들이 호출됩니다.

  • application(_:configurationForConnecting:options:)
    새로운 Scene을 만들고 UIKit과 연결하기 위한 configuration을 지정합니다.
    여기서 Configuration은 Scene의 delegation 객체를 지정하는 등 Scene을 연결하기 위한 정보가 들어 있는 UISceneConfiguration 객체를 말합니다. 일반적으로 info.plist에 추가된 기본값을 사용해서 생성합니다.
  • scene(_:willConnectTo:options:)
    Scene이 연결될 것임을 delegate에 알려줍니다. 기존에 application(_:didFinishLaunchingWithOptions:)에서 했던 UIWindow 생성 작업을 이 method에서 할 수 있습니다. Storyboard를 사용한다면 storyboard에서 entry point를 찾아 내부적으로 UIWindow를 생성합니다.
  • sceneDidBecomeActive(_:)
    앱이 Inactive에서 Active 상태로 전환되었을 때 호출됩니다.

3. To Background(offscreen): Active - Inactive - Background ( - Suspended)

앱 실행 후 홈 화면으로 나가면 Active에서 Inactive를 거쳐 Background로 상태가 전환됩니다. 이 때, SceneDelegate는 Scene에 다음 순서로 method를 호출하도록 요청합니다.

  • sceneWillResignActive(_:)
    앱이 Active에서 Inactive 상태로 전환될 때 호출됩니다.
  • sceneDidEnterBackground(_:)
    앱이 Background 상태로 전환되었을 때 호출됩니다.

4. To Foreground(onscreen): Background - Inactive - Active

Background 상태에 있는 앱을 다시 실행하면 Inactive를 거쳐 Active 상태로 전환됩니다. 이 때, SceneDelegate는 시스템에 다음 순서로 method를 호출하도록 요청합니다.

  • sceneWillEnterForeground(_:)
    앱이 Background에서 Inactive 상태로 전환될 때 호출됩니다.
  • sceneDidBecomeActive(_:)
    앱이 Inactive에서 Active 상태로 전환될 때 호출됩니다.

5. Scene 연결 해제

기존 App-Based Life Cycle에서는 멀티태스킹 창에서 swipe up 제스처를 사용하여 앱을 종료시켰습니다. 하지만 Scene을 사용할 때는 multi window를 지원하기 때문에, 앱이 둘 이상의 scene window를 갖는다면 swipe up 제스처는 앱을 종료시키지 않고 Scene을 해제시키게 됩니다. 만약 모든 Scene의 연결이 해제되었다면 앱이 종료됩니다.
Scene 연결이 해제될 때는 다음 순서로 method가 호출됩니다.

  • sceneDidDisconnected(_:)
    delegate에 UIKit에 연결된 Scene의 연결을 해제할 것을 요청합니다.
  • application(_:didDiscardSceneSessions:)
    사용자가 멀티태스킹 화면(app switcher)에서 한개 이상의 Scene을 종료시켰을 때 호출됩니다.
  • applicationWillTerminate(_:)
    앱이 사용자에 의해 종료될 때 호출됩니다. 시스템에 의해 예기치 못한 상황에서 종료될 때는 호출되지 않습니다.

UI Life Cycle의 책임이 Scene으로 옮겨가면서, AppDelegate의 method 이름이 application에서 scene으로 바뀌기만 했을 뿐 맡은 역할과 호출되는 시점은 동일합니다.


참고 및 그림 출처
https://velog.io/@delmasong/Managing-Your-Apps-Life-Cycle
https://hcn1519.github.io/articles/2017-09/ios_app_lifeCycle
https://cskime.tistory.com/11?category=801416
https://developer.apple.com/documentation/uikit/app_and_environment/managing_your_app_s_life_cycle

profile
iOS시작~

0개의 댓글