chore(1.5-p5a): 버전 1.5(1)·스토어 텍스트·PRIVACY 건강 문단·촬영 준비

- MARKETING_VERSION 1.5 / 빌드 1
- whats-new-1.5(3언어)·promotional-text-1.5(이용자 6명 감사 스토리)·설명 3언어에
  건강 타일(무료 절)+건강 다짐·행동 컴플리케이션(프리미엄 절) 반영
- PRIVACY.md: 권한 표에 건강(HealthKit) 행 + 읽기 전용·서버/iCloud 미저장 문단(ko/en/ja — 5.1.3)
- frame_screenshots: 09-records→09-health 카피 교체, seedHealthQuest 목표 제목 현지화(+카탈로그 manual)
- 극한 검증: 실버전(1.5) 업그레이드 경로 팝업 자동 표시 확인, 벌크 1만건+건강 결합 렌더 정상

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WtZwRRjbtM9pZJDM4FkTq6
This commit is contained in:
songyc macbook 2026-08-22 06:34:27 +09:00
parent 9929e6631e
commit 1f7c4d4b82
10 changed files with 116 additions and 24 deletions

View File

@ -35,6 +35,9 @@ iCloud 동기화는 Apple의 CloudKit 비공개 데이터베이스를 사용하
| 캘린더 | 일기 타임테이블에 그날의 일정을 함께 표시 (표시 용도만, 저장·전송 없음) |
| 사진 | 일기의 기분 사진·배치 사진·배경 양식 가져오기 (기기/본인 iCloud에만 저장) |
| 알림 | 장시간 측정 알림 등 기기 내 로컬 알림 (푸시 서버 없음) |
| 건강(HealthKit) | 걸음·운동·수면 등 건강 데이터를 **읽기 전용**으로 가져와 앱 안에서 보여주고 다짐 달성 계산에 사용 |
건강 데이터는 특히 엄격하게 다룹니다: 앱은 건강 데이터를 **읽기만 하며**(쓰기 없음), 읽어 온 값을 **서버로 전송하지 않고 iCloud에도 저장하지 않습니다**. 값은 표시·계산을 위해 사용자의 기기 안에만 잠시 보관되며, 건강 데이터를 광고·마케팅 등 다른 목적에 사용하지 않습니다.
### 4. 제3자 제공·광고·추적: 없음
@ -88,6 +91,8 @@ The app uses the permissions below **only if you grant them, and only for the st
| Photos | Importing mood photos, diary photos, and background templates (stored only on your device / your iCloud) |
| Notifications | Local, on-device notifications such as the long-session reminder (no push server) |
**Health data (HealthKit).** The app reads health data such as steps, workouts and sleep **read-only**, and only if you grant access — to display it in the app and to calculate quest achievement. Values read from HealthKit are **never sent to any server and never stored in iCloud**; they are kept only on your device for display and calculation, and are never used for advertising or any other purpose.
### 4. Third parties, ads, tracking: none
The app contains no advertising SDKs, no analytics SDKs, and no tracking tools, and shares no data with third parties.
@ -140,6 +145,8 @@ iCloud同期にはAppleのCloudKitプライベートデータベースを使用
| 写真 | 気分写真・日記の写真・背景テンプレートの読み込み端末本人のiCloudにのみ保存 |
| 通知 | 長時間計測リマインダーなどの端末内ローカル通知(プッシュサーバーなし) |
**ヘルスデータHealthKit。** アプリは歩数・運動・睡眠などのヘルスデータを、ユーザーが許可した場合にのみ**読み取り専用**で取得し、アプリ内での表示とクエスト達成の計算に使用します。HealthKitから読み取った値を**サーバーへ送信することも、iCloudに保存することもありません**。値は表示・計算のために端末内にのみ保持され、広告などほかの目的には一切使用しません。
### 4. 第三者提供・広告・トラッキング:なし
本アプリは広告SDK、分析SDK、トラッキングツールを一切含まず、いかなるデータも第三者に提供しません。

View File

