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선생님