관리 메뉴

스윞한 개발자

iOS - 앱 생명주기(Lifecycle) 본문

Swift 이론

iOS - 앱 생명주기(Lifecycle)

스윞남 2024. 4. 17. 00:11
728x90
반응형
SMALL

안녕하세요 이번 포스팅에서는 앱 생명주기에 대해 정리해 보겠습니다!!

 

 

 

왜 지금에 와서야 앱 생명주기를 포스팅하냐면,,, 제가 요즘 기초의 중요성을 깨닫고 있어서 다시 처음부터 다시 보고 있답니다!

또 처음부터 다시 보면 제가 몰랐던(놓치고 있던)것들을 발견하지 않을까 싶어서 다시 공부하고 정리하는 중입니다.

 

먼저 공식문서부터 보시죠!!

 


728x90

https://developer.apple.com/documentation/uikit/app_and_environment/managing_your_app_s_life_cycle

 

Managing your app’s life cycle | Apple Developer Documentation

Respond to system notifications when your app is in the foreground or background, and handle other significant system-related events.

developer.apple.com

 

# 앱의 생명주기 Life Cycle

생명주기는 앱이 처음 실행 됐을 시점부터 종료되는 시점까지의 앱의 상태와 그 상태들 사이의 전이를 뜻합니다. 

앱의 생명주기는 앱 실행/종료/Foreground/Background 상태에 있을 때, 시스템이 발생시키는 이벤트에 의해 앱의 상태가 변하는 과정을 나타냅니다.

 

앱의 현재 상태에 따라 언제든지 수행할 수 있는 작업과 수행할 수 없는 작업이 결정됩니다. 

Foreground : 사용자의 주의를 끌기에 CPU를 포함한 시스템 리소스보다 우선순위가 높습니다.

Background : 가능한 적은 작업을 수행해야 하며, 화면 밖에 있기에 아무것도 하지 않는 것이 가장 좋습니다.

 

앱의 상태 -> 상태로 변경되면 그에 따라 동작을 조정해야 합니다.

 

UIKit은 각각에 대한 별도의 수명 주기 이벤트를 제공합니다. 

(기본 지원 활성화 : Info.plist파일에 UIApplicationSceneManifest 키 추가)

 

 

출처 : 애플 공식 문서 https://developer.apple.com/documentation/uikit/app_and_environment/managing_your_app_s_life_cycle

 

ios 13 ~ 이후 버전

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

ios 12 ~ 이전 버전

UIApplicationDelegate 객체 사용

 

iOS앱은 Objective-C 기반으로 돌아가기 때문에 main 함수에서 시작합니다. 

UIKit은 main 함수를 다루는 과정에서 UIApplicationMain 함수를 실행합니다. 이 함수를 통해 UIApplication 객체가 생성되고, 이 객체를 통해 앱 개발자는 앱의 실행에 부분적으로 관여할 수 있습니다.

 

 

 

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

1. Not Running : 앱이 실행 X, 종료되어 동작하지 않는 상태

 

2. Foreground - Inactive : 앱이 실행 중이지만 사용자로부터 이벤트를 받을 수 없는 상태. 멀티태스킹 윈도우로 진입, 앱 실행 중 전화, 알림 등에 의해 앱을 사용할 수 없는 경우

 

3. Foreground - Active : 앱이 실제 실행 중, 사용자 이벤트를 받아서 상호작용 할 수 있는 상태. 바로 Active상태는 될 수 없으며 Inactive 상태를 거친 후 Active 상태가 됩니다.

 

4. Background - Running : 홈 화면으로 나가거나 다른 앱으로 전환되어 현재 앱의 실질적인 동작을 하지 않는 상태입니다. 사용자가 앱을 사용하지 않는 동안 서버와 데이터를 동기화하거나 타이머가 실행되어야 하는 등의 작업을 이 상태에서 할 수 있습니다.

 

5. Background - Suspended : 앱을 다시 실행했을 때 최근 작업을 로드하기 위해서 메모리 관련 데이터만 저장되어 있는 상태입니다. 앱이 백그라운드 상태에 진입했을 때 다른 작업을 하지 않으면 Suspended 상태로 진입하게 됩니다. 이 상태의 앱들은 메모리가 부족해지면 가장 먼저 메모리에서 해제되고 앱을 다시 실행하려고 하면 처음부터 다시 실행됩니다. 

 

 

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

-> 즉, Scene이 Foreground에 혹은 Background에 있을 수 있습니다.

 

 

 

 

앱의 새로운 Scene을 요청하면 UIkit은 Scene을 생성, unattached인 연결되지 않은 상태로 설정합니다. 사용자가 요청한 Scene은 Foreground로 이동하며 보이고, 시스템이 요청한 Scene은 이벤트를 처리하도록 Background로 이동합니다.

 

 

 

