[iOS/Swift] 앱의 생명주기 (App’s life cycle)

Ahn SoJeong·2023년 2월 9일
2

iOS

목록 보기
1/1
post-thumbnail

🔎 앱의 현재 상태란?

앱의 현재 상태란 앱이 언제든지 수행할 수 있는 작업과 수행할 수 없는 작업을 결정함.

예를 들어, 포그라운드 앱은 사용자의 주의를 끌기 때문에 CPU를 비롯한 시스템 리소스보다 우선순위를 갖는다.반면 백그라운드 앱은 화면 밖에서 작동하므로 가능한 한 작업을 적게 수행해야 하며, 가급적 아무것도 수행하지 않는 것이 좋다.

앱의 상태가 변경되면 그에 따라 앱의 동작을 조정해야 한다. 앱의 상태가 변경되면 UIKit은 적절한 델리게이트 객체의 메서드를 호출하여 사용자에게 알림.

✔️ iOS 13 버전 혹은 그 이후 버전

Scene 기반 앱의 생명 주기 이벤트에 응답하기 위해 UISceneDelegate 객체를 사용한다.

✔️ iOS 12 버전 혹은 그 이전 버전

UIApplicationDelegate 객체를 사용하여 생명 주기 이벤트에 응답한다.

🔎 생명주기(Life Cycle)란?

생명주기란 앱의 최초 실행부터 앱이 완전히 종료되기 까지 앱이 가지는 상태와 그 상태들 사이의 전이를 뜻한다. 앱의 상태는 앱이 현재 어떠한 것을 할 수 있는가를 결정한다.


🔎 앱의 생명주기(App’s Life Cycle) 란?

앱의 실행/종료 및 앱이 Foreground/Background에 있을 때, 시스템이 발생시키는 이벤트에 의해 앱의 상태가 전환되는 일련의 과정을 뜻한다.


🔎 앱의 상태 (App State)

앱의 상태는 총 다섯가지로 구분할 수 있다.

  1. NotRunning

    • 앱이 아직 실행되지 않았거나, 완전히 종료되어 동작하지 않는 상태
  2. Foreground - Inactive

    • Inactive는 앱이 실행중이지만 사용자로부터 이벤트를 받을 수 없는 상태이다. 멀티태스킹 윈도우로 진입하거나 앱 실행중 전화, 알림 등에 의해 앱을 사용할 수 없게 되는 경우 이 상태로 진입한다.
  3. Foreground - Active

    • Active는 앱이 실제 실행중이고 사용자 이벤트를 받아서 상호작용할 수 있는 상태이다. 바로 Active상태는 될 수 없으며 Inactive 상태를 거쳐서 Active 상태가 된다.
  4. Background - Running

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

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

🔎 앱의 생명주기 관리

✔️ iOS 13 버전 혹은 그 이후 버전 : Scene 사용

앱이 Scene을 지원하는 경우 각각의 분리된 Scene의 UI Life Cycle event들은 SceneDelegate로 전달됨. Scene은 기기에서 실행되는 앱 UI의 한 인스턴스를 나타냄. 사용자는 각 앱에 대해 여러개의 Scene을 생성하고 개별적으로 보이거나 숨길 수 있음. 각 Scene에는 고유한 생명주기가 있으므로 각 Scene은 서로 다른 상태에 있을 수 있음. 예를 들면 한 Scene은 Foreground에, 다른 Scene은 Background에 있을 수 있는 것

Scene 지원은 opt-in 기능이기 때문에 사용하려면 앱의 Info.plist 파일에 UIApplicationSceneManifest Key를 추가해야함.

사용자 혹은 시스템이 앱에 새로운 Scene을 요청하면 UIKit는 Scene을 생성하고 unattached 즉 연결되지 않은 상태로 설정한다. 사용자가 요청한 Scene은 Foreground로 빠르게 이동하여 화면에 보여지며, 시스템이 요청한 Scene은 일반적으로 이벤트를 처리할 수 있도록 Background로 이동함

  1. 앱 실행

앱이 실행되면 앱을 화면에 보여주기 위한 모든 설정이 끝나고 다음 메소드가 호출됨

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

앱이 실행되면 UIKit에 Scene을 연결해야함.

Scene이 연결되고 화면에 나타나기 까지 다음의 순서 대로 메소드들이 호출됨

application(:configurationForConnecting: options: )
  • 새로운 Scene을 만들고 UIKit와 연결하기 위한 configuration을 지정
  • 여기서 Configuration은 Scene의 delegation 객체를 지정하는 등 Scene을 연결하기 위한 정보가 들어있는 UISceneConfiguration 객체를 말함. 일반적으로 info.plist에 추가된 기본값을 사용해서 생성함
scene(_:willConnectTo:options: )
  • Scene이 연결될 것임을 delegate에 알려줌
  • application(_: didFinishLaunchingWithOptions:)에서 했던 UIWindow 생성작업을 이 메소드에서 할 수 있음. StoryBoard를 사용하다면 StoryBoard에서 엔트리 포인트를 찾아 내부적으로 UIWindow를 생성함
