ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [iOS] Managing Your App's Life Cycle (κ³΅μ‹λ¬Έμ„œ 정리)
    iOS/πŸ€– App 2021. 1. 26. 21:17

    1μ°¨ μˆ˜μ •: 2021/06/16

     

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

    이번 μ‹œκ°„μ—λŠ” 'Managing Your App's Life Cycle', 즉 μ•±μ˜ 생λͺ…μ£ΌκΈ°λ₯Ό 닀룬 κ³΅μ‹λ¬Έμ„œλ₯Ό 정리해보렀고 ν•©λ‹ˆλ‹€.

     

    μ•±μ˜ 생λͺ…μ£ΌκΈ°λ₯Ό κ΄€λ¦¬ν•˜λŠ” 것은

    μ•±μ˜ μƒνƒœμ— 따라 λ°œμƒν•˜λŠ”  `system notification` 에 μ‘λ‹΅ν•˜κ³ ,

    λ‹€λ₯Έ μ€‘μš”ν•œ μ‹œμŠ€ν…œ κ΄€λ ¨ μ΄λ²€νŠΈλ“€μ„ μ²˜λ¦¬ν•˜λŠ” 것이라고 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

     


    μ•±μ˜ μƒνƒœ

     

    앱은 ν˜„μž¬ μƒνƒœ(state) 에 따라 ν•  수 μžˆλŠ” λ™μž‘λ“€μ΄ μ •ν•΄μ ΈμžˆμŠ΅λ‹ˆλ‹€.

     

    예λ₯Ό λ“€μ–΄ `foreground` μƒνƒœμ˜ 앱은 μ‚¬μš©μžμ˜ 주의λ₯Ό 끌고 μžˆμœΌλ―€λ‘œ, CPUλ₯Ό ν¬ν•¨ν•œ μ‹œμŠ€ν…œ μžμ›μ— λŒ€ν•œ μš°μ„ κΆŒμ„ 가지고 μžˆμŠ΅λ‹ˆλ‹€.

     

    λ°˜λŒ€λ‘œ `background`μƒνƒœμΈ 앱은 μž‘μ—…μ„ μ•„μ˜ˆ ν•˜μ§€ μ•Šκ±°λ‚˜, κ°€λŠ₯ν•œ 적게 ν•΄μ•Ό ν•©λ‹ˆλ‹€.

    :: ν™”λ©΄μ—μ„œ 보이지 μ•ŠλŠ” μƒνƒœμ΄κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

     

    μœ„μ˜ 이유둜, μ•±μ˜ μƒνƒœκ°€ 변경될 λ•Œλ§ˆλ‹€ μ•±μ˜ λ™μž‘μ„ μ μ ˆν•˜κ²Œ μ‘°μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€.

     

    μ•±μ˜ μƒνƒœκ°€ λ³€κ²½λ˜λ©΄, UIKit은 μ μ ˆν•œ delegate methodλ₯Ό ν˜ΈμΆœν•˜μ—¬ μš°λ¦¬μ—κ²Œ μ•Œλ €μ€λ‹ˆλ‹€.

     

    iOS 13 ν˜Ήμ€ κ·Έ 이후 버전이라면, UISceneDelagate 였브젝트λ₯Ό μ΄μš©ν•˜μ—¬ `scene-based` μ•±μ˜ life-cycle 이벀트λ₯Ό μ²˜λ¦¬ν•©λ‹ˆλ‹€.

     

    UIScenceDelegate λŠ” λ©€ν‹° μœˆλ„μš° ( 같은 앱을 μ—¬λŸ¬κ°œ 창의 λ„μš°λŠ” ) κΈ°λŠ₯κ³Ό 관련이 μžˆμŠ΅λ‹ˆλ‹€.

    λ‹€μ‹œ λ§ν•˜λ©΄, μ•± UI μΈμŠ€ν„΄μŠ€λ₯Ό ν•œ κ°œκ°€ μ•„λ‹Œ 두 개 이상을 λ„μšΈμˆ˜ 있게 μ§€μ›ν•΄μ£ΌλŠ” ν”„λ‘œν† μ½œμž…λ‹ˆλ‹€.

     

    πŸ’‘μœ„ κΈ°λŠ₯이 ν•„μš” μ—†λ‹€λ©΄ info.plist 의 μˆ˜μ •κ³Ό 좔가적인 μž‘μ—…μ„ 톡해 iOS 13 μ΄ν›„μ˜ 버전이라도 UISceneDelegate 을 μ‚¬μš©ν•˜μ§€ μ•Šμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

     

    iOS 12 ν˜Ήμ€ κ·Έ 이전 버전이라면, UIApplicationDelegate 였브젝트λ₯Ό μ΄μš©ν•˜μ—¬ life-cycle 이벀트λ₯Ό μ²˜λ¦¬ν•©λ‹ˆλ‹€


     

     

    App-Based Life-CycleπŸ’‘πŸ’‘

     

    ❗️ iOS κ°œλ°œμžμ—κ²ŒλŠ”  essential of essentials μž…λ‹ˆλ‹€ ❗️

     

    iOS12 μ΄ν•˜ 버전, 그리고 Scene 을 μ§€μ›ν•˜μ§€ μ•ŠλŠ” 앱에 ν•΄λ‹Ήν•˜λŠ” 생λͺ…μ£ΌκΈ° μž…λ‹ˆλ‹€. (App-Based Life-Cycle)

     

    μ—¬κΈ°μ„œλŠ” UIKit 이 λͺ¨λ“  생λͺ…μ£ΌκΈ° κ΄€λ ¨ 이벀트λ₯Ό  UIApplicationDelegate 에 μ „λ‹¬ν•©λ‹ˆλ‹€.

     

    App delegate κ°€ λΆ„λ¦¬λ˜μ–΄ μžˆλŠ” 슀크린 ( μ™Έμž₯으둜 μ—°κ²°λœ 슀크린 ) 을 ν¬ν•¨ν•œ λͺ¨λ“  μ•±μ˜ window λ₯Ό κ΄€λ¦¬ν•©λ‹ˆλ‹€.

    :: 예λ₯Ό λ“€μ–΄ κ²Œμž„ 화면은 μ™Έμž₯ λͺ¨λ‹ˆν„°μ—μ„œ λ‚˜μ˜€κ³ , ν•Έλ“œν° ν™”λ©΄ μžμ²΄κ°€ μ»¨νŠΈλ‘€λŸ¬κ°€ λ˜λŠ” λ°©μ‹μ˜ μ•±μ΄λΌλ˜μ§€

     

    결과적으둜 μ•±μ˜ μƒνƒœλ³€ν™”κ°€ μ•±μ˜ 전체 UI 에 영ν–₯을 μ€λ‹ˆλ‹€.

     

    μ•„λž˜ 그림은 App delegate μ˜€λΈŒμ νŠΈμ™€ 연관이 μžˆλŠ” μ•±μ˜ μƒνƒœ λ³€ν™”λ₯Ό ν‘œν˜„ν•œ κ·Έλ¦Όμž…λ‹ˆλ‹€.

     

    졜초 μ‹€ν–‰λœ 이후, iOS λŠ” 앱을 Inactive ν˜Ήμ€  Background μƒνƒœμ— λ†“μŠ΅λ‹ˆλ‹€.

    μœ„ μƒνƒœλŠ” μ•± UI κ°€ 화면에 ν‘œμ‹œλ˜μ–΄μžˆλŠ” μ—¬λΆ€λ‘œ κ²°μ •λ©λ‹ˆλ‹€.

     

    Foreground, 즉 화면에 ν‘œμ‹œλ˜λŠ” μƒνƒœλ‘œ 앱이 μ‹€ν–‰λœλ‹€λ©΄, iOS λŠ” μžλ™μœΌλ‘œ μ•±μ˜ μƒνƒœλ₯Ό active 둜 μ „ν™˜ν•©λ‹ˆλ‹€.

     

    κ·Έ 이후, 앱이 μ΅œμ’… μ’…λ£Œλ˜κΈ° μ „κΉŒμ§€ μ•±μ˜ μƒνƒœλŠ” active 와 background μ‚¬μ΄μ—μ„œ μ „ν™˜μ„ λ°˜λ³΅ν•©λ‹ˆλ‹€.

     


    κ΄€λ ¨ λ¬Έμ„œλ₯Ό μΆ”κ°€μ μœΌλ‘œ μ •λ¦¬ν•˜μ˜€μŠ΅λ‹ˆλ‹€ πŸ₯³

    [iOS] Responding to the Launch of Your App (κ³΅μ‹λ¬Έμ„œ 정리)

     

     

     

     

     

    ❗️ μ•„λž˜ λ‚΄μš©μ€ μ΅œμ‹ ν™” λ˜μ§€ μ•Šμ•˜μœΌλ©°, Scene 을 μ‚¬μš©ν•˜λŠ” μ‹œμ μ— μˆ˜μ •ν•  κ³„νšμž…λ‹ˆλ‹€. ❗️

    Respond to Scene-Based Life-Cycle Events

     

    λ§Œμ•½ 앱이 볡수 개의 scene을 μ§€μ›ν•œλ‹€λ©΄, UIKit 은 각각의 life-cycle 이벀트λ₯Ό λ”°λ‘œ μ „λ‹¬ν•©λ‹ˆλ‹€.

     

    ν•œ 개의 Scene 은 κΈ°κΈ°μ—μ„œ μ‹€ν–‰λ˜κ³  μžˆλŠ” μ•± UI의 μΈμŠ€ν„΄μŠ€ ν•œ 개 λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

     

    μ‚¬μš©μžλŠ” 각각의 μ•±λ§ˆλ‹€ μ—¬λŸ¬ 개의 scene을 λ§Œλ“€ 수 있고, λ”°λ‘œλ”°λ‘œ λ³΄μ—¬μ£Όκ±°λ‚˜ 숨길 수 μžˆμŠ΅λ‹ˆλ‹€.

     

    각각의 scene이 각각의 κ³ μœ ν•œ life-cycle 을 가지고 있기 λ•Œλ¬Έμ—, μ €λ§ˆλ‹€ μ‹€ν–‰ 쀑 μƒνƒœκ°€ λ‹€λ₯Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

     

    예λ₯Ό λ“€μ–΄ ν•œ 개의 scene 은 `foreground` μ΄λ©΄μ„œ λ™μ‹œμ— λ‹€λ₯Έ scene듀은 `background`μ΄κ±°λ‚˜ `suspended` μΌ 수 μžˆμŠ΅λ‹ˆλ‹€.


    Important

     

    Scene supprtλŠ” 선택-μΆ”κ°€ κΈ°λŠ₯μž…λ‹ˆλ‹€.

    기본적인 supportλ₯Ό ν™œμ„±ν™”μ‹œν‚€λ €λ©΄, Info.plist 에 UIApplicationSceneManifest ν‚€λ₯Ό μΆ”κ°€ν•΄μ•Ό ν•©λ‹ˆλ‹€.

    κ΄€λ ¨ κΈ€ :  Specifying the Scenes Your App Supports

    ν•˜λ‚˜μ˜ κΈ°κΈ°μ—μ„œ ν•œ 화면에 λ™μ‹œμ— 같은 앱을 μ—¬λŸ¬ 개 μΌœλ†“λŠ” κΈ°λŠ₯μž…λ‹ˆλ‹€.


    μ•„λž˜ 그림은 μ”¬μ˜ μƒνƒœ 이동 (state transitions) λ₯Ό λ³΄μ—¬μ€λ‹ˆλ‹€.

     

    μ‚¬μš©μžλ‚˜ μ‹œμŠ€ν…œμ΄ 우리의 앱에 μƒˆλ‘œμš΄ 씬을 μš”κ΅¬ν•œλ‹€λ©΄, UIKit 은 그것을 μƒμ„±ν•˜κ³  그것을 `unattached` μƒνƒœλ‘œ λ§Œλ“­λ‹ˆλ‹€.

    μ΄λ•ŒλŠ” 씬이 μ–΄λ–€ μ•±κ³Ό μ—°κ²°λ˜μ–΄ μžˆμ§€ μ•Šμ€ μˆœμˆ˜ν•œ 씬 μƒνƒœμž…λ‹ˆλ‹€.

     

    μ‚¬μš©μž μš”μ²­ 씬 은 λΉ λ₯΄κ²Œ ν™”λ©΄ 상에 λ‚˜νƒ€λ‚˜κ²Œ λ˜λŠ” `foreground`μƒνƒœλ‘œ μ΄λ™ν•©λ‹ˆλ‹€.

     

    μ‹œμŠ€ν…œ μš”μ²­ 씬은 `background`둜 μ΄λ™ν•˜μ—¬ 이벀트λ₯Ό μ²˜λ¦¬ν•˜κ²Œ λ©λ‹ˆλ‹€.

     

    예λ₯Ό λ“€μ–΄, μ‹œμŠ€ν…œμ€ 보톡 location event λ₯Ό μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ 씬을 `background`μ—μ„œ μ‹œμž‘ν•©λ‹ˆλ‹€.

     

    μ‚¬μš©μžκ°€ μ•± UI λ₯Ό ν™”λ©΄μ—μ„œ 없애버렸을 λ•Œ ( dismiss ) , UIKit은 κ΄€λ ¨ 씬을 `background` μƒνƒœλ‘œ λ°”κΎΈκ³  κ²°κ΅­μ—λŠ” `suspended` μƒνƒœμ— λ†“μŠ΅λ‹ˆλ‹€.

     

    UIKit은 `background` λ‚˜ `suspended` μƒνƒœμ˜ 씬을 μ–Έμ œλ“ μ§€ μ—°κ²° ν•΄μ œ (disconnect) μ‹œν‚¬ 수 μžˆλŠ”λ°, κ·Έ 씬듀이 μ°¨μ§€ν•˜κ³  μžˆλŠ” μžμ›μ„ κ°€μ Έμ™€μ„œ, `unattached` μƒνƒœμ˜ μ”¬μ—κ²Œ λΆ€μ—¬ν•˜κΈ° μœ„ν•¨μž…λ‹ˆλ‹€.

    μ—°κ²° ν•΄μ œλŠ” 씬과 μ•± κ°„μ˜ 연결이 ν•΄μ œλ¨μ„ μ˜λ―Έν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. κ·Έλ ‡λ‹€λ©΄ ν•΄λ‹Ή 씬은 λ‹€μ‹œ unattached μƒνƒœκ°€ 될 κ²ƒμž…λ‹ˆλ‹€.

     

     

    그런데, Foreground μ•ˆμ—μ„œλ„ Inactive μƒνƒœμ™€ Active μƒνƒœκ°€ κ΅¬λΆ„λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. μ΄κ²ƒλ“€μ˜ μ°¨μ΄λŠ” λ¬΄μ—‡μΌκΉŒμš”?

     

     

    λ‹€μŒ μž‘μ—…λ“€μ„ μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ μ”¬μ˜ μ „ν™˜μ„ μ‚¬μš©ν•©λ‹ˆλ‹€:

     

    • UIKit μ΄ 씬을 우리의 μ•±κ³Ό μ—°κ²°ν•  λ•Œ, μ”¬μ˜ 졜초 UIλ₯Ό κ΅¬μ„±ν•˜κ³  씬이 ν•„μš”λ‘œ ν•˜λŠ” 데이터λ₯Ό λΆˆλŸ¬μ˜€μ„Έμš”.
    • `foreground-active` μƒνƒœλ‘œ μ „ν™˜ν•  λ•Œ, UIλ₯Ό κ΅¬μ„±ν•˜κ³ , μ‚¬μš©μžμ™€μ˜ μƒν˜Έμž‘μš©μ— μ€€λΉ„ν•˜μ„Έμš”.
    • `foreground-active` μƒνƒœμ—μ„œ `~inactive` μƒνƒœλ‘œ μ „ν™˜ν•˜λ©΄μ„œ, 데이터λ₯Ό μ €μž₯ν•˜κ³  μ•±μ˜ λ™μž‘μ„ μ΅œμ†Œν™” (quiet) ν•˜μ„Έμš”. 
    • `background` μƒνƒœλ‘œ μ§„μž…ν•˜λ©΄μ„œ, μ€‘μš”ν•œ μž‘μ—…μ„ 끝내고, λ©”λͺ¨λ¦¬λ₯Ό κ°€λŠ₯ν•œ 많이 ν•΄μ œν•˜κ³ , μ•± Snapshot μ„ μ€€λΉ„ν•˜μ„Έμš”.
    • UIKit μ΄ 씬을 우리의 μ•±κ³Ό μ—°κ²° ν•΄μ œν•  λ•Œ, 씬과 κ΄€λ ¨λœ 곡유 μžμ›μ„ ν•΄μ œν•˜μ„Έμš”.
    • 씬-κ΄€λ ¨ μ΄λ²€νŠΈμ—μ„œ μΆ”κ°€μ μœΌλ‘œ, μš°λ¦¬λŠ” 우리의 앱이 μ‹œμž‘ν•  λ•Œ UIApplicationDelegate λ₯Ό μ‚¬μš©ν•˜μ—¬ λ°˜μ‘ν•΄μ•Ό ν•©λ‹ˆλ‹€.

     

    Respond to Other Significant Events

     

    life-cycle 이벀트 처리 이외에 μΆ”κ°€μ μœΌλ‘œ, 앱은 μ•„λž˜ ν‘œμ— μžˆλŠ” μ΄λ²€νŠΈλ“€μ˜ μ²˜λ¦¬λ„ 쀀비해놓아야 ν•©λ‹ˆλ‹€.

    UIApplicationDelegate 였브젝트λ₯Ό μ΄μš©ν•˜μ—¬ λŒ€λΆ€λΆ„μ˜ μ΄λ²€νŠΈλ“€μ„ λ‹€λ£Ήλ‹ˆλ‹€.

    λͺ‡λͺ‡μ˜ 경우, notification 을 μ΄μš©ν•΄ μ•±μ˜ λ‹€λ₯Έ λΆ€λΆ„μ—μ„œ 그것듀을 λ°˜μ‘ν•˜κ²Œ ν•  수 도 μžˆμŠ΅λ‹ˆλ‹€.

     

    Memory warnings Received when your app’s memory usage is too high. Reduce the amount of memory your app uses; see Responding to Memory Warnings.
    Protected data becomes available/unavailable Received when the user locks or unlocks their device. See applicationProtectedDataDidBecomeAvailable(_:) and applicationProtectedDataWillBecomeUnavailable(_:).
    Handoff tasks Received when an NSUserActivity object needs to be processed. See application(_:didUpdate:).
    Time changes Received for several different time changes, such as when the phone carrier sends a time update. See applicationSignificantTimeChange(_:).
    Open URLs Received when your app needs to open a resource. See application(_:open:options:).

     

     

     

    끝!


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

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

     

    λŒ“κΈ€

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