본문 바로가기
iOS

[SwiftUI] 앱 생명주기: 깊이 이해하기

by GODOLs 2023. 11. 8.

목차

    SwiftUI View의 생명주기를 먼저 보고싶으신 분들은 이 링크를 클릭 하시면 됩니다.

     

    SwiftUI는 앱 개발을 위한 새로운 패러다임을 소개하면서, 앱의 생명주기 관리에도 명확한 변화를 가져왔습니다. UIKit의 AppDelegateSceneDelegate에 의존하던 전통적인 방식에서 벗어나,

     

    SwiftUI는 @main 구조체와 함께 App 프로토콜을 사용하여 앱의 시작점과 생명주기 이벤트를 관리합니다.  이 포스트에서는 SwiftUI 앱 생명주기의 주요 구성 요소를 예시와 함께 살펴보겠습니다.

    SwiftUI 앱의 구조

    SwiftUI 앱은 App 프로토콜을 준수하는 구조체로 시작합니다. 이 구조체는 앱의 진입점 역할을 하며, body 속성에서 앱의 초기 뷰를 제공합니다.

    import SwiftUI
    
    @main
    struct MyApp: App {
        var body: some Scene {
            WindowGroup {
                ContentView()
            }
        }
    }

     

    @main 지시어는 컴파일러에게 이 구조체가 프로그램의 진입점임을 알립니다. WindowGroup은 하나 이상의 뷰로 구성된 사용자 인터페이스를 나타내며, 일반적으로 앱의 메인 화면을 나타냅니다.

    생명주기(Lifecycle) 이벤트

    SwiftUI는 몇 가지 간단한 이벤트를 통해 생명주기를 관리합니다. 우리는 onAppear와 onDisappear를 뷰의 생명주기에 사용하는 것을 보았습니다. 앱 수준에서는 다음과 같은 이벤트를 사용할 수 있습니다:

    • willEnterForeground: 앱이 백그라운드에서 포어그라운드로 이동할 때 발생합니다.
    • didBecomeActive: 앱이 활성 상태가 되었을 때 호출됩니다.
    • willResignActive: 앱이 비활성 상태가 될 준비가 될 때 호출됩니다.
    • didEnterBackground: 앱이 백그라운드 상태로 전환될 때 호출됩니다.

    이러한 이벤트들은 ScenePhase 열거형(Enum) 을 사용하여 감지할 수 있으며, @Environment 속성 래퍼를 통해 현재 상태를 구독할 수 있습니다.

    @main
    struct MyApp: App {
        @Environment(\.scenePhase) private var scenePhase
    
        var body: some Scene {
            WindowGroup {
                ContentView()
            }
            .onChange(of: scenePhase) { newScenePhase in
                switch newScenePhase {
                case .background:
                    print("앱이 백그라운드로 이동했습니다.")
                    // 여기서 데이터를 저장하거나 백그라운드 작업을 정지할 수 있습니다.
                case .inactive:
                    print("앱이 비활성 상태가 되었습니다.")
                    // 활성 상태가 아닐 때 필요한 조치를 취할 수 있습니다.
                case .active:
                    print("앱이 활성 상태가 되었습니다.")
                    // 앱이 다시 활성화 될 때 초기화할 작업을 수행할 수 있습니다.
                default:
                    break
                }
            }
        }
    }
    

    이 예에서, scenePhase 상태가 변경될 때마다 onChange 클로저가 호출되고, 해당 상태에 맞는 작업을 수행할 수 있습니다. 예를 들어, 앱이 백그라운드로 이동할 때 중요한 데이터를 저장하거나, 앱이 활성화 될 때 사용자의 세션을 복구하는 작업을 할 수 있습니다.

    결론

    SwiftUI의 App 프로토콜은 앱의 생명주기를 훨씬 더 직관적으로 관리할 수 있게 해줍니다. @Environment의 scenePhase를 통해 앱의 현재 상태를 감지하고, 이에 적합한 작업을 수행함으로써, 사용자에게 더 나은 경험을 제공하고 자원을 효율적으로 관리할 수 있습니다. SwiftUI를 사용하여 앱의 생명주기를 관리하는 방법을 이해하고 적용함으로써, 더욱 강력하고 반응성 높은 애플리케이션을 구축할 수 있습니다.

     

    ps.

    물론 아직은 다른 외부 모듈이 AppDelegate를 사용할 수 밖에 없지만 추후에는 순수하게 SwiftUI 앱 생명주기로만 개발할 날이 멀지 않은것 같습니다. 더 정확하게 알고 있다면 어느상황에든 대비 할 수 있지 않을까 하는 생각을 가져봤습니다. :)

    반응형