@ -601,7 +601,7 @@
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_ENTITLEMENTS = IOS/Haru_Danim.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 3;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 5GNS4Z2SYT;
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = YES;
@ -620,7 +620,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.4;
MARKETING_VERSION = 1.5;
PRODUCT_BUNDLE_IDENTIFIER = com.yechan.HaruDanim;
PRODUCT_NAME = "$(TARGET_NAME)";
STRING_CATALOG_GENERATE_SYMBOLS = YES;
@ -643,7 +643,7 @@
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_ENTITLEMENTS = IOS/Haru_Danim.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 3;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 5GNS4Z2SYT;
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = YES;
@ -662,7 +662,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.4;
MARKETING_VERSION = 1.5;
PRODUCT_BUNDLE_IDENTIFIER = com.yechan.HaruDanim;
PRODUCT_NAME = "$(TARGET_NAME)";
STRING_CATALOG_GENERATE_SYMBOLS = YES;
@ -686,7 +686,7 @@
CODE_SIGN_ENTITLEMENTS = "Haru_DanimWatch Watch App/Haru_DanimWatch Watch App.entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 3;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 5GNS4Z2SYT;
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = YES;
@ -697,7 +697,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.4;
MARKETING_VERSION = 1.5;
PRODUCT_BUNDLE_IDENTIFIER = com.yechan.HaruDanim.watchkitapp;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
@ -722,7 +722,7 @@
CODE_SIGN_ENTITLEMENTS = "Haru_DanimWatch Watch App/Haru_DanimWatch Watch App.entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 3;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 5GNS4Z2SYT;
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = YES;
@ -733,7 +733,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.4;
MARKETING_VERSION = 1.5;
PRODUCT_BUNDLE_IDENTIFIER = com.yechan.HaruDanim.watchkitapp;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
@ -758,7 +758,7 @@
CODE_SIGN_ENTITLEMENTS = Haru_DanimWatchWidgets/Haru_DanimWatchWidgetsExtension.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 3;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 5GNS4Z2SYT;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = Haru_DanimWatchWidgets/Info.plist;
@ -770,7 +770,7 @@
"@executable_path/../../Frameworks",
"@executable_path/../../../../Frameworks",
);
MARKETING_VERSION = 1.4;
MARKETING_VERSION = 1.5;
PRODUCT_BUNDLE_IDENTIFIER = "com.yechan.HaruDanim.watchkitapp.Haru-DanimWatchWidgets";
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
@ -794,7 +794,7 @@
CODE_SIGN_ENTITLEMENTS = Haru_DanimWatchWidgets/Haru_DanimWatchWidgetsExtension.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 3;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 5GNS4Z2SYT;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = Haru_DanimWatchWidgets/Info.plist;
@ -806,7 +806,7 @@
"@executable_path/../../Frameworks",
"@executable_path/../../../../Frameworks",
);
MARKETING_VERSION = 1.4;
MARKETING_VERSION = 1.5;
PRODUCT_BUNDLE_IDENTIFIER = "com.yechan.HaruDanim.watchkitapp.Haru-DanimWatchWidgets";
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
@ -827,7 +827,7 @@
buildSettings = {
CODE_SIGN_ENTITLEMENTS = Widgets/Haru_DanimWidgets.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 3;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 5GNS4Z2SYT;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = Widgets/Info.plist;
@ -838,7 +838,7 @@
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 1.4;
MARKETING_VERSION = 1.5;
PRODUCT_BUNDLE_IDENTIFIER = com.yechan.HaruDanim.Widgets;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
@ -853,7 +853,7 @@
buildSettings = {
CODE_SIGN_ENTITLEMENTS = Widgets/Haru_DanimWidgets.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 3;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 5GNS4Z2SYT;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = Widgets/Info.plist;
@ -864,7 +864,7 @@
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 1.4;
MARKETING_VERSION = 1.5;
PRODUCT_BUNDLE_IDENTIFIER = com.yechan.HaruDanim.Widgets;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;

View File

@ -668,10 +668,11 @@ enum DebugSeed {
/// `-seedHealthQuest YES`: 1 (1.5 ··· 4).
/// `-seedHealthCache YES` · .
/// ( ), ()
/// ( ), ()
static func seedHealthQuestIfRequested(context: ModelContext) {
guard UserDefaults.standard.bool(forKey: "seedHealthQuest") else { return }
let title = "건강 습관 만들기"
// (-seedDemo )
let title = String(localized: "건강 습관 만들기")
let existing = (try? context.fetch(FetchDescriptor<Goal>())) ?? []
guard !existing.contains(where: { $0.title == title }) else { return }
let goal = Goal(title: title, symbolName: "heart.fill", colorHex: "#E0558C",

View File

@ -2500,6 +2500,23 @@
}
}
},
"건강 습관 만들기": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Healthy Habits"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "健康習慣づくり"
}
}
}
},
"건강 앱에 기록된 운동 중 선택한 종목의 시간을 세요. '운동 시간' 지표(활동 링 기준)와는 값이 다를 수 있어요. 값은 기기 밖으로 나가지 않아요.": {
"localizations": {
"en": {

View File

@ -20,16 +20,18 @@ A habit and time tracker: log time and counts with a single tap, and shape your
• Export exactly what you see as a high-resolution image report
• Back up all data to CSV files (free plan included) — Premium adds CSV import to restore records
• Clear out long-accumulated records with Data Cleanup & Reset — with a CSV backup and a keepsake summary report before anything is deleted
• See today's Apple Health data (steps, exercise, sleep and more) as tiles on the Home tab — values never leave your device
■ Go further with Premium
• Unlimited actions, goals and quests
• Home Screen & Lock Screen widgets — run and stop right from the widget, progress rings and charts
• Launch from Control Center and the Action button
• Apple Watch app and complications — track and check from your wrist
• Apple Watch app and complications — track from your wrist, with an Action Log complication showing totals on your watch face
• Siri Shortcuts — "Hey Siri, start tracking Reading in Haru Danim"
• iCloud sync across iPhone, iPad and Mac
• Diary on iPad and Mac — a daily summary page plus free-form Apple Pencil notes (mouse and keyboard on Mac), with your own PDF page templates
• CSV import — bring actions and records back from your exported CSVs
• Health quests — goals from Apple Health data like steps, sleep and workout types ("8,000 steps a day," "8 hours of sleep")
■ Privacy
This app collects no personal data. Everything stays on your device and (if you turn on sync) in your own iCloud.

View File

@ -20,16 +20,18 @@ Haru Danim — あなたの一日に立ち寄る
• 見ている画面そのままを高解像度の画像レポートとして書き出し
• すべてのデータをCSVファイルにバックアップできます無料プランでも利用可— プレミアムならCSV読み込みで記録の復元も
• たまった記録は「データ整理・リセット」で整理 — 削除前にCSVバックアップと、これまでの記録をまとめた「整理レポート」を残せます
• ホームタブでAppleヘルスケアの今日のデータ歩数・運動・睡眠などをタイルで — 値が端末の外に出ることはありません
■ プレミアムでさらに広く
• アクション・目標・クエストの数が無制限
• ホーム画面・ロック画面ウィジェット — ウィジェットから直接実行・終了、達成率リングとグラフ
• コントロールセンター・アクションボタンから即実行
• Apple Watchアプリとコンプリケーション — 手首で記録・確認
• Apple Watchアプリとコンプリケーション — 手首で記録し、「アクションの記録」でフェイスに累計まで
• Siriショートカット — 「Hey Siri、Haru Danimで読書の計測を開始」
• iCloudでiPhone・iPad・Macのデータを同期
• iPad・Macの日記 — 一日のまとめページとApple Pencilの自由ートMacではマウス・キーボード、自分のPDF用紙テンプレート
• CSV読み込み — 書き出したCSVからアクションと記録を復元
• ヘルスクエスト — 歩数・睡眠・運動種目などAppleヘルスケアのデータを目標に「毎日8,000歩」「睡眠8時間」
■ プライバシー
このアプリは個人情報を収集しません。すべてのデータは端末と同期をオンにした場合ご自身のiCloudにのみ保存されます。

View File

@ -20,16 +20,18 @@
• 지금 보고 있는 화면 그대로 고해상도 이미지 리포트로 내보내기
• 모든 데이터를 CSV 파일로 백업할 수 있어요(무료에서도 가능) — 프리미엄이라면 가져오기로 복원까지 돼요
• 오래 쌓인 기록은 '데이터 정리·초기화'로 비울 수 있어요 — 지우기 전에 백업과, 그동안의 기록을 한눈에 담은 '정리 리포트'를 만들어 간직하세요
• 모음 탭에서 애플 건강의 오늘 데이터(걸음·운동·수면 등)를 타일로 볼 수 있어요 — 값은 기기 밖으로 나가지 않아요
■ 프리미엄으로 한 걸음 더
• 행동·목표·다짐 개수 무제한
• 홈·잠금화면 위젯 — 위젯에서 바로 실행·종료, 진행률 링과 그래프
• 제어 센터·액션 버튼에서 바로 실행
• 애플워치 앱과 컴플리케이션 — 손목에서 기록하고 확인
• 애플워치 앱과 컴플리케이션 — 손목에서 기록하고, '행동 기록' 컴플리케이션으로 페이스에서 누적까지
• 시리 단축어 — "시리야, 하루 다님에서 독서 측정 시작"
• iCloud로 아이폰·아이패드·맥 데이터 동기화
• 아이패드·맥 일기 — 하루 정리 요약과 애플 펜슬 자유 노트(맥은 마우스·키보드), 나만의 PDF 양식(속지)
• CSV 가져오기 — 내보냈던 CSV에서 행동과 기록을 다시 불러와 복원
• 건강 다짐 — 걸음·수면·운동 종목 같은 애플 건강 데이터를 목표로 ('매일 8,000보', '수면 8시간')
■ 개인정보
이 앱은 개인정보를 수집하지 않습니다. 모든 데이터는 사용자의 기기와 (동기화를 켠 경우) 사용자 본인의 iCloud에만 저장됩니다.

View File

@ -0,0 +1,12 @@
# 프로모션 텍스트 — 1.5 전용 (로케일별 170자 이내, 심사 없이 수시 수정 가능)
# ASC → 앱 → 해당 로케일 → '프로모션 텍스트' 란에 복사해 붙여넣기.
# 2026-08-22 기준 이용자 6명(개발자 본인 포함) — 1.4의 "세 명" 감사 멘트 잇는 스토리.
[ko] (165자)
하루 다님을 쓰는 사람이 여섯 명이 됐어요. 한국·미국·영국·일본, 어디에 계신지 모를 다섯 분께 감사드려요. 1.5에서는 애플 건강과 이어졌어요 — 모음 탭 건강 타일, 걸음·수면·운동 종목 다짐, 그리고 워치 페이스의 '행동 기록' 컴플리케이션까지.
[en] (168자)
Six of us use Haru Danim now — thank you, wherever you five are. 1.5 connects with Apple Health: tiles on Home, quests from steps, sleep and workouts, plus a watch-face Action Log.
[ja] (139자)
Haru Danimを使う人が6人になりました。世界のどこかにいる5人の皆さん、ありがとうございます。1.5ではAppleヘルスケアとつながりました — ホームのヘルスタイル、歩数・睡眠・運動種目のクエスト、そしてウォッチフェイスの「アクションの記録」。

View File

@ -0,0 +1,49 @@
# 버전 1.5 '새로운 기능' (로케일별)
[ko]
이번 업데이트는 애플 건강, 그리고 애플워치와 더 가까워졌어요.
● 애플 건강과 연결
• 모음 탭에서 걸음·운동·수면 같은 오늘의 건강 데이터를 타일로 볼 수 있어요 — 값은 기기 밖으로 나가지 않아요
• 건강 데이터로 다짐을 만들 수 있어요(프리미엄) — '매일 8,000보', '수면 8시간', '달리기 30분'처럼요. 운동은 종목별로도 돼요
• 수면은 '수면 구간'을 정해 두면 자정을 넘겨 자도 하루가 쪼개지지 않아요
● 애플워치 '행동 기록' 컴플리케이션
• 행동의 누적 기록(하루·이번 주·이번 달·지난 7일·지난 30일)을 워치 페이스에서 바로 봐요
• 측정 중엔 노란 타이머로 바뀌고, 누르면 워치 앱에서 바로 시작·종료할 수 있어요
● 그리고
• 도움말 전체 문구를 더 자연스럽게 다듬고 새 기능 사용법을 더했어요
• 여러 기기를 쓰신다면 모든 기기에서 함께 업데이트해 주세요
[en]
This update brings Haru Danim closer to Apple Health — and your Apple Watch.
● Apple Health, connected
• See today's health data — steps, exercise, sleep — as tiles on the Home tab. Values never leave your device
• Build quests from health data (Premium): "8,000 steps a day," "8 hours of sleep," "30 minutes of running" — workouts by type, too
• Set a sleep window and sleeping past midnight won't split your night
● Action Log complication for Apple Watch
• See an action's running total (day, this week, this month, last 7/30 days) right on your watch face
• While tracking it turns into a yellow timer — tap to start or stop from the watch app
● And more
• The entire in-app guide has been rewritten to read more naturally, with how-tos for the new features
• Using several devices? Please update Haru Danim on all of them
[ja]
今回のアップデートで、Appleヘルスケア、そしてApple Watchともっと近くなりました。
● Appleヘルスケアと連携
• ホームタブで歩数・運動・睡眠など今日のヘルスデータをタイルで見られます — 値が端末の外に出ることはありません
• ヘルスデータでクエストを作れますプレミアム—「毎日8,000歩」「睡眠8時間」「ランニング30分」など。運動は種目別でもOK
• 「睡眠時間帯」を決めておけば、日付をまたいで眠っても1日が分割されません
● Apple Watch「アクションの記録」コンプリケーション
• アクションの累計1日・今週・今月・過去7日・過去30日をウォッチフェイスで直接確認
• 計測中は黄色いタイマーに変わり、タップするとウォッチアプリからすぐ開始・終了できます
● そのほか
• アプリ内ヘルプの文章全体をより自然に磨き直し、新機能の使い方も加えました
• 複数の端末をお使いなら、すべての端末で一緒にアップデートしてください

View File

@ -35,6 +35,9 @@ let iphoneCopies: [String: Copy] = [
"02-goals": Copy(
headline: ["ko": "목표와 다짐으로 꾸준하게", "en": "Goals and quests keep you going", "ja": "目標とクエストで続けられる"],
subline: ["ko": "하루·주간·월간 진행률과 연속 달성", "en": "Daily, weekly, monthly progress and streaks", "ja": "日・週・月の達成率と継続日数"]),
"09-health": Copy(
headline: ["ko": "애플 건강과 이어지는 다짐", "en": "Quests powered by Apple Health", "ja": "Appleヘルスケアとつながるクエスト"],
subline: ["ko": "걸음·수면·운동 종목까지 하루 목표로", "en": "Steps, sleep — even workout types as daily goals", "ja": "歩数・睡眠・運動種目まで1日の目標に"]),
"03-timetable": Copy(
headline: ["ko": "하루가 한눈에 보여요", "en": "Your day at a glance", "ja": "一日がひと目でわかる"],
subline: ["ko": "기록이 24시간 타임테이블 위에 그려져요", "en": "Records drawn on a 24-hour timetable", "ja": "記録が24時間のタイムテーブルに描かれる"]),
@ -50,9 +53,6 @@ let iphoneCopies: [String: Copy] = [
"08-dark": Copy(
headline: ["ko": "밤에는 다크 모드로 편안하게", "en": "Easy on the eyes in Dark Mode", "ja": "夜はダークモードで心地よく"],
subline: ["ko": "라이트·다크·시스템 설정 따름 중 선택", "en": "Light, dark, or match the system", "ja": "ライト・ダーク・システム連動から選択"]),
"09-records": Copy(
headline: ["ko": "기록은 남기고, 바로 고치고", "en": "Every record, easy to fix", "ja": "記録は残して、すぐ直せる"],
subline: ["ko": "메모와 함께 쌓이는 하루의 기록 — 탭해서 수정", "en": "Notes attached — tap any record to edit", "ja": "メモと一緒に積み重なる記録 — タップで修正"]),
"10-week": Copy(
headline: ["ko": "일주일의 흐름이 한눈에", "en": "Your week at a glance", "ja": "一週間の流れをひと目で"],
subline: ["ko": "24시간 축 위에 그려지는 주간 타임테이블", "en": "Seven days drawn on a 24-hour timetable", "ja": "24時間軸に描かれる週間タイムテーブル"]),