🔍 문제 상황
- 앱 최초 실행 시에만 온보딩을 보여주고 이후에는 스킵해야 함
- 앱을 재실행해도 온보딩 표시 여부 상태가 유지되어야 함
- 온보딩 완료 시 상태를 영구적으로 저장해야 함
💡 해결 방안
- @AppStorage를 활용한 상태 관리
// Main.swift
@AppStorage(UserDefaultsKeys.hasSeenOnboarding) private var hasSeenOnboarding = false
- SwiftUI의 @AppStorage를 사용하여 UserDefaults 접근을 단순화
- false는 UserDefaults에 값이 없을 때만 사용되는 초기값
- fullScreenCover로 온보딩 표시 제어
.fullScreenCover(isPresented: .init(
get: { !hasSeenOnboarding },
set: { hasSeenOnboarding = !$0 }
)) {
OnboardingView()
}
- 온보딩 완료 처리
// OnboardingView.swift
private func completeOnboarding() {
UserDefaults.standard.set(true, forKey: UserDefaultsKeys.hasSeenOnboarding)
dismiss()
}
🔧 작동 원리
- 최초 실행 시
// UserDefaults에 값이 없을 때
hasSeenOnboarding = false // 초기값 사용
- 온보딩 완료 후
// UserDefaults에 true 저장
UserDefaults.standard.set(true, forKey: UserDefaultsKeys.hasSeenOnboarding)
- 재실행 시
// UserDefaults에서 저장된 값 로드
hasSeenOnboarding = UserDefaults.standard.bool(forKey: key) // true
⚠️ 주의사항
- @AppStorage의 초기값(= false)은 UserDefaults에 값이 없을 때만 사용됨
- UserDefaults 값은 앱 삭제 전까지 유지됨
- 앱 업데이트는 UserDefaults 값에 영향을 주지 않음
🎯 Best Practice
// 앱 레벨에서 상태 관리
@AppStorage(UserDefaultsKeys.hasSeenOnboarding) private var hasSeenOnboarding = false
// 온보딩 뷰에서는 단순히 완료 처리만
private func completeOnboarding() {
UserDefaults.standard.set(true, forKey: UserDefaultsKeys.hasSeenOnboarding)
dismiss()
}
🔍 참고
- SwiftUI의 @AppStorage는 내부적으로 UserDefaults를 래핑
- 상태 변경 시 자동으로 View 업데이트
- 앱의 설정이나 사용자 기본값 저장에 적합