mycode/myApp/HaruDanim/IOS/Views/HelpView.swift
songyc macbook 9626e6841e feat(help): example screenshots in help topics (ko/en/ja)
- 도움말이 글만 있어 처음 사용자가 이해하기 어렵다는 피드백 → 그룹당 대표 주제 1개에 예시 스크린샷 추가 (모음 탭·목표 진행률·기록 타임테이블·글래스 버블 메뉴·워치 첫 화면·iPad 일기 요약, 총 6종)
- 스크린샷에 UI 문구가 박혀 있어 언어별 파일로 관리 — 시뮬 로케일별 재시드로 ko/en/ja 각각 촬영(18장, 축소·JPEG 압축 총 ≈1.6MB), IOS/HelpImages/에 배치. HelpImage 로더가 표시 언어에 맞는 변형 선택(jpg는 UIImage(named:) 확장자 생략 탐색에 안 걸려 URL 로드)
- 워치 이미지는 시뮬 페어링 특유의 빨간 연결 끊김 아이콘을 상태바 크롭으로 제거 — '측정 중 행 탭 종료' 신기능이 이미지에 그대로 담김
- 검증 인자 신설: -helpExpandAll(전 주제 펼침), -helpScrollTo <앵커>(이미지 주제로 스크롤) — ko/en 아이폰·ko 아이패드 도움말 화면 렌더 스크린샷 확인
- 이미지는 accessibilityHidden(본문 낭독과 중복 방지). 새 문자열 없음(카탈로그 무변화). CLAUDE.md §6.8·§14 갱신. Debug/Store 빌드 성공

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014CkLDi8Lr21vGqo4SjZaTp
2026-07-18 07:15:46 +09:00

401 lines
26 KiB
Swift

