feat(premium): privacy policy + terms links on the paywall (review guideline 3.1.2)

배포 잔여 ①-(1) 처리 — 자동 갱신 구독 심사 필수 요건:

- Docs/PRIVACY.md 신설: 개인정보처리방침 ko/en/ja 3개 국어.
  핵심 내용 — 개인정보 수집 없음(서버·계정·광고·분석 SDK 없음),
  모든 데이터는 기기 + 사용자 본인의 iCloud 비공개 DB에만 저장
  (개발자 접근 불가), 결제는 App Store 처리, 권한(캘린더·사진·
  알림) 용도 명시, 데이터 삭제 방법, 문의처 songyc.eng@gmail.com.
  → github.com/notalentprogrammer/HaruDanim 저장소 main 브랜치에
  PRIVACY.md로 업로드하면 앱에 박힌 링크가 활성화된다.
- 결제 화면(PremiumView)에 '약관과 정책' 섹션 추가:
  개인정보처리방침(위 GitHub URL) + 이용약관(Apple 표준 EULA —
  커스텀 EULA 미제공 시 자동 적용되는 표준 계약으로 갈음, 3.1.2 허용).
  외부 링크 화살표 표시, 신규 문구 4종 ko/en/ja 번역.
- CLAUDE.md §1 배포 잔여 갱신 (남은 코드 측 작업은
  ITSAppUsesNonExemptEncryption 1건, ASC 등록 시 앱 설명에도
  두 링크 기재 + 앱 개인정보 보호 '데이터 수집 안 함' 선택 메모).

검증: Debug·Store 빌드 성공, iPad 시뮬레이터 결제 화면에서
섹션·링크·푸터 표시 확인. 카탈로그 missing 0 / stale 0.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013yKDMhuF39GVYy3FMcGHh7
This commit is contained in:
songyc macbook 2026-07-14 21:43:04 +09:00
parent fd4e198fe4
commit 09d0b86ebc
4 changed files with 264 additions and 1 deletions

View File

@ -16,7 +16,7 @@
| 번들 ID | `com.yechan.HaruDanim` / App Group `group.com.yechan.HaruDanim` / CloudKit `iCloud.com.yechan.HaruDanim` |
| 수익 모델 | 부분 유료화. 무료 한도(행동 10·목표 2·목표당 다짐 3) + 프리미엄 결제 시 해제 |
| 결제 상품 | `com.yechan.HaruDanim.premium.monthly`(월 5,000원) / `.yearly`(년 50,000원) / `.lifetime`(80,000원) — 임시 가격, App Store Connect 등록은 아직 안 됨 |
| 남은 배포 작업 | App Store Connect 상품 3종 등록(구독 그룹 + 비소모성, 유료 앱 계약), **CloudKit 프로덕션 스키마 배포**(대시보드 Deploy Schema to Production — DiaryTemplate 등 새 레코드 타입/필드는 개발 환경에만 자동 생성되므로 출시 전 필수), 실기기 검증(펜슬 필기감·캘린더 권한), App Store 배포. **코드 측 잔여 2건**: ① 결제 화면(PremiumView)에 개인정보처리방침·이용약관 링크(심사 3.1.2 필수 — URL 준비되면 추가), ② `IOS/Info.plist`(파일 있음)`ITSAppUsesNonExemptEncryption=NO` 추가 |
| 남은 배포 작업 | App Store Connect 상품 3종 등록(구독 그룹 + 비소모성, 유료 앱 계약), **CloudKit 프로덕션 스키마 배포**(대시보드 Deploy Schema to Production — DiaryTemplate 등 새 레코드 타입/필드는 개발 환경에만 자동 생성되므로 출시 전 필수), 실기기 검증(펜슬 필기감·캘린더 권한), App Store 배포. **코드 측 잔여 1건**: `IOS/Info.plist``ITSAppUsesNonExemptEncryption=NO` 추가(사용자 승인 대기). 결제 화면 약관 링크는 완료 — 개인정보처리방침 `Docs/PRIVACY.md`(ko/en/ja)를 `github.com/notalentprogrammer/HaruDanim` 저장소 main 브랜치에 **PRIVACY.md**로 업로드해야 링크가 살아남(이용약관은 Apple 표준 EULA URL). ASC 등록 시 앱 설명에도 두 링크 기재 + '앱 개인정보 보호'는 "데이터 수집 안 함" 선택 |
---

View File

