아요 개발 일기

[iOS] App의 생명주기 (Life Cycle) 본문

iOS

[iOS] App의 생명주기 (Life Cycle)

소진이 2023. 1. 10. 10:35

생명주기 (Life Cycle)🤔 ?

생명주기란 앱의 최초 실행부터 앱이 완전히 종료되기까지 앱이 가지는 상태와 그 상태들 사이의 전이를 뜻합니다.

 

 

앱의 생명주기는 두가지가 있는데,

이는 SceneDelgate가 생기기 전후로 나뉩니다!

 

 

iOS 13 이상 버전부터

SceneDelegate의 UISceneDelegate를 사용하면서

기존 13 이하 버전에서 사용했던

AppDelegate의 UIApplicationDelgate을 사용하는 주기와 메소드의 변화가 생기게되었습니다!

 

 

~ iOS 12: AppDelegate 사용 (SceneDelegate 없음)

iOS 13 ~: SceneDelegate 사용

 


 

 

iOS 13 이후 - SceneDelegate

 

iOS13부터 window(화면)의 개념이 scene으로 변경되었고,

하나의 앱에 여러 개의 윈도우(Window)를 동시에 사용할 수 있게 되었기 때문에 

UI 생명주기를 전담 관리해줄 클래스로 SceneDelegate가 생깁니다.

 

 

App Delegate에 있던 UI LifeCycle의 기능을 이전해 각 Scene에 대해 관리

App Delegate에 Scene 정보를 관리하는 Session LifeCycle가 추가됩니다.

 


Session LifeCycle

 

https://developer.apple.com/documentation/uikit/uiapplicationdelegate

 

application (_ : configurationForConnecting : options :)
// 새로운 scene을 만들 때 사용할 UIKit의 구성 객체를 반환합니다.

application (_ : didDiscardSceneSessions :)
// 사용자가 app switcher를 통해 scene을 닫았을 때 호출됩니다.

 


 

그럼 Session LifeCycle을 살펴볼까요?

 

 

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

 

 

Scene LifeCycle에서는 Not Runnig단계가 사라지고 Unattached가 생겼네요??

한 단계씩 또 자세히 살펴보도록 하겠습니다 :)

 

 Unattached 

유저나 시스템이 앱의 새로운 scene을 요청하면 UIKit은 이를 생성하고 Unattached 상태로 유지

앱이 메모리를 점유하고 실행중인 상태

 

 

 Foreground Inactive

앱 실행 중 미리알림 또는 일정 얼럿이 화면에 덮여서 앱이 실질적으로는 이벤트를 받지 못하는 상태거나,

앱이 Active상태로 전환 과정에서 잠깐 머무는 단계

 

ex) 미리알림 등의 alert가 올라와 앱이 실질적으로 이벤트를 받지 못하는 상황

전화가 왔을 때, 시스템 메시지가 떴을 때 (예 : 배터리 부족)

 


 

 

 

sceneDidBecomeActive(_:)

앱이 비활성화 상태에서 활성 상태로 진입하고 난 직후 호출

앱이 실제로 사용되기 전에 마지막으로 준비할 수 있는 코드를 작성

앱이 active 상태가 되어 실행 중일 때 실행

InActive -> Active

 


 

Foreground Active

앱이 실행 중이며, foreground에 있고, 이벤트를 받고 있는 상태

어플리케이션이 실질적으로 활동하고 있는 상태


 

 sceneWillResignActive(_:)

App Switcher 모드

(홈 바 쓸어 올렸을 경우 또는 홈 버튼 모델 홈 버트 두번 눌렀을 경우)

Active -> InActive

 


 

Background

앱이 백그라운드에 있으며, 다른 앱으로 전환되었거나 홈 버튼을 눌러 밖으로 나갔을 때의 상태

Suspended 상태가 되기 전 잠깐 머무름 (추가 코드 실행이 필요하면 머무는 시간 연장)

홈버튼을 두번 눌러 앱을 다시 열었을 때, 처음부터 재실행되지 않는다면 background 상태에 있다가 올라온 것

ex) background에서 음악을 재생하거나 거리를 추적하고 있는 상황


sceneDidEnterBackground(_:)

앱이 background 상태로 들어갔을 때 호출

suspended 상태가 되기 전 중요한 데이터를 저장하는 등 종료하기 전 필요한 작업

Background -> Suspended

 

sceneWillEnterForeground(_:)

앱이 background나 Unattached에서 Active 상태로 들어가기 직전에 호출

Background/ Unattached -> InActive


 

 

Suspended

앱이 Background 상태에 있지만, 아무 코드도 실행하지 않은 상태

백그라운드에서 특별한 작업이 없을 경우 Suspended 상태라고 합니다.

이 상태에서 앱은 메모리상에 올라가있지만 아무 일도 하지 않기 때문에 배터리를 사용하지 않습니다.

또한 OS에 의해 메모리 부족 현상이 발생하면 이 상태의 앱은 메모리에서 없어질 수 있으며,

이는 따로 알림을 하거나 하진 않습니다.

 

따로 호출되는 메소드는 없으며 background 상태에서 특별한 작업이 없을 때 이 상태가 됩니다.

 


 