//
// HelpView.swift
// Haru_Danim
//
// : .
// iPhone / · ·,
// iPad ·(). DisclosureGroup.
//
import SwiftUI
// MARK: -
private struct HelpTopic: Identifiable {
let id = UUID()
let symbol: String
let title: LocalizedStringKey
let body: LocalizedStringKey
/// (: "help-main").
/// IOS/HelpImages/help-main-ko.jpg HelpImage
var imageName: String? = nil
}
/// (ko/en/ja) .
/// UI String Catalog .
private enum HelpImage {
static func load(_ base: String) -> UIImage? {
let lang: String
switch Bundle.main.preferredLocalizations.first?.prefix(2) {
case "en": lang = "en"
case "ja": lang = "ja"
default: lang = "ko"
}
// jpg UIImage(named:) URL
for candidate in ["\(base)-\(lang)", "\(base)-ko"] {
if let url = Bundle.main.url(forResource: candidate, withExtension: "jpg"),
let image = UIImage(contentsOfFile: url.path) {
return image
}
}
return nil
}
}
private struct HelpGroup: Identifiable {
let id = UUID()
let title: LocalizedStringKey
let topics: [HelpTopic]
}
// MARK: -
struct HelpView: View {
private var groups: [HelpGroup] {
var result: [HelpGroup] = [basics, mainTab, goals, history, sync]
if DeviceLayout.isPad {
result.append(diary)
} else {
result.append(iphoneUI)
result.append(watch)
}
result.append(premiumHelp)
return result
}
var body: some View {
ScrollViewReader { proxy in
List {
ForEach(groups) { group in
Section(group.title) {
ForEach(group.topics) { topic in
// : -helpExpandAll YES(DEBUG) ( )
Group {
if Self.forceExpanded {
DisclosureGroup(isExpanded: .constant(true)) {
topicBody(topic)
} label: {
topicLabel(topic)
}
} else {
DisclosureGroup {
topicBody(topic)
} label: {
topicLabel(topic)
}
}
}
.id(topic.imageName ?? topic.id.uuidString)
}
}
}
}
.onAppear {
#if DEBUG
// : -helpScrollTo help-main
if let anchor = UserDefaults.standard.string(forKey: "helpScrollTo") {
DispatchQueue.main.asyncAfter(deadline: .now() + 1.2) {
withAnimation { proxy.scrollTo(anchor, anchor: .top) }
}
}
#endif
}
}
.scrollContentBackground(.hidden)
.background(AppTheme.background)
.navigationTitle("도움말")
.navigationBarTitleDisplayMode(.inline)
.toolbar(.hidden, for: .tabBar)
}
/// (DEBUG -helpExpandAll YES)
private static let forceExpanded: Bool = {
#if DEBUG
return UserDefaults.standard.bool(forKey: "helpExpandAll")
#else
return false
#endif
}()
private func topicBody(_ topic: HelpTopic) -> some View {
VStack(alignment: .leading, spacing: 10) {
Text(topic.body)
.font(.subheadline)
.foregroundStyle(.secondary)
if let name = topic.imageName, let image = HelpImage.load(name) {
Image(uiImage: image)
.resizable()
.scaledToFit()
.frame(maxWidth: 300)
.clipShape(RoundedRectangle(cornerRadius: 12, style: .continuous))
.overlay(
RoundedRectangle(cornerRadius: 12, style: .continuous)
.strokeBorder(.quaternary)
)
.frame(maxWidth: .infinity)
.accessibilityHidden(true) //
}
}
.padding(.vertical, 4)
}
private func topicLabel(_ topic: HelpTopic) -> some View {
Label {
Text(topic.title)
.font(.body.weight(.medium))
} icon: {
Image(systemName: topic.symbol)
.foregroundStyle(AppTheme.green)
}
}
// MARK:
private var basics: HelpGroup {
HelpGroup(title: "기본 개념", topics: [
HelpTopic(
symbol: "figure.walk",
title: "행동 — 추적의 최소 단위",
body: "행동 탭에서 습관이나 할 일을 '행동'으로 등록해요. 만들 때 시간 추적형(시작·종료 토글로 소요 시간 측정) 또는 횟수 추적형(탭할 때마다 +1) 중 하나를 골라요. 이름·아이콘·꼬리표는 나중에 언제든 바꿀 수 있지만 추적 방식은 바꿀 수 없으니 처음에 잘 골라 주세요."
),
HelpTopic(
symbol: "tag.fill",
title: "꼬리표 — 색으로 분류",
body: "꼬리표는 행동을 묶는 태그예요. 고유의 색을 가지며, 행동 버튼의 색은 지정한 꼬리표의 색을 따라요. 하나의 행동에 여러 꼬리표를 붙일 수 있고, 꼬리표 탭이나 행동 만들기 화면에서 바로 추가할 수 있어요."
),
HelpTopic(
symbol: "flag.fill",
title: "목표와 다짐",
body: "목표는 '토익 700점 받기'처럼 큰 방향이고, 다짐은 그 아래 실천 단위예요. 다짐은 특정 행동(또는 꼬리표)을 골라 주기(하루·주간·월간·특정 기간)와 목표량을 정해요. '이상 달성'뿐 아니라 '이하 유지'(예: 영상 시청 하루 1시간 이하)도 만들 수 있어요."
),
])
}
// MARK:
private var mainTab: HelpGroup {
HelpGroup(title: "모음 탭", topics: [
HelpTopic(
symbol: "play.circle.fill",
title: "측정 시작·종료",
body: "행동 버튼을 탭하면 시간형은 측정이 시작되고 다시 탭하면 종료돼요(테두리로 측정 중을 구분). 횟수형은 탭할 때마다 1씩 올라가요. 여러 행동을 동시에 측정해도 되고, 측정 중인 행동은 상단 '현재 진행 중' 영역에서도 종료할 수 있어요. 끄는 걸 자주 잊는다면 설정 → 측정의 '장시간 측정 알림'을 켜 보세요 — 정한 시간을 넘기면 알려줘요.",
imageName: "help-main"
),
HelpTopic(
symbol: "clock.badge.xmark",
title: "짧은 기록 무시",
body: "설정 → 측정에서 '짧은 기록 무시'를 켜면 설정한 시간보다 짧게 측정하고 끝낸 기록은 저장하지 않아요. 행동 버튼을 실수로 눌렀다가 바로 껐을 때 의미 없는 기록이 쌓이는 것을 막아 줘요. 기준 시간은 3초부터 1분까지 고를 수 있고, 위젯·워치·시리로 종료할 때도 똑같이 적용돼요."
),
HelpTopic(
symbol: "hand.tap.fill",
title: "길게 누르기 메뉴",
body: "행동 버튼을 길게 누르면 기록 직접 입력·수정, 메모, 기록 확인, 통계 보기, 행동 설정 수정, 삭제를 할 수 있어요. 시간형은 시작·종료 시각을, 횟수형은 횟수와 시각을 직접 고칠 수 있어요."
),
HelpTopic(
symbol: "note.text",
title: "기록에 메모 남기기",
body: "행동 탭에서 행동을 열어 '기록 시 메모 창 표시'를 켜면, 시간 측정을 종료할 때·횟수를 추가할 때마다 메모 창이 떠서 그 기록에 한 줄을 남길 수 있어요(건너뛰기 가능). 이 설정은 기기마다 따로 저장돼요. 남긴 메모는 기록 탭 목록에 노란 글씨로 표시되고, 기록을 탭해 수정할 때 메모를 고치거나 새로 붙일 수도 있어요."
),
HelpTopic(
symbol: "square.grid.3x3.fill",
title: "배치 편집",
body: "오른쪽 위 '배치 편집'을 누르면 버튼이 흔들리며 드래그로 순서를 바꿀 수 있어요. 한 줄에 몇 개를 놓을지도 고를 수 있어요. '완료'를 누르면 저장되고, 이 순서는 위젯의 기본 표시 순서에도 쓰여요."
),
HelpTopic(
symbol: "arrow.clockwise",
title: "새로고침 버튼",
body: "왼쪽 위 새로고침 버튼은 화면을 앱을 껐다 켠 것처럼 다시 불러와요. 다른 기기(아이패드·아이폰·워치)에서 기록했는데 이 기기 화면에 아직 안 보일 때 눌러 주세요. iCloud 동기화가 도착해 있다면 바로 반영돼요."
),
])
}
// MARK:
private var goals: HelpGroup {
HelpGroup(title: "목표 탭", topics: [
HelpTopic(
symbol: "chart.bar.fill",
title: "진행률 읽는 법",
body: "다짐마다 하루·주간·월간 진행률이 표시돼요. 주간·월간 진행률은 하루 초과 달성이 다른 날의 미달을 가리지 않도록 하루 목표량까지만 인정해 합산하고, 요일·날짜를 정한 다짐은 수행일의 기록만 집계해요 — 수행일이 아닌 날의 '하루' 진행률은 '수행일 아님'으로 표시돼요. 다짐 자신의 주기(하루 다짐의 '하루' 등)에서는 100%를 넘는 초과 달성이 그대로 표시되지만, 주간 다짐의 '하루'처럼 주기와 다른 기간은 목표를 그 기간 몫으로 나눈 페이스 기준이라 최대 100%까지만 표시돼요. '이하 유지' 다짐은 한도 안이면 100%, 넘으면 0%예요 — 주간·월간 한도 다짐의 '하루'는 하루 몫 한도 기준이라, 주간 한도가 남았어도 오늘 많이 쓰면 먼저 알려주는 경고 역할을 해요.",
imageName: "help-goal"
),
HelpTopic(
symbol: "clock.badge.checkmark",
title: "마감 시각까지 달성하기",
body: "하루 단위 다짐을 만들 때 '마감 시각까지만 집계'를 켜면 하루 시작부터 그 시각까지의 기록만 다짐에 집계돼요. 예를 들어 '일어나기 1회 · 오전 8:00까지'로 만들면 8시 이후에 누른 기록은 남긴 하지만 그날 달성으로는 인정되지 않아요. '이하 유지' 다짐은 마감 시각까지 한도를 지키면 그날 달성이에요. 시간 측정 행동이 마감을 걸치면 마감 전까지의 시간만 인정돼요. 하루 시작 시간보다 이른 시각을 고르면 다음 날 새벽(그 하루가 끝나기 전)을 뜻해요."
),
HelpTopic(
symbol: "flame.fill",
title: "연속 달성 표시",
body: "다짐을 끊기지 않고 지키면 불꽃과 함께 '연속 3일'처럼 표시돼요. 요일이나 날짜를 정한 다짐은 그 수행일만 세고, 주간·월간 다짐은 '연속 N주·N달'로 세요. 계산은 목표 시작일부터 시작하고, 아직 끝나지 않은 오늘(이번 주기)은 못 채웠어도 끊기지 않아요. '이하 유지' 다짐은 한도를 넘는 순간 끊겨요."
),
HelpTopic(
symbol: "checkmark.seal.fill",
title: "목표 종료와 판정",
body: "종료일이 있는 목표는 날짜가 지나면 자동으로 달성 여부가 판정되고(앱을 며칠 뒤에 열어도 종료일까지의 기록 기준이라 결과가 달라지지 않아요), 종료일이 없는 목표는 수동 종료 버튼으로 마칠 수 있어요. 판정은 다짐들의 평균 달성률이 목표를 만들 때 정한 '달성 판정 기준'(기본 100%) 이상이면 달성이에요 — 예를 들어 기준을 80%로 두면 조금 못 채워도 달성으로 기록돼요. 다짐 없이 종료일이 지난 목표는 '달성했나요?' 상태가 되어 직접 선택해요. 완료된 목표의 종료일을 수정하면 다시 판정돼요 — 미래로 옮기면 진행 중으로 돌아와요. 완료된 목표는 목록 하단의 완료 보관함에서 볼 수 있어요."
),
HelpTopic(
symbol: "pin.fill",
title: "모음 탭에 목표 카드 띄우기",
body: "설정 → '모음 탭 목표 진행 현황'에서 원하는 목표를 선택하면 모음 탭 상단에 진행 현황 카드가 떠요. 여러 개를 선택하면 옆으로 쓸어 넘길 수 있어요."
),
])
}
// MARK: ·
private var history: HelpGroup {
HelpGroup(title: "기록·통계 탭", topics: [
HelpTopic(
symbol: "calendar",
title: "기록 보기·고치기",
body: "기록 탭은 하루의 모든 기록을 보여줘요. 상단 화살표로 날짜를 이동하고, 기록을 탭하면 바로 수정할 수 있어요. 타임테이블 보기로 전환하면 하루 또는 일주일을 24시간 축 위에서 한눈에 볼 수 있어요.",
imageName: "help-history"
),
HelpTopic(
symbol: "line.3.horizontal.decrease.circle",
title: "필터와 하루 기준",
body: "필터 버튼으로 보고 싶은 행동만 골라 볼 수 있어요. 설정의 '주 시작 요일'과 '하루 시작 시간'이 모든 집계에 적용돼요. 예를 들어 하루 시작을 06:00으로 두면 새벽 기록은 전날 실적으로 계산돼요."
),
HelpTopic(
symbol: "square.and.arrow.up",
title: "이미지로 내보내기",
body: "기록·통계 탭 오른쪽 위 내보내기 버튼으로 지금 보고 있는 기간의 리포트를 고해상도 이미지로 만들 수 있어요. 라이트·다크 테마를 골라 공유하거나 사진에 저장해요."
),
HelpTopic(
symbol: "tablecells",
title: "CSV로 백업하기",
body: "설정 → 데이터 → '데이터 내보내기'에서 모든 기록(행동·시간·횟수·목표·다짐)을 CSV 파일로 만들 수 있어요. 스프레드시트에서 열어 분석하거나 백업으로 보관해 두세요. 무료에서도 사용할 수 있어요."
),
])
}
// MARK:
private var sync: HelpGroup {
HelpGroup(title: "기기 간 동기화 (프리미엄)", topics: [
HelpTopic(
symbol: "icloud.fill",
title: "동기화 켜기",
body: "설정 → 프리미엄에서 '기기 간 동기화'를 켜면 iCloud로 아이폰·아이패드의 데이터가 하나로 합쳐져요. 켠 뒤에는 앱을 완전히 종료했다가 다시 실행해야 적용돼요. 모든 기기가 같은 Apple 계정으로 로그인되어 있어야 해요."
),
HelpTopic(
symbol: "arrow.triangle.2.circlepath",
title: "반영이 늦을 때",
body: "iCloud 동기화는 네트워크 상황에 따라 몇 초에서 몇 분까지 걸릴 수 있어요. 다른 기기의 기록이 안 보이면 모음 탭 왼쪽 위 새로고침 버튼을 눌러 주세요. 그래도 안 보이면 잠시 후 다시 시도하거나 두 기기 모두 인터넷 연결을 확인해 주세요."
),
])
}
// MARK: iPad
private var diary: HelpGroup {
HelpGroup(title: "일기 (아이패드 · 프리미엄)", topics: [
HelpTopic(
symbol: "book.closed.fill",
title: "하루 정리 첫 페이지",
body: "일기 탭 달력에서 날짜를 누르면 그날의 일기가 열려요. 첫 페이지는 오늘 기분·요약·목표 진행 현황·할 일·24시간 타임테이블·기록으로 하루를 정리해 보여줘요. 오른쪽 위 ⋯ 메뉴의 '첫 화면 구성'에서 섹션 표시 여부와 순서를 바꿀 수 있어요. 기분 사진을 남긴 날은 달력의 그 날짜 칸에 사진이 배경으로 함께 보여요.",
imageName: "help-diary"
),
HelpTopic(
symbol: "calendar.badge.plus",
title: "타임테이블에 일정·필터",
body: "첫 페이지 타임테이블 카드 오른쪽 위 캘린더 버튼으로 그날의 캘린더 일정을 골라 함께 표시할 수 있어요(일정은 점선 테두리로 구분돼요). 필터 버튼을 누르면 그날 기록된 행동 중 타임테이블에 보여줄 것만 고를 수 있고, '이 날의 목표' 카드에도 필터 버튼이 있어 보고 싶은 목표만 골라 둘 수 있어요. 선택은 모두 날짜마다 따로 저장되고, 타임테이블 선택은 일기를 내보낼 때도 그대로 반영돼요."
),
HelpTopic(
symbol: "applepencil",
title: "펜슬 노트 페이지",
body: "페이지를 넘기면 자유 노트가 이어져요. 애플 펜슬로 쓰고 그리고, '사진'·'도형'·'텍스트'(키보드로 쓰는 글 상자)를 추가한 뒤 '배치 모드'에서 드래그·핀치로 옮기고 크기를 바꿔요. 두 손가락 핀치로 페이지를 확대해 세밀하게 쓸 수 있고, 줄 노트를 켜면 줄 간격도 고를 수 있어요. 페이지가 여러 장이면 오른쪽 위 ⋯ 메뉴의 '페이지 순서 변경'으로 순서를 바꿀 수 있어요."
),
HelpTopic(
symbol: "doc.text.image",
title: "나만의 양식(속지)",
body: "달력 화면 오른쪽 위 양식 버튼에서 PDF나 사진을 노트 배경 양식으로 가져올 수 있어요. 가져온 양식은 페이지를 추가할 때 빈 캔버스·줄 노트와 함께 고를 수 있고, 여러 쪽 PDF는 원하는 쪽을 골라 써요. 양식은 필기 아래에 깔리고 확대해도 선명하게 보여요. 양식을 삭제하면 그 양식을 쓰던 페이지는 빈 캔버스로 표시되지만 필기는 그대로 남아요."
),
HelpTopic(
symbol: "square.and.arrow.up.on.square",
title: "일기 내보내기",
body: "달력 화면 오른쪽 위 내보내기 버튼에서 기간(며칠부터 며칠까지)이나 여러 날짜를 골라 PDF 또는 이미지로 저장해요. 요약 페이지와 노트 페이지가 그대로 담겨요."
),
])
}
// MARK: iPhone
private var iphoneUI: HelpGroup {
HelpGroup(title: "화면 구성 (아이폰)", topics: [
HelpTopic(
symbol: "squares.leading.rectangle",
title: "탭바 구성과 더보기",
body: "설정 → '탭바 구성'에서 하단 탭바에 바로 보일 탭(최대 3개)을 고를 수 있어요. 나머지 탭은 '더보기'에서 열어요."
),
HelpTopic(
symbol: "circle.hexagongrid.fill",
title: "글래스 버블 메뉴",
body: "설정 → '내비게이션 방식'에서 '글래스 버블 메뉴'를 고르면 하단 탭바 대신 화면 아래 중앙 버튼 하나로 모든 탭을 열어요. 버튼을 누르면 유리 구슬 버튼들이 부채꼴로 퍼지고, 버블 순서도 설정에서 바꿀 수 있어요. '두 번 눌러 바로 이동'을 켜면 메뉴가 닫혀 있을 때 버튼을 빠르게 두 번 눌러 정해 둔 탭으로 바로 이동해요.",
imageName: "help-radial"
),
HelpTopic(
symbol: "square.grid.2x2.fill",
title: "홈 화면·잠금화면 위젯 (프리미엄)",
body: "홈 화면을 길게 눌러 '하루 다님' 위젯을 추가하세요. 행동 실행(눌러서 시작·+1), 현재 진행 중(측정 중인 행동의 실시간 타이머와 종료 버튼), 목표 진행률, 다짐 진행률(원형 링·누적값), 다짐 현황, 행동 통계 그래프와 잠금화면용 목표 달성률이 있어요. 위젯을 길게 눌러 '위젯 편집'에서 표시할 행동·목표·다짐과 기간, 테마를 고를 수 있어요."
),
HelpTopic(
symbol: "bolt.horizontal.circle",
title: "다이나믹 아일랜드·잠금화면",
body: "시간을 측정 중이면 다이나믹 아일랜드와 잠금화면에 진행 시간이 표시돼요. 여러 개를 동시에 측정하면 설정의 '대표 시간 기준'(먼저/나중에 시작한 행동)에 따라 하나가 대표로 보이고 나머지는 +N으로 표시돼요."
),
HelpTopic(
symbol: "switch.2",
title: "제어 센터에서 실행 (프리미엄)",
body: "제어 센터를 편집해 '하루 다님'의 '행동 실행' 컨트롤을 추가하면, 화면을 켜자마자 행동을 실행할 수 있어요. 시간형은 시작/종료 토글, 횟수형은 탭마다 +1이에요. 잠금화면 하단 버튼이나 액션 버튼에도 배치할 수 있어요."
),
])
}
// MARK: iPhone
private var watch: HelpGroup {
HelpGroup(title: "애플워치 (프리미엄)", topics: [
HelpTopic(
symbol: "applewatch",
title: "워치에서 기록하기",
body: "워치 앱을 열면 꼬리표 목록이 보여요. 꼬리표를 탭하면 그 안의 행동들이 나오고, 행동을 탭하면 시간형은 측정 시작·종료, 횟수형은 +1이 기록돼요. 아이폰 앱에서 즐겨찾기한 행동은 첫 화면 맨 위 '즐겨찾기'에서 한 탭 만에 열 수 있어요. 측정 중일 때는 첫 화면 맨 위에 측정 중인 행동과 시간이 보이고, 그 줄을 탭하면 바로 측정이 종료돼요. 기록은 아이폰과 자동으로 동기화돼요.",
imageName: "help-watch"
),
HelpTopic(
symbol: "watchface.applewatch.case",
title: "컴플리케이션 추가",
body: "워치 페이스를 길게 눌러 '편집' → 컴플리케이션 자리에서 하루 다님을 골라요. 현재 측정 중인 행동, 목표의 달성률, 다짐의 진행률을 페이스에서 바로 볼 수 있어요. 목표·다짐 달성률 목록에는 목표를 만들거나 수정할 때 '애플워치에서 보기'를 켠 목표와 그 다짐들만 하루·주간·월간으로 나타나요 — 기본은 꺼져 있고, 완료된 목표는 목록에서 자동으로 사라져요."
),
HelpTopic(
symbol: "arrow.triangle.2.circlepath",
title: "워치와 폰이 안 맞을 때",
body: "워치와 아이폰은 근처에 있을 때 자동으로 맞춰져요. 값이 다르게 보이면 워치 앱을 아래로 당겨 새로고침하거나, 아이폰에서 앱을 한 번 열어 주세요. 모음 탭의 새로고침 버튼도 도움이 돼요."
),
])
}
// MARK:
private var premiumHelp: HelpGroup {
HelpGroup(title: "프리미엄", topics: [
HelpTopic(
symbol: "crown.fill",
title: "무료와 프리미엄의 차이",
body: "무료로는 행동 10개·목표 2개·목표당 다짐 3개까지 만들 수 있어요. 프리미엄은 개수 제한이 풀리고 위젯, 애플워치 앱, 기기 간 동기화, 아이패드 일기를 쓸 수 있어요. 월·년 구독 또는 한 번만 결제하는 평생 이용권 중에 고르면 돼요. 구독이 끝나도 기록한 데이터는 그대로 남고, 이미 쓴 일기는 계속 열람할 수 있어요."
),
HelpTopic(
symbol: "mic.fill",
title: "시리·단축어로 기록하기",
body: "단축어 앱에서 '하루 다님'을 검색하면 측정 시작·종료, 횟수 추가, 행동 누적값 가져오기, 목표·다짐 진행률 가져오기 동작을 조합해 나만의 자동화를 만들 수 있어요. \"시리야, 하루 다님에서 측정 시작\"처럼 말로도 실행할 수 있고, 어떤 행동인지 물으면 이름으로 대답하면 돼요. 진행률 동작은 값을 돌려주므로 다른 단축어와 이어 붙일 수 있어요."
),
HelpTopic(
symbol: "arrow.counterclockwise.circle",
title: "구매 복원과 구독 관리",
body: "기기를 바꿨거나 앱을 다시 설치했다면 설정 → 프리미엄의 '구매 복원'을 눌러 주세요. 구독 해지나 플랜 변경은 '구독 관리'에서 언제든 할 수 있고, 해지해도 결제한 기간이 끝날 때까지는 계속 쓸 수 있어요."
),
])
}
}