새로고침의 쓰임새(iCloud 동기화 반영·위젯/워치 갱신)가 전부 프리미엄 기능이라 무료 사용자에겐 누를 이유가 없는 버튼 — 모음 탭 툴바에서 프리미엄일 때만 표시한다(실사용 피드백 2026-07-23). - 도움말 '새로고침 버튼' 항목이 모음 탭 그룹에 2개 중복돼 있던 것을 하나로 합치고, 프리미엄에서만 표시된다는 문구 추가 - 신규 문구 en/ja 완역, 구 문구 stale 2건 정리 (missing/stale 0) - CLAUDE.md §6.1 툴바 규칙 갱신 - 검증: Debug/Store 빌드, 무료(-premium NO) 버튼 숨김·프리미엄 표시 스크린샷 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
416 lines
28 KiB
Swift
416 lines
28 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: "star.fill",
|
|
title: "즐겨찾기 모아 보기",
|
|
body: "행동을 즐겨찾기로 지정하면 모음 탭 행동 목록이 '즐겨찾기'와 '나머지 행동' 두 부분으로 나뉘고, 즐겨찾기가 항상 맨 위에 와요. 새로 지정한 행동은 즐겨찾기 맨 뒤에 붙어요. 순서를 바꾸려면 '배치 편집'에서 버튼을 길게 눌러 끌어 옮기거나, 행동 탭 오른쪽 위 ⋯ 메뉴의 '즐겨찾기 순서 변경'을 쓰면 돼요 — 이 순서는 애플워치의 즐겨찾기 목록에도 똑같이 적용돼요. 배치 편집에서는 즐겨찾기와 나머지 사이로 끌어서 지정·해제할 수도 있어요. '나머지 행동' 제목을 누르면 그 아래를 접어 둘 수 있어서 행동이 많아져도 자주 쓰는 것만 남길 수 있어요(접힘은 기기마다 저장). 지정은 행동 버튼을 길게 눌러 '즐겨찾기'를 선택하거나, 행동 탭에서 행동을 열어 별 아이콘을 눌러도 돼요."
|
|
),
|
|
HelpTopic(
|
|
symbol: "arrow.clockwise",
|
|
title: "새로고침 버튼",
|
|
body: "모음 탭 왼쪽 위의 새로고침 버튼은 화면을 앱을 껐다 켠 것처럼 처음부터 다시 불러오고, 홈 화면 위젯과 애플워치도 함께 갱신해요. iCloud 동기화로 다른 기기에서 바꾼 내용이 아직 안 보이거나 위젯이 늦게 갱신되는 것 같을 때 눌러 보세요. iCloud 동기화·위젯이 프리미엄 기능이라 이 버튼은 프리미엄을 사용 중일 때만 표시돼요."
|
|
),
|
|
HelpTopic(
|
|
symbol: "hand.tap.fill",
|
|
title: "길게 누르기 메뉴",
|
|
body: "행동 버튼을 길게 누르면 기록 직접 입력·수정, 즐겨찾기 지정·해제, 기록 확인, 통계 보기, 행동 설정 수정, 삭제를 할 수 있어요. 시간형은 시작·종료 시각을, 횟수형은 횟수와 시각을 직접 고칠 수 있어요."
|
|
),
|
|
HelpTopic(
|
|
symbol: "note.text",
|
|
title: "기록에 메모 남기기",
|
|
body: "행동 탭에서 행동을 열어 '기록 시 메모 창 표시'를 켜면, 시간 측정을 종료할 때·횟수를 추가할 때마다 메모 창이 떠서 그 기록에 한 줄을 남길 수 있어요(건너뛰기 가능). 이 설정은 기기마다 따로 저장돼요. 남긴 메모는 기록 탭 목록에 노란 글씨로 표시되고, 기록을 탭해 수정할 때 메모를 고치거나 새로 붙일 수도 있어요."
|
|
),
|
|
HelpTopic(
|
|
symbol: "square.grid.3x3.fill",
|
|
title: "배치 편집",
|
|
body: "오른쪽 위 '배치 편집'을 누르면 버튼이 흔들리며 드래그로 순서를 바꿀 수 있어요. 한 줄에 몇 개를 놓을지도 고를 수 있어요. '완료'를 누르면 저장되고, 이 순서는 위젯의 기본 표시 순서에도 쓰여요."
|
|
),
|
|
])
|
|
}
|
|
|
|
// 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 파일로 만들 수 있어요. 스프레드시트에서 열어 분석하거나 백업으로 보관해 두세요. 무료에서도 사용할 수 있어요."
|
|
),
|
|
HelpTopic(
|
|
symbol: "arrow.up.arrow.down",
|
|
title: "이전 기간과 비교",
|
|
body: "통계 탭 맨 위의 비교 카드는 지금 보고 있는 하루·주·월의 총 시간과 횟수를 바로 앞 기간(어제·지난주·지난달)과 비교해 보여줘요. 필터를 걸면 필터된 행동들만으로 비교돼요."
|
|
),
|
|
])
|
|
}
|
|
|
|
// 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 또는 이미지로 저장해요. 요약 페이지와 노트 페이지가 그대로 담겨요."
|
|
),
|
|
HelpTopic(
|
|
symbol: "lock.fill",
|
|
title: "일기 잠금",
|
|
body: "설정 → 일기에서 '일기 잠금'을 켜면 일기 탭을 열 때 Face ID·Touch ID 또는 기기 암호로 잠금을 해제해야 해요. 기기가 지원하는 방식이 자동으로 쓰이고, 앱을 나갔다 돌아오면 다시 잠겨요. 이 설정은 이 기기에만 적용돼요."
|
|
),
|
|
])
|
|
}
|
|
|
|
// 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: "기기를 바꿨거나 앱을 다시 설치했다면 설정 → 프리미엄의 '구매 복원'을 눌러 주세요. 구독 해지나 플랜 변경은 '구독 관리'에서 언제든 할 수 있고, 해지해도 결제한 기간이 끝날 때까지는 계속 쓸 수 있어요."
|
|
),
|
|
])
|
|
}
|
|
}
|