목차
SwiftUI View의 생명주기를 먼저 보고싶으신 분들은 이 링크를 클릭 하시면 됩니다.
SwiftUI는 앱 개발을 위한 새로운 패러다임을 소개하면서, 앱의 생명주기 관리에도 명확한 변화를 가져왔습니다. UIKit의 AppDelegate와 SceneDelegate에 의존하던 전통적인 방식에서 벗어나,
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 앱 생명주기로만 개발할 날이 멀지 않은것 같습니다. 더 정확하게 알고 있다면 어느상황에든 대비 할 수 있지 않을까 하는 생각을 가져봤습니다. :)
'iOS' 카테고리의 다른 글
[Swift] Hashable 프로토콜 이해하기 (0) | 2023.11.17 |
---|---|
[Swift] 접근제어에 대해서 알아보기 (0) | 2023.11.09 |
[SwiftUI] View의 생명주기: 이해 및 효과적 활용 (6) | 2023.11.07 |
[SwiftUI] @StateObject와 @ObservedObject는 뭐가 다를까? (2) | 2023.11.05 |
[iOS] Xcode 단축키 정리 (0) | 2023.11.04 |