이제 실제 앱이 실행되는 과정을 살펴봅시다!

1. 앱 실행

application(_: didFinishLaunchingWithOptions:)

 

앱이 실행되고 앱을 화면에 띄우기 위한 모든 설정이 완료된 후, 실제로 화면에 나타나기 직전에 호출됩니다.

 

2. Scene 연결

앱이 실행되면 UIkit에 Scene을 연결해야 합니다.

Scene이 연결되고 화면에 나타나기까지 아래의 메서드 순서가 호출됩니다.

 

// MARK: UISceneSession Lifecycle라는 마크 밑

application(:configurationForConnecting: options: )

 

새로운 Scene을 만들고 UIKit와 연결하기 위한 configuration을 지정합니다. 

 

그 후, 

scene(_:willConnectTo:options: )

 

SceneDelegate에서의 Scene이 연결될 것을 delegate에 알려줍니다. 

sceneDidBecomeActive(_:)

위의 메서드는 라이프사이클에서 Inactive에서 Active 상태로 전환되었을 때 호출됩니다.

 

앱 실행이 완료된 후, 다시 홈화면으로 나가게 되면 앱은 백그라운드(Suspended) 상태로 전환됩니다.

이때 SceneDelegate에서 호출되는 메서드는

sceneWillResignActive(_:)
sceneDidEnterBackground(_:)

 

앱이 Active에서 Inactive로 전환될 때 호출되는 sceneWillResignActive(_:)와 앱이 백그라운드 상태로 전환되었을 때 호출되는 sceneDidEnterBackground(_:)가 있습니다.

 

이제 다시 백그라운드에 있는 앱을 다시 실행시키면

Background - Inactive - Active의 순서 상태로 전환됩니다.

 

백그라운드 상태에 있는 앱을 다시 실행하면 InActive -> Active 상태로 전환됩니다.

이때

sceneWillEnterForeground(_:)

위의 메서드가 백그라운드에서 Inactive 상태로 전환될 때 호출되며

아래의 메서드가 Inactive에서 Active 상태로 전환될 때 호출됩니다.

sceneDidBecomeActive(_:)

 

3. Scene 연결 해제

Scene을 사용할 때에는 Multi Window를 지원합니다. 그렇기 때문에 앱이 둘 이상의 Scene Window를 가지게 된다면, 기존의 스와이프 업 제스처는 앱을 종료시키지 않고 Scene을 해제하게 됩니다. 모든 Scene의 연결이 해제되어야만 앱이 종료됩니다.

 

1. delegate에서 UIKit에 연결된 Scene의 연결 해제 요청

sceneDidDisconnected(_:)

 

2. 사용자가 멀티태스킹 창에서 한 개 이상의 Scene을 종료시켰을 때 호출

application(_: didDiscardSceneSessions:)

 

3. 앱이 사용자에 의해 종료될 때 호출(시스템에 의한 종료될 때는 호출 X = 예기치 못한 종료)

applicationWillTerminate(_:)

 

지금까지 iOS 버전 13 ~ 이후의 Lifecycle(앱 생명주기)에 대해 정리해 보았습니다!

 

또 정리해 보면서 헷갈렸던 부분에 대해 자세히 알게 되었는데요! 잘못된 부분에 대한 지적은 언제든 환영입니다!

다음 포스팅에서는 더 유익한 글로 돌아오겠습니다!

 

 

아래의 공식문서, 블로그 등을 참고해 작성되었습니다.


https://developer.apple.com/documentation/uikit/app_and_environment/managing_your_app_s_life_cycle

 

Managing your app’s life cycle | Apple Developer Documentation

Respond to system notifications when your app is in the foreground or background, and handle other significant system-related events.

developer.apple.com

https://velog.io/@ahneve/iOSSwift-앱의-생명주기-Apps-life-cycle

 

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

앱의 현재 상태란 앱이 언제든지 수행할 수 있는 작업과 수행할 수 없는 작업을 결정함. 예를 들어, 포그라운드 앱은 사용자의 주의를 끌기 때문에 CPU를 비롯한 시스템 리소스보다 우선순위를

velog.io

https://blog.naver.com/doctor-kick/222423840595

 

[iOS] 앱의 생명주기(LifeCycle) AppDelegate

생명주기 (Life Cycle)이란? 생명주기라는 것은 앱의 최초 실행부터 앱이 완전이 종료되기까지 앱이 가지...

blog.naver.com

 

728x90
반응형
LIST

'Swift 이론' 카테고리의 다른 글

Combine 알아보기  (0) 2024.08.05
iOS - LLDB  (2) 2024.04.18
Swift - ModernCollectionView  (0) 2024.04.14
Swift - CompositionalLayout  (2) 2024.04.13
Swift - Realm  (0) 2024.04.12