본 글은 About the app launch sequence (애플 공식 문서)를 한국어로 번역하여 옮긴 글입니다.
앱이 실행될 때 시스템이 코드를 실행하는 순서에 대해 배워봅시다.
앱을 실행하는 건 일련의 복잡한 단계를 수반하며, 그 대부분은 시스템이 자동으로 처리합니다. 앱을 실행하는 동안에, UIKit은 앱 델리게이트의 메서드를 호출하여 앱의 사용자 상호작용을 위한 준비를 하거나 앱이 필요로 하는 모든 특정 작업을 처리합니다. 아래는 앱이 실행되는 순간부터 그 단계가 끝나기까지 개별 단계를 보여줍니다.

사용자나 시스템이 앱을 실행하거나, 시스템이 앱을 사전에 준비(prewarm)합니다. 사전 준비에 대한 자세한 정보는 Prepare you app for prewarming을 참조하세요.
시스템은 Xcode가 제공하는 main() 함수를 실행합니다.
main() 함수는 UIApplicationMain(_:_:_:_:)을 호출하여 UIApplication과 앱 델리게이트의 인스턴스를 생성합니다.
UIKit은 앱의 Info.plist 파일이나 Xcode 프로젝트 에디터에서 타겟의 Custom iOS Target Properties 탭에 명시되어 있는 기본 스토리보드를 로드합니다. 기본 스토리보드를 사용하지 않는 앱은 이 단계를 건너뜁니다.
UIKit은 앱 델리게이트의 application(_:willFinishLaunchingWithOptions:) 메서드를 호출합니다.
UIKit은 앱 델리게이트와 뷰 컨트롤러의 추가적인 메서드를 호출하여 상태 복원(state restoration)을 수행합니다. 더 자세한 정보는 About the UI Restoration process를 참조하세요.
UIKit은 앱 델리게이트의 application(_:didFinishLaunchingWithOptions:) 메서드를 호출합니다.
앱 실행 단계를 모두 끝마치면, 시스템은 앱의 사용자 인터페이스나 그 생명 주기를 관리하기 위해 앱이나 씬 델리게이트를 사용합니다.
⭐️ 김지지의 Note
- 아래 그림은 스토리보드를 사용하지 앱의 실행 단계를 보여줍니다.
iOS 15와 이후 버전에서, 기기의 상태에 따라, 시스템은 앱이 사용하기 적합한 상태에 이르기 전까지 사용자가 기다려야 하는 시간을 줄이기 위해 미동작(non-running) 앱의 프로세스를 실행하여 앱을 사전 준비합니다. 사전 준비는 앱의 실행 단계에서 main() 함수가 UIApplicationMain(_:_:_:_:)을 호출하기 전까지만 실행됩니다. 이는 시스템이 완전한 실행에 대비하여 요구하는 저수준 구조를 생성하고 캐시를 할 수 있는 기회를 제공합니다.
⚪️ Note
앱이 실행되는 동안 시스템이 요구하는 저수준 구조에 대한 자세한 정보는 WWDC 세션 비디오 App Startup Time: Past, Present, and Future를 참조하세요.
시스템이 앱 사전 준비를 끝마치면, 그 실행 단계는 앱이 실행되어 단계가 재개되기 전까지 멈춘 상태를 유지합니다. 아니면 시스템은 자원을 확보하기 위해 메모리에서 사전 준비된 앱을 제거합니다. 시스템은 기기를 재부팅한 후나 시스템 상태가 허락하는대로 주기적으로 앱을 사전 준비할 수 있습니다.
앱이 UIApplicationMain(_:_:_:_:)을 호출하기 전에 load()와 같은 정적 이니셜라이저에서 코드를 실행한다면, 이용 가능한 서비스와 자원이 무엇인지 추정하지 마세요. 예를 들어, 데이터 보호 정책은 잠금이 해제된 기기를 필요로 하고 사전 준비는 기기가 잠금 상태일 때도 진행될 수 있기 때문에 키체인 항목(item)은 이용 불가능할 수 있습니다. 코드가 특정 서비스나 자원 접근에 의존해야 한다면, 해당 코드를 실행 단계의 나중 단계로 옮기세요.
앱을 사전 준비하는 과정에서 사전 준비가 완료되고 사용자나 시스템이 앱을 완전히 실행할 때까지의 불확정적인 시간의 존재를 야기합니다. 이 때문에, 실행 단계의 여러 지점을 수동으로 표시하는 대신에, MetricKit을 사용하여 사용자 주도의 실행와 재개 시간을 정확하게 측정해야 합니다.