sceneDidBecomeActive(_:)
  • 앱이 Inactive에서 Active 상태로 전환되었을 때 호출됨
  1. 앱 실행 후 홈 화면으로 나가면 : Active - Inactive - Background (-Suspended)

앱 실행 후 홈 화면으로 나가면 Active 에서 Inactive를 거쳐 Background 상태로 전환됨.

이 때, SceneDelegate는 Scene 다음의 순서 대로 메소드들이 호출됨

sceneWillResignActive(_:)
  • 앱이 Active에서 Inactive 상태로 전환될 때 호출됨
sceneDidEnterBackground(_:)
  • 앱이 Background 상태로 전환되었을 때 호출됨
  1. Background 상태에 있는 앱을 다시 실행하면 : Background - Inactive - Active

Background 상태에 있는 앱을 다시 실행하면 InActive를 거쳐 Active 상태로 전환됨.

이 때, SceneDelegate는 시스템에 다음 메소드를 호출하도록 요청함

sceneWillEnterForeground(_:)
  • 앱이 Background에서 Inactive 상태로 전환될 때 호출됨
sceneDidBecomeActive(_:)
  • 앱이 Inactive에서 Active 상태로 전환될 때 호출됨
  1. Scene 연결 해제

기존 App-Based LifeCycle에서는 멀티태스킹 창(app Switcher)에서 swife-up 제스처를 사용해서 앱을 종료시켰음.
하지만 Scene을 사용할 때에는 Multi Window를 지원하기 때문에 앱이 둘 이상의 Scene Window를 가진다면, swift-up 제스처는 앱을 종료시키지 않고 Scene을 해제시키게 됨. 만약 모든 Scene의 연결이 해제되었다면 앱이 종료됨.

Scene 연결이 해제될 때는 다음 순서로 메소드가 호출됨

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

✔️ iOS 12 버전 혹은 그 이전 버전 : Scene 사용

모든 프로세스와 UI Life Cycle events는 모두 App Delegate로 전달됨

Launch 후 시스템은 UI가 화면에 표시될지 여부에 따라 앱을 비활성 또는 백그라운드 상태로 전환한다.

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

앱이 실행되면 Not Running 상태에서 Inactive를 거쳐 Active 상태로 전환됨.

이 때, App Delegate는 시스템에 다음 메소드를 호출하도록 요청함.

  • Active 시 UI 구성을 완료하고 사용자와 상호 작용할 준비를 함
application(_:didFinishLaunchingWithOptions:) 
  • 앱이 실행 되고 앱을 화면에 띄우기 위한 모든 설정이 완료된 뒤, 실제로 화면에 나타나기 직전에 호출됨
  • UIWindow를 생성하는 등의 작업을 할 수 있음
  • StoryBoard를 사용하다면 StoryBoard에서 엔트리 포인트를 찾아 내부적으로 UIWindow를 생성함
applicationDidBecomeActive(_: ) 
  • 앱이 Inactive에서 Active 상태로 전환되었을 때 호출됨
  1. 앱 실행 후 홈 화면으로 나가면 : Active - Inactive - Background (-Suspended)

앱 실행 후 홈 화면으로 나가면 Active에서 Inactive를 거쳐 Background 상태로 전환됨.

이 때, App Delegate는 시스템에 다음 메소드를 호출하도록 요청함

applicationWillResignActive(_:)
  • 앱이 Active에서 Inactive 상태로 전환될 때 호출됨
applicationDidEnterBackground(_:)
  • 앱이 Background 상태로 전환되었을 때 호출됨
  1. Background 상태에 있는 앱을 다시 실행하면 : Background - Inactive - Active

Background 상태에 있는 앱을 다시 실행하면 InActive를 거쳐 Active 상태로 전환됨.

이 때, App Delegate는 시스템에 다음 메소드를 호출하도록 요청함

applicationWillEnterForeground(_:)
  • 앱이 Background에서 Inactive 상태로 전환될 때 호출됨
applicationDidBecomeActive(_:)
  • 앱이 Inactive에서 Active 상태로 전환될 때 호출됨
  1. 앱 종료: (Some State) - Background or Suspended - Not Running

사용자가 직접 앱을 종료시키는 경우, 앱은 다시 Not Running 상태로 돌아감.

이 때, App Delegate는 시스템에 다음 메소드를 호출하도록 요청함

applicationWillTerminate(_:)
  • 앱이 사용자에 의해 종료될 때 호출됨. 시스템에 의해 예기치 못한 상황에서 종료될 때는 호출되지 않음

References

Article: Managing your app’s life cycle

rnfxl92님의 <앱 생명주기>

profile
IOS Developer❄️ 컴퓨터공학&통계학 전공 막학년생이에옹⛄

0개의 댓글