iOS 13 이하 - AppDelegate

 

iOS13 이하는 SceneDelegate가 없으니까

모든 생명주기 관련 이벤트들은 모두 AppDelegate에게 전달 되겠죠?

 

우선 생명주기 부터 같이 살펴봅시다!

 

 

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

 

 

이미지를 보면 총 5가지의 상태가 있죠?

자세히 살펴 봅시다 :)

 

 

 Not Running 

앱이 실행되지 않았거나, 완전히 종료되어 동작하지 않는 상태

 


 

application(_:willFinishLaunchingWithOptions:)

: Not Running -> InActive 로 상태 변환

앱 실행 준비가 끝나기 직전에 호출

앱을 실행할 때 최초로 실행할 코드를 작성하면 좋음

 

 

 

applicationWillTerminate(_:)

: 앱이 종료되기 직전에 호출 (단, suspend 상태에서는 호출되지 않음)

 

 

다음 경우에는 호출되지 않음

메모리 확보를 위해 Suspended 상태에 있는 app을 종료시킬 때

사용자가 multitasking UI를 통해 종료할 때

오류로 인해 app이 종료될 때

Deivce를 재부팅할 때

 


 

 

 InActive 

앱 실행 중 미리알림 또는 일정 얼럿이 화면에 덮여서 앱이 실질적으로는 이벤트를 받지 못하는 상태거나,

앱이 Active상태로 전환 과정에서 잠깐 머무는 단계

 

ex) 미리알림 등의 alert가 올라와 앱이 실질적으로 이벤트를 받지 못하는 상황

전화가 왔을 때, 시스템 메시지가 떴을 때 (예 : 배터리 부족)

 


 

applicationDidBecomeActive(_:)

: 이 Active 상태로 전환되어 화면이 나타난 후 직후 호출

Inactive 상태로 넘어가 중지된 작업을 여기서 반드시 재실행시켜줘야 함

ex) 화면 갱신 등

 

InActive -> Active


 

 Active 

앱이 실행 중이며, foreground에 있고, 이벤트를 받고 있는 상태

어플리케이션이 실질적으로 활동하고 있는 상태

 


 

 

applicationWillResignActive(_:)

: App이 Inactive 상태로 전환되기 직전 호출

Active -> InActive

 


 

 

 

 Background  

앱이 백그라운드에 있으며, 다른 앱으로 전환되었거나 홈 버튼을 눌러 밖으로 나갔을 때의 상태

Suspended 상태가 되기 전 잠깐 머무름 (추가 코드 실행이 필요하면 머무는 시간 연장)

홈버튼을 두번 눌러 앱을 다시 열었을 때, 처음부터 재실행되지 않는다면 background 상태에 있다가 올라온 것

ex) background에서 음악을 재생하거나 거리를 추적하고 있는 상황


 

applicationDidEnterBackground(_:)

: 앱이 background 상태일 때 실행

Background 상태로 전환된 직후 호출

App이 언젠가 종료될 것임을 뜻하기 때문에 중요한 사용자 데이터를 저장하거나,

공유 자원을 해제하는 등의 작업 수행 필요

App이 재실행될 때 직전 상태를 복구할 수 있는 정보를 저장하는 코드

Background -> Suspended 

 

applicationWillEnterForeground(_:)

 Active 직전/ 화면에 보여지기 직전 호출

호출된 뒤 Inactive 상태를 거쳐 Active 상태로 진입

 

Background -> InActive로 전이될 때 실행


 

 

 Suspended 

앱이 Background 상태에 있지만, 아무 코드도 실행하지 않은 상태

백그라운드에서 특별한 작업이 없을 경우 Suspended 상태라고 합니다.

이 상태에서 앱은 메모리상에 올라가있지만 아무 일도 하지 않기 때문에 배터리를 사용하지 않습니다.

또한 OS에 의해 메모리 부족 현상이 발생하면 이 상태의 앱은 메모리에서 없어질 수 있으며,

이는 따로 알림을 하거나 하진 않습니다.

 

따로 호출되는 메소드는 없으며 background 상태에서 특별한 작업이 없을 때 이 상태가 됩니다.

 

 

 

 

참고 사이트

 

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://developer.apple.com/documentation/uikit/uiapplicationdelegate

 

UIApplicationDelegate | Apple Developer Documentation

A set of methods to manage shared behaviors for your app.

developer.apple.com

 

https://developer.apple.com/documentation/uikit/uiscenedelegate

 

UISceneDelegate | Apple Developer Documentation

The core methods you use to respond to life-cycle events occurring within a scene.

developer.apple.com


 

자!! LifeCycle에 대해서 알아보았는데

어떠신가요??

많이 어렵진 않죠?!

 

백그라운드 작업을 하거나,

은행 앱처럼 Background 상태 화면은 검정 화면으로 처리하거나 등등

여러가지 부분에서 다양하게 활용할 수 있고

꼭 알아야되는 개념 같아요!

 

혹시 틀린 개념이나 부족한 부분은 댓글로 알려주시면

보안해서 다시 업로드 하도록하겠습니다 :)

글 읽어주셔서 감사합니다!!