티스토리 뷰

iOS

[iOS] About the App Launch Sequence 정리

Hani_Levenshtein 2021. 11. 19. 09:49

안녕하세요 Hani입니다.

이번에는 About the App Launch Sequence 아티클을 정리하면서

앱 아이콘을 눌러서 앱을 켤 때 어떤 일이 일어나는지 알아볼 거예요. ☺️

 

 

과정을 사진으로 보면..!

어후.. 복잡한 단계를 거쳐야 하나봐요. 🥺

 

차근차근 알아봅시당. 🧐


🥕 launch의 첫 번째 과정은 main이 실행되는 거예요.

 

 

엥 main 만든 적 없는데

 

import UIKit

@main
class AppDelegate: UIResponder, UIApplicationDelegate { }

extension UIApplicationDelegate {

    public static func main()
}

짜롼

 

Xcode에서 프로젝트를 생성하면 알아서 AppDelegate.swift에 @main을 만들어줘요. ☺️

 

@main은 UIApplicationDelegate 프로토콜을 준수한 AppDelegate의 타입 메서드인 main를 호출하도록 만들어 줍니다. 

즉, @main이 프로젝트의 Entry Point인거죠 ☺️

 

 

고대에는 @UIApplicationMain과 @NSApplicationMain이었다고 하는데

이번 포스팅에서는 가뿐하게 넘어가겠습니다. 


🥕 main은 UIApplicationMain 함수를 호출합니다.

 

func UIApplicationMain(_ argc: Int32, 
                     _ argv: UnsafeMutablePointer<UnsafeMutablePointer<CChar>?>, 
                     _ principalClassName: String?, 
                     _ delegateClassName: String?) -> Int32

UIApplicationMain 함수는 UIApplication 객체와 AppDelegate 객체를 생성합니다.

 

또한 앱의 run loop를 포함하는 main event loop를 설정하고 이벤트 처리를 시작하는데

UIApplicationMain는 리턴 타입이 있지만 run loop가 무한정 돌기 때문에 결국 리턴하지 않습니다. 😎

 

 

그리고 바로 아래서 얘기할 내용에 대한 사전 지식을 빌드업해보면..

 

만약 스토리보드를 이용하여 프로젝트를 생성하면

애플리케이션의 Info.plist는 UIMainStoryboardFile이라 불리는 키를 가지고 있습니다.

UIMainStoryboardFile이라는 키는 iOS 5 이전에 사용되었던 NSMainNibFile라는 키를 대체하는 키에요.

 

만약 앱의 main window가 스토리보드가 아닌 nib 파일에 의해 load 되었다면 NSMainNibFile 키를 사용해도 되지만

UIMainStoryboardFile과 NSMainNibFile 키를 동시에 사용할 수 없습니다.

 

UIMainStoryboardFile가 우선권을 가지고 있기 때문에 NSMainNibFile에서 지정된 nib 파일을 불러올 수 없어요. 🥺

 

 

 

하여튼 왜 이 얘기를 하느냐..

 

UIApplicationMain 함수에 대한 애플 공식문서에서 (iOS 2.0+ ...)

애플리케이션의 Info.plist의 NSMainNibFile 키에 nib 파일 이름이 지정되어있으면 nib 파일을 불러온다고 적혀있고

 

아티클에서는 Info.plist나 Xcode에서 지정된 스토리보드를 불러오거나

스토리보드를 사용하지 않으면 이 단계를 건너뛴다고 소개되어있는데

 

엄연히 nib이랑 storyboard랑은 다르니까 =_=

UIApplicationMain가 업데이트가 안 된 걸로 하자

 

 

 

 

결론:

UIApplicationMain은

UIApplication 객체와 AppDelegate 객체를 생성

main event loop 설정 및 이벤트 처리 시작

프로젝트가 스토리보드 사용할 때 UIMainStoryboardFile에 적힌 스토리보드를 불러옴

nib을 사용한다면 NSMainNibFile에 적힌 nib을 불러옴

 


🥕 UIKit이 AppDelegate의 willFinishLaunchingWithOptions 메서드를 호출합니다.

 

이 메서드에서는 Delegate에게 앱의 launch가 시작된 후 main 스토리보드나 nib 파일이 load 되었으나,

앱의 State Restoration이 일어나기 전에 호출됩니다.

 

이 메서드가 호출될 때 이 앱은 Inactive state입니다.

(Inactive는 Foreground이지만 이벤트를 받지 못하는 상태예요. 🥺)


🥕UIKit이 State Restoration을 수행하고 AppDelegate와 앱의 ViewController에서 추가적인 메서드를 실행합니다.

 

포스팅 상단 그림에서 Restore UI State - Various methods 부분이에요. 

State Restoration 과정은 이 포스팅에서 확인하실 수 있습니다.

 


🥕 UIKit이 AppDelegate에 있는 didFinishLaunchingWithOptions 메서드를 호출합니다.

 

이 메서드에서는 Delegate에게 앱의 launch가 거의 끝났고 run 될 준비가 되었음을 알려줍니다.

정확히는 State Restoration가 일어난 후, 앱의 window와 UI가 나타나기 전에 호출됩니다.


References

https://developer.apple.com/documentation/uikit/app_and_environment/responding_to_the_launch_of_your_app/about_the_app_launch_sequence

https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623032-application

https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1622921-application

https://developer.apple.com/documentation/uikit/1622933-uiapplicationmain/

iOS 7 Programming Pushing the Limits: Develop Advance Applications for Apple iPhone, iPad, and iPod Touch 1st Edition

 

 

 

 

 

 

 

 

 

 

 

'iOS' 카테고리의 다른 글

[iOS] NSCoding 정리  (0) 2021.12.07
[iOS] NSCoder 정리  (0) 2021.12.07
[iOS] About the UI Restoration Process 정리  (0) 2021.11.13
[iOS] HTTP 통신 허용하기  (0) 2021.09.30
[iOS] NotificationCenter 정리  (0) 2021.09.10
댓글