[생명주기 (Life Cycle)이란?]
생명주기라는 것은 앱의 최초 실행부터 앱이 완전이 종료되기까지 앱이 가지는 상태와 그 상태들 사이의 전이를 뜻합니다.
앱의 상태는 앱이 현재 어떠한 것을 할 수 있는가를 결정합니다.
[앱의 생명주기 (App's Life Cycle)이란?]
[iOS에서 앱을 실행하면 무슨 일이 벌어질까요?]
iOS앱은 Objective-C기반으로 돌아가기 때문에 앱은 main 함수에서 시작합니다.
다만, iOS의 핵심 라이브러리인 UIKit framework가 main 함수를 관리하기 때문에 앱 개발자들이 직접 main 함수에 코드를 작성하지 않습니다.
UIKit은 main함수를 다루는 과정에서 UIApplicationMain함수를 실행합니다. (main을 보면, UIApplicationMain함수가 있다.)
이 함수를 통해 UIApplication객체가 생성되는데, 이 객체를 통해 앱 개발자는 앱의 실행에 부분적으로 관여할 수 있게 됩니다.
[앱 실행되면 발생되는 일 정리]
UIApplication 객체가 생성됨
@UIApplicationMain 또는 @Main 어노테이션이 있는 클래스를 찾아 AppDelegate 객체 생성
Main Event Loop를 실행 (touch, text input등 사용자의 액션을 받는 루프)
[Main Run Loop]
[유저가 일으키는 이벤트의 처리 과정을 순서로 정리]
유저가 이벤트를 일으킨다. (버튼 터치, 화면 스와이프 등 같은 이벤트)
시스템을 통해 이벤트가 생성된다.
UIKit 프레임워크를 통해 생성된 port로 해당 이벤트가 앱으로 전달된다.
이벤트는 앱 내부적으로 Queue의 형태로 정리되고 Event Queue에 쌓인다.
Event Queue에 있는 이벤트들이 Main Run Loop에 하나씩 매핑된다.
UIApplication 객체는 이때 가장 먼저 이벤트를 객체로 어떤 것이 실행되어야 하는지 결정한다.
앞의 내용까지 사용자가 앱에 이벤트를 전달한 후 앱의 실행까지 어떤 과정을 통해 이뤄지는지 알아보았습니다.
여기서부터는 iOS앱의 실행전 상태, 실행 후 상태 등을 세부적으로 알아보겠습니다.
[앱 상태 (App State)]
Not Running
앱이 실행되지 않았거나, 완전히 종료되어 동작하지 않는 상태
Inactive (Foreground)
앱이 실행되면서 foreground에 진입하지만, 어떠한 이벤트도 받지 않는 상태입니다.
앱의 상태 전환 과정에서 잠깐 머무는 단계
active (Foreground)
앱이 실행 중이며, foreground에 있고, 이벤트를 받고 있는 상태입니다.
Background
앱이 백그라운드에 있으며, 다른 앱으로 전환되었거나 홈버튼을 눌러 밖으로 나갔을 때의 상태입니다.
예를 들어, 멜론 app을 켜놓고 다른 app을 사용해도 재생한 음악이 계속 실행되는 경우 입니다.
일정 시간이 지나 앱은 Suspended상태로 바뀌게 됩니다.
Suspended
앱이 Background 상태에 있찌만, 아무 코드도 실행하지 않은 상태입니다.
백그라운드에서 특별한 작업이 없을 경우 Suspended 상태가 됩니다.
이 상태에서 앱은 메모리상에 올라가있지만 아무 일도 하지 않기 때문에 배터리를 사용하지 않습니다.
또한 OS에 의해 메모리 부족현상이 발생하면 이 상태의 앱은 메모리에서 없어질 수 있으며, 이는 따로 알림을 하거나 하진 않습니다.
[AppDelegate 객체의 메소드 호출]
1. Not Running 상태일 때
application(_:willFinishLaunchingWithOptions:)
위 메소드 안에는 앱을 실행할 때 최초로 실행할 코드를 작성하면 좋습니다.
필요한 주요 객체들을 생성하고 앱 실행 준비가 끝나기 직전에 호출됩니다.
applicationDidFinishLaunching(_:)
앱 실행을 위한 모든 준비가 끝난 후 화면이 사용자에게 보여지기 직전에 호출됩니다.
주로 초기화 코드를 이곳에다 작성합니다.
applicationWillTerminate(_:)
앱이 종료되기 직전에 호출됩니다.
2. In-Active 상태일 때
sceneWillEnterForeground(_:)
앱이 background나 not running에서 foreground로 들어가기 직전에 호출됩니다.
비활성화 상태를 거쳐 활성화 상태가 됩니다.
sceneWillResignActive(_:)
App Switcher 모드(홈 바 쓸어 올렸을 경우 또는 홈 버튼 모델 홈 버튼 두번 눌렀을 경우)
3. Active 상태일 때
sceneDidBecomeActive(_:)
앱이 비활성화상태에서 활성상태로 진입하고 난 직후 호출됩니다.
앱이 실제로 사용되기 전에, 마지막으로 준비할 수 있는 코드를 작성할 수 있습니다.
4. Background 상태일 때
sceneDidEnterBackground(_:)
앱이 background 상태로 들어갔을 때 호출됩니다.
suspended상태가 되기 전 중요한 데이터를 저장하는 등 종료하기 전 필요한 작업을 합니다.
5. suspended 상태일 때
[Appdelegate.swift]
iOS앱 프로젝트를 생성하면 Appdelegate.swift 파일이 자동으로 생성됩니다.
AppDelegate객체는 UIResponder와 UIApplicationDelegate을 상속 및 참조하고 있습니다.
먼저 UIResponder는 앱에서 발생하는 이벤트들을 담고 있는 추상형 인터페이스 객체로 View와 사용자의 이벤트간의 연결을 관리하는 역할을 합니다.
그 다음, UIApplicationDelegate는 UIApplication 객체의 작업에 개발자가 접근할 수 있도록 하는 메서드들을 담고 있습니다.
예를 들어, didFinishLaunchingWithOptions, applicationWillResignActive 등과 같은 메소드를 통해 앱의 상태가 변할 때 수행할 작업들을 설정할 수 있습니다.
Not Running: 아무것도 실행하지 않은 상태 또는 실행중이긴 하지만 시스템에 의해서 종료된 상태
InActive: 앱이 Foreground 상태로 돌아가지만, 이벤트는 받지 않는 상태, 앱의 상태 전환 과정에서 잠깐 머무는 단계
Active: 일반적으로 앱이 돌아가는 상태 (이벤트를 받는 단계)
Background: 앱이 Suspended(유예 상태) 상태로 진입하기 전 거치는 상태