@ -0,0 +1,162 @@
# 하루 다님 개인정보처리방침 / HaruDanim Privacy Policy
- 시행일 / Effective date / 施行日: 2026-07-14
- 문의 / Contact / お問い合わせ: **songyc.eng@gmail.com**
한국어 · [English](#english) · [日本語](#日本語)
---
## 한국어
**하루 다님**(이하 "앱")은 사용자의 개인정보를 소중하게 생각합니다. 이 문서는 앱이 어떤 정보를 다루는지, 그 정보가 어디에 저장되는지 설명합니다.
### 1. 수집하는 개인정보: 없음
앱은 **어떠한 개인정보도 수집하지 않습니다.** 개발자가 운영하는 서버가 없으며, 계정 가입도 없습니다.
사용자가 앱에 기록하는 모든 데이터 — 행동, 시간·횟수 기록, 목표와 다짐, 일기(필기·사진·할 일·양식), 설정 — 는 다음 위치에만 저장됩니다.
- **사용자의 기기 안** (앱 전용 저장 공간)
- 프리미엄의 "기기 간 동기화"를 켠 경우, **사용자 본인의 iCloud 비공개 데이터베이스**
iCloud 동기화는 Apple의 CloudKit 비공개 데이터베이스를 사용하며, 이 데이터는 사용자의 Apple 계정에 귀속됩니다. **개발자는 이 데이터에 접근할 수 없습니다.** iCloud에 저장된 데이터에는 Apple의 [개인정보처리방침](https://www.apple.com/kr/legal/privacy/)이 적용됩니다.
### 2. 결제 정보
프리미엄 구독·구매는 Apple **App Store**를 통해 처리됩니다. 개발자는 사용자의 결제 수단, 카드 번호 등 어떠한 결제 정보에도 접근하지 않습니다.
### 3. 기기 권한의 사용
앱은 아래 권한을 **사용자가 허용한 경우에만, 명시된 용도로만** 사용합니다. 권한으로 접근한 정보는 기기(및 사용자 본인의 iCloud) 밖으로 전송되지 않습니다.
| 권한 | 용도 |
|---|---|
| 캘린더 | 일기 타임테이블에 그날의 일정을 함께 표시 (표시 용도만, 저장·전송 없음) |
| 사진 | 일기의 기분 사진·배치 사진·배경 양식 가져오기 (기기/본인 iCloud에만 저장) |
| 알림 | 장시간 측정 알림 등 기기 내 로컬 알림 (푸시 서버 없음) |
### 4. 제3자 제공·광고·추적: 없음
앱은 광고 SDK, 분석(애널리틱스) SDK, 추적 도구를 일절 포함하지 않으며, 어떠한 데이터도 제3자에게 제공하지 않습니다.
### 5. 데이터의 삭제
- **기기 데이터**: 앱을 삭제하면 기기에 저장된 모든 데이터가 함께 삭제됩니다.
- **iCloud 데이터**: 기기의 설정 → [사용자 이름] → iCloud → 저장 공간 관리에서 "하루 다님" 데이터를 삭제할 수 있습니다.
### 6. 아동의 개인정보
앱은 개인정보를 수집하지 않으므로 아동의 개인정보 또한 수집하지 않습니다.
### 7. 방침의 변경
이 방침이 변경되는 경우 이 페이지를 통해 고지하며, 중요한 변경은 앱 업데이트 노트에도 안내합니다.
### 8. 문의
개인정보 관련 문의: **songyc.eng@gmail.com**
---
## English
**HaruDanim** ("the app") respects your privacy. This document explains what information the app handles and where it is stored.
### 1. Personal data we collect: none
The app **does not collect any personal data.** There is no developer-operated server and no account sign-up.
Everything you record in the app — actions, time/count records, goals and quests, diary content (handwriting, photos, to-dos, templates), and settings — is stored only in:
- **your device** (the app's private storage), and
- **your own iCloud private database**, if you enable the premium "sync between devices" option.
iCloud sync uses Apple's CloudKit private database, which belongs to your Apple account. **The developer cannot access this data.** Data stored in iCloud is covered by Apple's [Privacy Policy](https://www.apple.com/legal/privacy/).
### 2. Payments
Premium subscriptions and purchases are processed by the Apple **App Store**. The developer never has access to your payment method or card details.
### 3. Device permissions
The app uses the permissions below **only if you grant them, and only for the stated purpose.** Information accessed through these permissions never leaves your device (or your own iCloud).
| Permission | Purpose |
|---|---|
| Calendar | Showing that day's events on the diary timetable (display only; nothing is stored or transmitted) |
| 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) |
### 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.
### 5. Deleting your data
- **On-device data**: deleting the app removes all data stored on the device.
- **iCloud data**: you can delete the app's iCloud data in Settings → [your name] → iCloud → Manage Account Storage.
### 6. Children's privacy
Since the app collects no personal data, it collects no personal data from children either.
### 7. Changes to this policy
Changes will be announced on this page; significant changes will also be noted in app update notes.
### 8. Contact
Privacy inquiries: **songyc.eng@gmail.com**
---
## 日本語
**ハルダニムHaruDanim**(以下「本アプリ」)は、ユーザーのプライバシーを大切にします。本書は、本アプリが扱う情報と、その保存場所について説明します。
### 1. 収集する個人情報:なし
本アプリは**いかなる個人情報も収集しません。** 開発者が運営するサーバーはなく、アカウント登録もありません。
ユーザーが本アプリに記録するすべてのデータ — 行動、時間・回数の記録、目標とクエスト、日記手書き・写真・ToDo・テンプレート、設定 — は、次の場所にのみ保存されます。
- **ユーザーの端末内**(アプリ専用の保存領域)
- プレミアムの「デバイス間同期」を有効にした場合、**ユーザー本人のiCloudプライベートデータベース**
iCloud同期にはAppleのCloudKitプライベートデータベースを使用し、そのデータはユーザーのAppleアカウントに帰属します。**開発者はこのデータにアクセスできません。** iCloudに保存されるデータにはAppleの[プライバシーポリシー](https://www.apple.com/jp/legal/privacy/)が適用されます。
### 2. 決済情報
プレミアムのサブスクリプション・購入はApple **App Store**で処理されます。開発者はユーザーの決済手段やカード情報に一切アクセスしません。
### 3. 端末権限の使用
本アプリは、以下の権限を**ユーザーが許可した場合に限り、明示した用途のみに**使用します。権限を通じて取得した情報が端末およびユーザー本人のiCloudの外へ送信されることはありません。
| 権限 | 用途 |
|---|---|
| カレンダー | 日記のタイムテーブルにその日の予定を表示(表示のみ、保存・送信なし) |
| 写真 | 気分写真・日記の写真・背景テンプレートの読み込み端末本人のiCloudにのみ保存 |
| 通知 | 長時間計測リマインダーなどの端末内ローカル通知(プッシュサーバーなし) |
### 4. 第三者提供・広告・トラッキング:なし
本アプリは広告SDK、分析SDK、トラッキングツールを一切含まず、いかなるデータも第三者に提供しません。
### 5. データの削除
- **端末内データ**:アプリを削除すると、端末に保存されたすべてのデータが削除されます。
- **iCloudデータ**:設定 → [ユーザー名] → iCloud → アカウントのストレージを管理 から本アプリのデータを削除できます。
### 6. 子どもの個人情報
本アプリは個人情報を収集しないため、子どもの個人情報も収集しません。
### 7. 本ポリシーの変更
変更がある場合は本ページで告知し、重要な変更はアプリのアップデートノートでもお知らせします。
### 8. お問い合わせ
プライバシーに関するお問い合わせ:**songyc.eng@gmail.com**

View File

@ -1496,6 +1496,22 @@
}
}
},
"개인정보처리방침": {
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Privacy Policy"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "プライバシーポリシー"
}
}
}
},
"건강": {
"localizations": {
"en": {
@ -6462,6 +6478,22 @@
}
}
},
"약관과 정책": {
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Terms & Policies"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "規約とポリシー"
}
}
}
},
"양식": {
"localizations": {
"en": {
@ -7775,6 +7807,38 @@
}
}
},
"이용약관": {
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Terms of Use"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "利用規約"
}
}
}
},
"이용약관은 Apple 표준 사용권 계약(EULA)이 적용돼요.": {
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "The Terms of Use are Apple's standard licensed application end user license agreement (EULA)."
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "利用規約にはAppleの標準使用許諾契約EULAが適用されます。"
}
}
}
},
"이하 유지": {
"localizations": {
"en": {

View File

@ -376,6 +376,14 @@ struct RadialOrderView: View {
// MARK: -
/// 3.1.2:
/// · .
/// Apple EULA ( EULA ).
private enum LegalLinks {
static let privacyPolicy = URL(string: "https://github.com/notalentprogrammer/HaruDanim/blob/main/PRIVACY.md")!
static let termsOfUse = URL(string: "https://www.apple.com/legal/internet-services/itunes/dev/stdeula/")!
}
struct PremiumView: View {
private let premium = PremiumManager.shared
private let store = PremiumStore.shared
@ -420,6 +428,18 @@ struct PremiumView: View {
} else {
purchaseSection
}
Section {
Link(destination: LegalLinks.privacyPolicy) {
legalRow("hand.raised.fill", "개인정보처리방침")
}
Link(destination: LegalLinks.termsOfUse) {
legalRow("doc.text.fill", "이용약관")
}
} header: {
Text("약관과 정책")
} footer: {
Text("이용약관은 Apple 표준 사용권 계약(EULA)이 적용돼요.")
}
#if DEBUG
Section {
Toggle("프리미엄 상태 (테스트)", isOn: Binding(
@ -600,6 +620,23 @@ struct PremiumView: View {
}
}
/// · ( )
private func legalRow(_ symbol: String, _ title: LocalizedStringKey) -> some View {
HStack {
Label {
Text(title)
.foregroundStyle(.primary)
} icon: {
Image(systemName: symbol)
.foregroundStyle(AppTheme.green)
}
Spacer()
Image(systemName: "arrow.up.right")
.font(.caption)
.foregroundStyle(.tertiary)
}
}
// title·detail LocalizedStringKey String
// · ( )
private func featureRow(_ symbol: String, _ title: LocalizedStringKey, _ detail: LocalizedStringKey) -> some View {