iOS Application Life Cycle

iOS App들은 모두 고유한 생명 주기(Life-Cycle)를 갖는다.

앱의 상태에 따른 생명 주기의 구분이 있는데 이것들을 관리하는 클래스가 바로 AppDelegate이다.
AppDelegate가 중요한 이유는, 앱의 엔트리 포인트를 처리하는 부분이기 때문이다. 가령, 홈 화면에서 앱 아이콘을 클릭하여 들어가는 경우, 앱의 숏컷을 누르는 경우, Custom URL Scheme을 타고 진입하는 경우 등 모든 앱의 엔트리 포인트를 이곳에서 처리할 수 있다.

좀 더 자세히 들어가 보면, Objective-C로 작성된 iOS App의 경우 main.m파일을 확인할 수 있다. 이곳의 코드는 다음과 같다.

#import <UIKit/UIKit.h>
#import "AppDelegate.h"

int main(int argc, char * argv[]) {
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

코드에서 확인할 수 있듯이, C의 main 함수에서 애플의 ARC를 사용하기 위한 @autoreleasepool 블럭 안쪽에 UIApplicationMain으로 AppDelegate를 부르고 있다.
UIApplicationMain함수의 원형은 다음과 같다.

// If nil is specified for principalClassName, the value for NSPrincipalClass from the Info.plist is used. If there is no
// NSPrincipalClass key specified, the UIApplication class is used. The delegate class will be instantiated using init.
UIKIT_EXTERN int UIApplicationMain(int argc, char *argv[], NSString * __nullable principalClassName, NSString * __nullable delegateClassName);

주석문에서 확인할 수 있듯이, Launch Arguments다음 세번째 파라미터는 PrincipalClass라고 부르나 보다. Xcode에서 프로젝트를 생성하면 자동으로 nil이 들어가게 되고, 그렇기에 일반적으로 앱 중간중간에 [UIApplication sharedApplication]를 불러서 사용하게 된다.
그리고 마지막으로 네번째 파라미터는 delegateClassName인데 이곳에서 AppDelegate 클래스를 사용하겠다 라고 명시하고 있는 것이 main.m 파일에서의 내용이다.

그렇다면, 앱의 이벤트 Delegate인 AppDelegate에서 앱의 생명주기를 어떻게 구분짓고 관리하는지 보자.

  • (BOOL)application(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    App이 처음 실행될 때, 즉 메모리에 적재되고 난 뒤의 시점이다.
    이 부분에서 Storyboard를 사용하지 않는다면, 커스텀 ViewController로의 진입 등을 명시해 줄 수 있고, 앱이 구동되는데 필요한 다양한 설정(네트워크 데이터 요청 등)을 할 수 있다.
    launchOptions에 대한 애플 개발자 문서는 여기를 클릭하면 된다.
  • (void)applicationDidBecomeActive:(UIApplication *)application
    App이 메모리에 적재되고 난 뒤, 필요한 로드 상태가 끝나고 난 후의 시점이다. 즉, didFinishLaunchingWithOptions 후에 불리게 된다.
    메서드 명에서 알 수 있듯이 Active상태가 완료된 후를 의미한다.
  • (void)applicationWillResignActive:(UIApplication *)application
    App이 Active상태를 내려놓기 직전을 의미한다. 예를 들면, 홈 버튼을 눌러서 앱이 백그라운드로 들어가게 되면 이 메서드가 먼저 불리고 아래에 있는 DidEnterBackground가 불리게 된다.
  • (void)applicationDidEnterBackground:(UIApplication *)application
    조동사의 시제 Did에서 알 수 있듯이 앱이 백그라운드로 진입이 완료되고 난 후에 불리게 된다. 백그라운드 상태에서 suspend되기 전에 특정 작업을 수행해야 한다면 이곳에서 하면 된다.
  • (void)applicationWillEnterForeground:(UIApplication *)application
    App이 다시 포그라운드로 올라오기 전에 호출된다. 홈버튼을 눌러서 내렸던 앱을 다시 올리게 되면 이 메서드가 호출되고 난 뒤 DidBecomeActive의 순서로 호출되게 된다.
  • (void)applicationWillTerminate:(UIApplication *)application
    App이 완전히 종료되기 직전에 호출된다.

이 외에도 다양한 App의 이벤트를 처리할 수 있는 Delegate 메서드들이 존재한다. 애플 개발자 문서를 참조하여 필요한 부분을 구현하면 될 듯 하다.

댓글 남기기