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

유인호·2024년 1월 3일
0

iOS

목록 보기
5/56

1. 사용자가 앱을 실행하면

  • C언어를 공부하다보면 C언어는 Main함수에서 시작해 Main함수에서 끝낸다라고 많이 이야기 한다. iOS앱도 Objective-C 기반이기에 똑같이 돌아간다.
  • UIKit이 Main함수를 관리하게 되고, 그 과정에서 UIApplication이 생성되는데, 여기서 개발자가 이것 저것 설정하게 됨.

순서로 나타내자면
1. 사용자가 앱을 터치(실행)
2. UIApplication 등장
3. @Main, @UlApplicationMain 어노테이션이 있는 Class를 찾음
4. 메인 클래스 실행
5. 앱의 주요 런루프 실행 (Delegate 및 Handler 호출)
6. 다양한 뷰 컨트롤러 및 뷰 계층 구성


2. 앱의 생명주기

1. Not Running

  • 실행되기 전, 추후 설명할 백그라운드에서 Suspend된 상태에서 메모리가 해제되면 Not Running으로 돌아간다.

2. Inactive (Foreground)

  • 앱이 실행되면서 잠깐 머무는 단계, UI를 구성중 및 사용자와의 인터렉션을 준비하는 단계이다. 런치스크린이나 앱 사용중 알람, 전화등이 올때 Inactive상태가 된다.

3. Active

  • 사용자가 앱을 사용하고 인터랙션 할 수 있는 상태

4. Background

  • 앱의 코드가 실행되고는 있지만 사용자의 눈에는 보이지 않는 상태, 음악앱에서 음악을 들을 때 등

5. Suspend

  • 아이폰의 메모리에 앱이 올라가 있으나 코드가 동작하지 않는 상태, iOS에서 램의 용량이 부족하게 되면 자동으로 램 메모리에서 지워지게 되고, Not Running 상태로 돌아가게 됨

정리하자면


3. SceneDelegate vs AppDelegate

iOS 13 이전 (~ iOS 12)


iOS 13 이전에는 SceneDelegate가 없기 때문에 AppDelegate에서 모든걸 처리한다. 왜냐하면, 앱을 무조건 하나만 켤 수 있다는 믿음이 있었기 때문이다.
그래서 AppDelegate에서 모든걸 관리하게 되면서 앱의 생명주기의 변화는 곧 앱 UI의 변화와 동일했다.

그러나..

ios 13 이후 (iOS 13 ~)


iOS 13에서 iPadOS가 등장하게 되면서 그 믿음이 깨지게 되었다. 한번에 여러개의 앱을 켤 수 있게 된 것. 그리하여 Scene마다 SceneDelegate를 가지게 되었고, 각각 Window 마다 생명주기를 가질수 있게 되었다.


4. 간단한 실험

  • SeneneDelegate파일의 함수에 print를 놓고 여러 동작을 하면 어떤 순서로 함수가 실행이 될까?

앱을 실행할 때

sceneWillEnterForeground
sceneDidBecomeActive

하단 바를 올려서 Inactive상태로 만들 때

sceneWillResignActive

하단 바를 올린 후 다른곳을 터치해서 메인화면으로 들어왔을 때

sceneDidEnterBackground

Inactive 상태에서 다시 앱을 실행했을 때

sceneWillEnterForeground
sceneDidBecomeActive

핸드폰의 화면을 끌 때

sceneWillResignActive
sceneDidEnterBackground

핸드폰의 화면을 다시 켤 때

sceneWillEnterForeground
sceneDidBecomeActive

앱을 종료할 때

sceneDidEnterBackground
sceneDidDisconnect

5. 자매품

  • 메모리가 부족해서 앱이 꺼질때 실행되는 함수
applicationDidReceiveMemoryWarning(_:) 

공식문서


6. 레퍼런스

킥킥박사님 블로그
애플 공식문서
G선생님

profile
🍎Apple Developer Academy @ POSTECH 2nd, 🌱SeSAC iOS 4th

0개의 댓글