- 세트 엔진(수축→이완×횟수, 중단=미기록) iOS·워치 공용, 완주만 records.json 저장 - 첫 화면 시작 버튼 + 세팅(시간·횟수·진동 패턴)/설정(테마) 시트, 아래 스와이프 통계 - 통계: 하루(시간대별)/주간/월간 꺾은선, 달력 기준↔롤링(지난 7일·30일) 전환 - Live Activity(수축/이완·n/총·카운트다운), 백그라운드 무음 오디오로 타이머·진동 유지 - 단축어 '케겔 운동 시작', 워치 앱(즉시 시작·워치 전용 진동·physical-therapy 세션·기록 폰 병합) - 하루 다님 팔레트 계승(라이트/다크/시스템), 앱 아이콘 SVG→PNG 등록 - 검증: Debug·Release·워치 빌드 그린, 시뮬 QA 10장(26·18.5·워치 46/40mm), 완주·기록 경로 확인 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UPmp29DQHY6Ahfss5SRopT
47 lines
1.5 KiB
Swift
47 lines
1.5 KiB
Swift
//
|
|
// AppSettingsView.swift
|
|
// Keging
|
|
//
|
|
// 설정 — 앱 테마 등
|
|
//
|
|
|
|
import SwiftUI
|
|
|
|
struct AppSettingsView: View {
|
|
@AppStorage("app.theme", store: AppGroup.defaults) private var themeMode = "system"
|
|
@Environment(\.dismiss) private var dismiss
|
|
|
|
var body: some View {
|
|
NavigationStack {
|
|
Form {
|
|
Section("테마") {
|
|
Picker("화면 모드", selection: $themeMode) {
|
|
Text("시스템").tag("system")
|
|
Text("라이트").tag("light")
|
|
Text("다크").tag("dark")
|
|
}
|
|
.pickerStyle(.segmented)
|
|
}
|
|
Section {
|
|
LabeledContent("버전", value: versionText)
|
|
} footer: {
|
|
Text("케깅은 광고와 결제가 없는 완전 무료 앱이에요.")
|
|
}
|
|
}
|
|
.navigationTitle("설정")
|
|
.navigationBarTitleDisplayMode(.inline)
|
|
.toolbar {
|
|
ToolbarItem(placement: .confirmationAction) {
|
|
Button("완료") { dismiss() }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private var versionText: String {
|
|
let version = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as? String ?? "1.0"
|
|
let build = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") as? String ?? "1"
|
|
return "\(version) (\(build))"
|
|
}
|
|
}
|