ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [iOS] About the App Launch Sequence (μ•± μ‹€ν–‰ μ‹œμ μ— μΌμ–΄λ‚˜λŠ” 일듀)
    iOS/πŸ€– App 2021. 2. 2. 06:38

    1μ°¨ μˆ˜μ •: 21.08.02

     

    μ•ˆλ…•ν•˜μ„Έμš”πŸΆ

    이번 μ‹œκ°„μ—λŠ” "About the App Launch Sequence"

     

    μ•±μ˜ μ‹€ν–‰ μ‹œμ μ— μ‹€ν–‰λ˜λŠ” μ½”λ“œλ“€μ— λŒ€ν•΄μ„œ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

     


     

     

    앱은 μ‚¬μš©μžμ— μ˜ν•΄ foreground둜 μ‹€ν–‰λ˜κΈ°λ„ ν•˜κ³ , μ‹œμŠ€ν…œμ— μ˜ν•΄ background 둜 μ‹€ν–‰λ˜κΈ°λ„ ν•˜μ£ ?

     

    print("hello, world") 와 같은 λ‹¨μˆœν•œ μ ˆμ°¨μ§€ν–₯ ν”„λ‘œκ·Έλž¨κ³Ό 달리

     

    앱을 μ‹€ν–‰ν•˜λŠ” 것은 λ³΅μž‘ν•œ λ‹¨κ³„μ˜ 과정을 κ±°μΉ©λ‹ˆλ‹€.

     

    이 κ³Όμ •λ“€ λŒ€λΆ€λΆ„μ€ UIKit이 μžλ™μœΌλ‘œ μ²˜λ¦¬ν•©λ‹ˆλ‹€.

     

    μ•± μ‹€ν–‰ κ³Όμ • 쀑, UIKit 은 AppDelegate 의 λ©”μ„œλ“œλ“€μ„ ν˜ΈμΆœν•©λ‹ˆλ‹€.

     

    ν”„λ‘œμ νŠΈ ν…œν”Œλ¦ΏμœΌλ‘œ κΈ°λ³Έ μ œκ³΅ν•˜λŠ” AppDelegate ν΄λž˜μŠ€λŠ”

    UIResponder 와 UIApplicationDelegate ν”„λ‘œν† μ½œμ„ μ±„νƒν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

     

    >> [iOS] λ¦¬μŠ€ν°λ” μ²΄μΈμ΄λž€? (feat. UIResponder...) <<

     

     

    μš°λ¦¬λŠ” UIApplicationDelegate ν”„λ‘œν† μ½œμ˜ λ©”μ„œλ“œλ₯Ό 직접 κ΅¬ν˜„ν•΄

    μ•± μ‹€ν–‰ 쀑 μ›ν•˜λŠ” μ‹œμ μ— μ›ν•˜λŠ” μž‘μ—…μ„ μ‹€ν–‰μ‹œν‚¬μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.

     

    예λ₯Ό λ“€μ–΄ μŠ€ν† λ¦¬λ³΄λ“œλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  μ½”λ“œλ‘œ UIλ₯Ό ꡬ성할 λ•Œ,

    UIWindow μ˜€λΈŒμ νŠΈμ— 직접 rootViewController λ₯Ό μ„€μ •ν•΄μ£Όκ³  KeyWindow 둜 λ§Œλ“€μ–΄ μ£ΌλŠ” 과정을 κ±°μΉ˜λŠ”λ°, 이 λ™μž‘λ“€μ„ UIApplicationDelegate λ©”μ„œλ“œλ‚˜ UIWindowSceneDelegate λ©”μ„œλ“œμ— κ΅¬ν˜„ν•©λ‹ˆλ‹€.


     

     

     

    μ•„λž˜ 그림은 앱이 처음 μ‹€ν–‰λ˜μ—ˆμ„ λ•Œ λΆ€ν„°μ˜ μ΄ˆκΈ°ν™”λ₯Ό μ™„λ£Œν•˜κΈ° κΉŒμ§€μ˜ 일련의 과정을 λ¬˜μ‚¬ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

    과정을 μˆœμ„œλŒ€λ‘œ μ μ–΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

     

     

     

    1. μš°μ„ , 앱이 μ‚¬μš©μžλ‚˜ μ‹œμŠ€ν…œμ— μ˜ν•΄ μ‹€ν–‰λ©λ‹ˆλ‹€.

    이 λ¬Έμ„œμ—μ„œ μ‚¬μš©μžμ— μ˜ν•œ 싀행은 `explicitly` ν•˜κ²Œ,

    μ‹œμŠ€ν…œμ— μ˜ν•œ 싀행은 `implicitly`ν•˜κ²Œ μ‹€ν–‰λœλ‹€κ³  ν‘œν˜„λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

     

     

    2. Xcode κ°€ μ œκ³΅ν•˜λŠ” main( ) ν•¨μˆ˜κ°€ UIApplicationMain(_:_:_:_:) λ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€.

     

    " main() ν•¨μˆ˜λŠ” UIKIt 기반 μ•±μ˜ main entry point κ°€ λ©λ‹ˆλ‹€. "

     

    참고둜 이 μ—”νŠΈλ¦¬ 포인트λ₯Ό νŽΈν•˜κ²Œ μ„€μ •ν•˜λŠ” λ°©λ²•μœΌλ‘œ

    κΈ°μ‘΄μ—λŠ” @UIApplicationMain  νŠΉμ„±μ„ μ‚¬μš©ν–ˆμ—ˆλŠ”λ°,

    Swift5.3 λΆ€ν„°λŠ” @main 을 μ‚¬μš©ν•©λ‹ˆλ‹€.

     

    UIApplcationDelegate

     

    μ •ν™•νžˆ ν•˜μžλ©΄, Xcode κ°€ μ•„λ‹ˆλΌ UIApplcationDelegate κ°€ main() 의 κ΅¬ν˜„μ„ μ œκ³΅ν•©λ‹ˆλ‹€.

     

    >> ν”„λ‘œν† μ½œμ€ extension 을 톡해 κ΅¬ν˜„μ„ μ œκ³΅ν•  수 μžˆλŠ” 점 κΈ°μ–΅ν•˜μ‹œλ‚˜μš”?  <<

     

    λ”°λΌμ„œ UIApplicationDelegate λ₯Ό μ±„νƒν•œ AppDelegate 에

     

    μ»΄νŒŒμΌλŸ¬μ— μ˜ν•΄ μΆ”κ°€λœ unique main entry code 인

    AppDelegate.main()κ°€ μ‹€ν–‰ λ©λ‹ˆλ‹€.

     

    그리고 이 main() 이 UIApplicationMain(_:_:_:_:) 을 μ‹€ν–‰μ‹œν‚€λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

    ( λ‚΄λΆ€ κ΅¬ν˜„μ„ λ³Ό 수 μ—†κΈ° λ•Œλ¬Έμ— μΆ”μΈ‘μž…λ‹ˆλ‹€)

     

     

    3. UIApplicationMain(_:_:_:_:) μ΄ 

     UIApplication μ˜€λΈŒμ νŠΈ 와 AppDelegate 였브젝트λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.

     

     

    AppDelegate.init() 이 λ³΄μ΄μ‹œλ‚˜μš”?

    AppDelegate μ˜€λΈŒμ νŠΈκ°€ μƒμ„±λ˜λŠ” μ‹œμ μ— 브레이크 포인트λ₯Ό κ±Έμ–΄μ„œ μ‚΄νŽ΄λ³Έ κ²ƒμž…λ‹ˆλ‹€.

    이 μ‹œμ μ—λŠ” UIAppplciation μ˜€λΈŒμ νŠΈλ„ 같이 생성이 λ˜μ—ˆκ² λ„€μš”.

     

    메인 μ“°λ ˆλ“œμ˜ μŠ€νƒν”„λ ˆμž„ μƒμ—λŠ” 총 9개의 ν•¨μˆ˜κ°€ μžˆλŠ”λ°, 그쀑 2~4λ²ˆμ€ μƒλž΅ν•˜μ—¬ 보여주지 μ•Šκ³  μžˆμŠ΅λ‹ˆλ‹€.

     

    UIApplicationMain(_:_:_:_:) μžμ²΄λŠ” ν”„λ‘œμ νŠΈμ— λ“œλŸ¬λ‚˜ μžˆμ§€ μ•Šμ•„μ„œ, 브레이크 포인트λ₯Ό κ±Έ 수 μ—†μ—ˆμŠ΅λ‹ˆλ‹€πŸ™„

     

     

     

    4. UIKit κ°€ μ•±μ˜ 메인 μŠ€ν† λ¦¬λ³΄λ“œ ν˜Ήμ€ nib νŒŒμΌμ—μ„œ μ•±μ˜ κΈ°λ³Έ μΈν„°νŽ˜μ΄μŠ€λ₯Ό λΆˆλŸ¬μ˜΅λ‹ˆλ‹€.

    μ£Όμ œμ™€ μ–΄κΈ‹λ‚˜κΈ° λ•Œλ¬Έμ— μžμ„Έν•˜κ²Œ μ„€λͺ…μ„ν•˜μ§€ μ•Šκ² μ§€λ§Œ

    μŠ€ν† λ¦¬λ³΄λ“œ(.storyboard) 와 (.xib) νŒŒμΌμ€ UI μ•„μΉ΄μ΄λΈŒ μž…λ‹ˆλ‹€.

    λ”°λΌμ„œ 파일 -> μ½”λ“œ -> λ°”μ΄λ„ˆλ¦¬λ‘œ λ³€ν™˜ν•΄ μ£ΌλŠ” κ³Όμ •μ—μ„œ init?(coder:) λ₯Ό ν•„μˆ˜μ μœΌλ‘œ ν˜ΈμΆœν•˜κ²Œ λ©λ‹ˆλ‹€.

     

    >> [iOS] init?(coder:) λž€? <<

     

     

     

    5. UIKit이 AppDelegate 의  application(_:willFinishLaunchingWithOptions:) λ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€.

    이 μ½”λ“œμ—μ„œ μ»€μŠ€ν…€ λ™μž‘μ„ μž‘μ„±ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

    참고둜 willFinishiLaunchingWithOptions, didFinishLaunchingWithOptions μ—λŠ” 앱이 μ–΄λ–»κ²Œ μ‹€ν–‰λ˜μ—ˆλŠ”μ§€     에 λŒ€ν•œ 정보가 μ „λ‹¬λ©λ‹ˆλ‹€.

     

    6. UIKit κ°€ `state restoration`을 μˆ˜ν–‰ν•©λ‹ˆλ‹€.

    이 μž‘μ—…μ—μ„œ μ•± delegate λ‚˜ λ·°μ»¨νŠΈλ‘€λŸ¬μ—μ„œ 좔가적인 λ©”μ„œλ“œλ“€μ„ ν˜ΈμΆœν•©λ‹ˆλ‹€.

     

    7. UIKit κ°€ AppDelegate 의 application(_:didFinishLaunchingWithOptions:) λ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€.

     

    μ΄ˆκΈ°ν™”κ°€ μ™„λ£Œλ˜λ©΄, μ‹œμŠ€ν…œμ€ 우리의 μ•±μ˜ 씬 λΈλ¦¬κ²Œμ΄νŠΈλ‚˜ μ•± 델리게이트λ₯Ό μ‚¬μš©ν•˜μ—¬ UI λ₯Ό ν‘œμ‹œν•˜κ³  μ•±μ˜ 생λͺ… μ£ΌκΈ°λ₯Ό 관리 ν•©λ‹ˆλ‹€.

     

     

     

    끝!


    πŸ€–πŸŸ’[우짱의 iOS λΈ”λ‘œκ·Έ]πŸ”΅πŸ’»

    iOSλ₯Ό κ³΅λΆ€ν•˜λ©΄μ„œ 배운 λ‚΄μš©μ„ κΈ°λ‘ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

    λŒ“κΈ€

μ–΄μ œλ³΄λ‹€ λ°œμ „ν•œ λ‚˜