docs(store): self-serve submission guide + privacy policy + Play 512 icon

Rewrote the Phase 7 guide to reflect completed Play setup (app, AAB,
payments profile, remove_ads) and lay out remaining ordered steps for
both stores with copy/answers inline. Added a hostable bilingual
privacy policy page and a 512x512 Play store icon.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-14 19:49:41 +09:00
parent c7c558cb96
commit 30572e3912
3 changed files with 242 additions and 85 deletions
+137 -85
View File
@@ -1,110 +1,162 @@
# Phase 7 — 릴리스 & 스토어 제출 가이드 (오너용)
# Phase 7 — 스토어 제출 가이드 (오너 셀프 진행용)
코드/빌드 쪽(서명, 프라이버시 매니페스트, app-ads.txt 내용, 스토어 카피)은 준비돼
있습니다. 이 문서는 **오너가 콘솔/웹에서 할 일**과 **제출 순서**입니다. 헷갈리면
Claude에게 화면 보여주면서 같이 하면 됩니다.
> 이 문서 하나만 위에서부터 따라가면 **Google Play + Apple App Store 제출**까지 끝납니다.
> 코드/빌드/카피/개인정보처리방침은 모두 준비돼 있습니다. 여기 적힌 답변·문구를 **그대로 복붙**하세요.
> 막히면 Claude에게 "이 단계 막혔어" 하고 화면 보여주면 됩니다.
마지막 업데이트: 2026-06-14
---
## 0. 먼저 — 안드로이드 서명 키 백업 (가장 중요)
## ✅ 지금까지 완료된 것
**Google Play**
- 앱 생성: **Block Seasons** (`com.airkjw.blockseasons`)
- AAB 업로드: 내부 테스트 트랙에 `1 (1.0.0)` 게시됨
- 테스터 목록 설정 (`0614 테스트`)
- **판매자(결제) 프로필 설정 완료**
- **`remove_ads` 인앱상품 생성 + 활성** (173개 지역, "이전 버전과의 호환성" ✔)
`android/app/upload-keystore.jks` 파일과 비밀번호는 **이 앱의 영구 서명 키**입니다.
**잃어버리면 Play에서 이 앱을 영원히 업데이트할 수 없습니다.**
- `upload-keystore.jks` 파일을 안전한 곳(클라우드 드라이브 + 외장 등 2곳 이상)에 백업.
- 비밀번호도 비밀번호 관리자에 저장. (git에는 올라가지 않습니다 — gitignore됨)
**Apple App Store**
- App ID `com.airkjw.blockseasons` 등록, App Store Connect에 앱 생성
- `remove_ads` 비소모성 IAP 생성 + 가격 설정 (상태: 메타데이터 누락 → 아래 5단계에서 마무리)
> 참고: Play **앱 서명(Play App Signing)**을 쓰면 이 키는 "업로드 키"가 되고 분실 시
> 재설정이 가능하지만, 그래도 백업은 필수입니다.
**공통 자산 (이미 만들어 둠)**
- 앱 아이콘 512px: `docs/store/play_icon_512.png`
- 피처 그래픽 1024×500: `docs/store/feature_graphic.png`
- 개인정보처리방침 페이지: `docs/store/privacy-policy.html`
- app-ads.txt: `docs/store/app-ads.txt`
- 스토어 카피 EN/KO: `docs/store/store-listing.md`
-**스크린샷**: 아직 없음 → Claude에게 "스크린샷 뽑아줘" 요청하면 시뮬레이터로 생성
---
## 1. 개인정보처리방침(Privacy Policy) 페이지 — 양 스토어 필수
# 0단계 — 먼저 해둘 3가지 (양 스토어 공통 전제)
두 스토어 모두 **개인정보처리방침 URL**을 요구합니다. 무료로 GitHub Pages에 한 장
올리면 됩니다. 내용에 최소한 다음을 명시:
- 수집 항목: **광고 식별자(IDFA/광고 ID)**, **사용 데이터(앱 이용 통계)**, **기기 정보**.
- 사용처: **광고 게재(AdMob)**, **분석(Firebase Analytics)**.
- 제3자: Google AdMob, Google Firebase (각 정책 링크).
- 추적: iOS에서 ATT 동의 시에만 맞춤 광고. 동의 거부해도 앱 정상 작동.
- 구매: "광고 제거" 인앱 구입(비소모성).
- 문의 이메일.
### 0-1. 🔑 안드로이드 서명키 백업 (가장 중요, 분실 시 영구 업데이트 불가)
- 파일 `BlockSeasons/android/app/upload-keystore.jks`**2곳 이상**(클라우드+외장 등)에 백업
- 비밀번호 `35f52bb88a79b4279d3acce7935c33c9` (alias `upload`)을 비밀번호 관리자에 저장
- (Play 앱 서명을 쓰므로 이건 "업로드 키"지만 그래도 백업 필수)
### 0-2. 🌐 개발자 웹사이트 도메인 하나 정하고 2개 파일 올리기
양 스토어가 **개인정보처리방침 URL**을 요구하고, AdMob 수익엔 **app-ads.txt**가 필요합니다.
**도메인 하나**(예: GitHub Pages 무료 사이트, 또는 보유 중인 `gru.farm`)를 정해 아래 2개를 올리세요:
| 파일 | 올릴 위치(URL) | 내용 |
|---|---|---|
| `privacy-policy.html` | `https://<도메인>/privacy-policy.html` | `docs/store/privacy-policy.html` 그대로 |
| `app-ads.txt` | `https://<도메인>/app-ads.txt` (반드시 **도메인 루트**) | `google.com, pub-5605900229781491, DIRECT, f08c47fec0942fa0` |
> ⚠️ **그 도메인이 스토어 리스팅의 "웹사이트/마케팅 URL"과 정확히 같아야** AdMob이 app-ads.txt를 인식합니다.
> GitHub Pages가 가장 쉬움: 새 repo 만들고 두 파일 올린 뒤 Pages 켜기 → `https://<아이디>.github.io/<repo>/...`. (이러면 app-ads.txt가 루트가 아니므로, AdMob용으로는 **커스텀 도메인**이나 별도 루트 호스팅을 권장. 우선 개인정보처리방침 URL만 있어도 스토어 제출은 가능하고, app-ads.txt는 출시 후 며칠 내 인식돼도 됩니다.)
### 0-3. 결제 계약 확인
- **Google**: 판매자 프로필 완료됨 ✔ (이미 했음)
- **Apple**: 아래 App Store **5-④ 유료 앱 계약**을 완료해야 IAP 판매·심사 가능 (세금/뱅킹 — 본인이 입력)
---
## 2. app-ads.txt 호스팅 — 광고 수익 인증
# A. GOOGLE PLAY — 남은 순서
- 파일 내용은 `docs/store/app-ads.txt`에 있습니다:
```
google.com, pub-5605900229781491, DIRECT, f08c47fec0942fa0
```
- 이걸 **개발자 웹사이트 도메인 루트**에 올립니다 → `https://<도메인>/app-ads.txt`.
- ⚠️ 그 도메인은 **스토어 리스팅의 "마케팅/개발자 웹사이트" URL과 정확히 같아야**
AdMob이 인식합니다. (GitHub Pages 커스텀 도메인이면 그 도메인)
- 올린 뒤 AdMob → 앱 → app-ads.txt 상태가 며칠 내 "발견됨"으로 바뀝니다.
위치: Play Console → Block Seasons → **대시보드 → "앱 설정"** 항목을 위에서부터 채우면 됩니다.
(내부 테스트 빌드는 이미 올라가 있으니, 아래는 **프로덕션 출시에 필요한 정책/리스팅** 작성입니다.)
### A-1. 앱 액세스 권한
**"모든 기능을 제한 없이 사용할 수 있습니다"** 선택 (로그인 없음).
### A-2. 광고
**"예, 앱에 광고가 있습니다."**
### A-3. 콘텐츠 등급 (설문)
- 이메일 입력 → 카테고리 **"게임"**
- 폭력/성적/언어/약물/도박 등 전부 **아니요** (단순 블록 퍼즐)
- 결과: **전체이용가 / Everyone / PEGI 3** 예상
### A-4. 타겟층 및 콘텐츠
- 대상 연령: **만 13세 이상**(13~15, 16~17, 18세 이상) 선택 권장 — **만 13세 미만은 선택하지 말 것**
(아동 대상이 되면 'Designed for Families' 정책 + 아동 개인정보 의무가 생겨 광고 단가에 불리)
- "앱이 아동의 관심을 끌도록 디자인되었나요?" → **아니요**
### A-5. 데이터 보안 (Data safety) — 아래 값 그대로
- 데이터 수집·공유: **예**
- **기기 또는 기타 ID** (광고 ID): 수집함 · 목적 **광고 또는 마케팅** · **Google과 공유함** · 사용자 연결 안 함
- **앱 활동 / 앱 상호작용**: 수집함 · 목적 **분석** · 공유 안 함 · 사용자 연결 안 함
- 전송 중 암호화: **예**
- 사용자가 데이터 삭제 요청 가능: 개인정보처리방침 문의 이메일 기재로 충족
- ⚠️ "아동 대상 앱" → **아니요**
### A-6. 기타 선언
- 정부 앱 / 금융 기능 / 건강 앱 → 전부 **아니요**
- 뉴스 앱 → 아니요. 콘텐츠 가이드라인·미국 수출법 → **동의**
### A-7. 메인 스토어 등록정보
`docs/store/store-listing.md`에서 복붙:
- **앱 이름**: `Block Seasons`
- **간단한 설명** (≤80): KO `블록을 놓아 줄을 지우고, 몇 주마다 새 테마 시즌을 즐기세요. 광고 강요 없는 편안한 퍼즐.`
- **자세한 설명** (≤4000): store-listing.md의 KO(또는 EN) 본문
- **앱 아이콘** (512×512): `docs/store/play_icon_512.png`
- **그래픽 이미지** (1024×500): `docs/store/feature_graphic.png`
- **휴대전화 스크린샷** (최소 2장): ⬜ Claude에게 요청해 받기
- **카테고리**: 게임 → 퍼즐 · **태그**: 퍼즐/캐주얼
- **개인정보처리방침 URL**: 0-2에서 올린 주소
- **연락처 이메일**: `airkjw@gmail.com`
### A-8. 프로덕션 출시
1. **테스트 및 출시 → 프로덕션 → 새 버전 만들기**
2. 내부 테스트의 빌드를 **"라이브러리에서 추가"**로 가져오거나 AAB 재업로드(같은 `app-release.aab`)
3. 출시명/노트 입력 → 검토 → **출시 시작**(심사 제출)
4. ⚠️ **신규 개인 개발자 계정**은 "비공개 테스트 20명 × 14일" 후에야 프로덕션 가능 규정이 있습니다.
- 너는 이미 출시된 앱(복지앱)이 있어 **해당 없을 가능성이 높음**. 프로덕션에서 막히면 알려줘 — 비공개 테스트로 우회 안내할게.
### A-9. (출시 후) 샌드박스 결제 테스트
- 설정 → **라이선스 테스트**에 본인 Google 계정 추가 → 내부 테스트 앱에서 `remove_ads` 구매가 **실제 청구 없이** 테스트됨.
---
## 3. 개인정보 라벨 — 콘솔 입력값 (그대로 답하면 됨)
# B. APPLE APP STORE — 남은 순서
코드가 실제로 수집하는 것과 일치하는 답변입니다. 이 표대로 입력하세요.
위치: [App Store Connect](https://appstoreconnect.apple.com) → Block Seasons
### App Store Connect → 앱 개인정보 보호
| 데이터 유형 | 수집? | 사용 목적 | 사용자 연결 | 추적에 사용 |
### B-1. 빌드 업로드 (Xcode 권장 — CLI는 경로 공백 이슈 회피)
1. Xcode로 `ios/Runner.xcworkspace` 열기
2. 상단 기기 선택을 **"Any iOS Device (arm64)"**
3. 메뉴 **Product ▸ Archive** (서명은 Xcode 자동 서명)
4. Organizer 창 → **Distribute App ▸ App Store Connect ▸ Upload**
5. 처리에 수십 분 → App Store Connect → **TestFlight**에 빌드가 나타남
> Claude가 대신 IPA를 만들기 어려운 이유: iOS 서명은 너의 Apple 인증서가 필요해서 Xcode에서 해야 안전함. 막히면 단계별로 안내할게.
### B-2. 앱 정보 / 버전 정보
- 카테고리: **게임 → 퍼즐**, 연령 등급 설문 → **4+**
- 부제(≤30): KO `시즌마다 새로워지는 블록 퍼즐`
- 프로모션 텍스트·설명·키워드: `docs/store/store-listing.md`에서 복붙
- **개인정보처리방침 URL**: 0-2 주소
- **스크린샷** (6.7" 및 6.5" 필수): ⬜ Claude에게 요청
### B-3. 앱 개인정보 (App Privacy) — 아래 값 그대로
| 데이터 | 수집 | 목적 | 사용자 연결 | 추적 |
|---|---|---|---|---|
| 식별자 → 기기 ID(광고 식별자) | 예 | 제3자 광고 | 아니요 | **예** |
| 사용 데이터제품 상호작용 | 예 | 분석, 앱 기능 | 아니요 | 아니요 |
| 구매 → 구매 내역 | (Apple이 IAP 자동 처리, 별도 수집 안 함) | — | — | — |
| 기기 ID(광고 식별자) | 예 | 제3자 광고 | 아니요 | **예** |
| 사용 데이터(제품 상호작용) | 예 | 분석, 앱 기능 | 아니요 | 아니요 |
- 추적 사용 이유(ATT) 문구 예: "비맞춤형 대신 맞춤형 광고를 제공하기 위해 사용합니다."
### Google Play → 데이터 보안(Data safety)
- 데이터 수집함: **예**
- 앱 활동(앱 상호작용) → 분석 목적, 사용자 연결 안 함.
- 기기 또는 기타 ID(광고 ID) → 광고/마케팅 목적, **공유함(Google)**.
- 전송 중 암호화: 예. 사용자가 삭제 요청 가능: 해당 시 명시.
- ⚠️ **"아동 대상 앱" 아니오** (Everyone/4+, 아동 타겟 아님으로 정확히).
### B-4. IAP 마무리 (`remove_ads`)
- 표시 이름: EN `Remove Ads` / KO `광고 제거`
- 설명: `배너·전면 광고를 영구히 제거합니다. 보상형 영상은 그대로 사용할 수 있어요.`
- **리뷰용 스크린샷**: 앱 **설정 화면**(광고 제거 버튼 보이는 캡처) 1장 첨부
- ⚠️ **첫 IAP는 앱 버전과 함께 제출**해야 함 (버전 화면에서 IAP 포함시켜 제출)
### B-5. 계약 / 제출
-**유료 앱 계약(Paid Apps)**: 비즈니스 → 계약/세금/뱅킹 완료 (본인 입력) — IAP 판매·심사 전제
- 앱 심사 정보: 로그인 없음 → 데모 계정 불필요, 비고에 "No login required" 정도
- **심사 제출**
---
## 4. 안드로이드 — Play 업로드
# 권장 진행 순서 (최단 경로)
1. **0-1 키스토어 백업** (5분, 지금)
2. **0-2 개인정보처리방침 + app-ads.txt 호스팅** (양 스토어 리스팅의 필수 입력값이라 먼저)
3. **Claude에게 스크린샷 요청** (리스팅에 필요)
4. **Apple B-1 빌드 업로드 시작** (처리에 시간 걸리니 먼저 걸어두기)
5. Play A-1~A-7 + Apple B-2~B-4 문항 채우기 (대부분 위 표 복붙)
6. Apple B-5 유료앱 계약 → 양쪽 **심사 제출**
1. **AAB 파일**: Claude가 빌드한 `build/app/outputs/bundle/release/app-release.aab`.
(없거나 갱신 필요하면 Claude에게 "AAB 다시 빌드" 요청)
2. Play Console → Block Seasons → **테스트 → 내부 테스트 → 새 버전 만들기**.
3. AAB 업로드. (첫 업로드 시 **Play 앱 서명** 사용에 동의 — 권장)
4. 업로드되면 **수익 창출 → 제품 → 인앱 상품**에서 `remove_ads` 상품 생성 가능해집니다
(제품 ID는 **`remove_ads`** 정확히 — App Store와 동일).
5. **라이선스 테스터**(설정)에 본인 계정 추가 → 샌드박스 결제 테스트.
6. 데이터 보안·콘텐츠 등급·스토어 리스팅(아래 카피) 작성 → 내부 테스트 출시.
## 5. iOS — App Store Connect 업로드
1. **빌드 업로드**: Xcode로 `Runner.xcworkspace` 열기 → 기기를 "Any iOS Device" →
Product ▸ Archive → Organizer에서 "Distribute App" → App Store Connect 업로드.
(또는 `flutter build ipa` 후 Transporter 앱으로 업로드. 인증서/프로비저닝은
Xcode 자동 서명으로 처리.)
2. 업로드된 빌드가 App Store Connect → TestFlight에 나타납니다(처리 ~수십 분).
3. **IAP 마무리**: `remove_ads` 상품에 **표시 이름/설명(한·영)** + **리뷰용 스크린샷**
(설정 화면 캡처) 추가 → 상태가 "제출 준비됨"으로. 첫 IAP는 **앱 버전과 함께 제출**.
4. **유료 앱 계약**(Business → 계약/세금/뱅킹) 완료해야 IAP 판매·심사 가능.
5. 앱 개인정보(위 표) + ATT 사용 이유 + 스토어 카피 작성 → **심사 제출**.
## 6. 스토어 카피
`docs/store/store-listing.md`의 EN/KO 카피를 각 콘솔에 붙여넣으세요.
스크린샷은 실기기/시뮬레이터에서 캡처(홈·시즌맵·플레이·승리·엔드리스). Claude가
캡처를 도울 수 있습니다(시뮬레이터). iOS는 6.7"/6.5" 규격, Play는 폰 스크린샷.
## 7. AdMob — 앱 연결
앱이 스토어에 **출시된 뒤**, AdMob → 앱 → "앱 스토어에 연결"로 실제 스토어 앱과
연결하면 실광고 게재가 승인됩니다. (출시 전까지는 미연결이 정상)
---
## 제출 전 최종 체크리스트
- [ ] 키스토어 백업 완료
- [ ] 개인정보처리방침 URL 게시
- [ ] app-ads.txt 게시(개발자 웹사이트 도메인 = 스토어 URL)
- [ ] App Store: 빌드 업로드 + IAP(현지화·스크린샷) + 개인정보 라벨 + ATT 문구 + 카피
- [ ] Play: AAB(내부 테스트) + remove_ads 상품 + 데이터 보안 + 콘텐츠 등급 + 카피
- [ ] 유료 앱 계약(Apple)·결제 프로필(Google) 완료
- [ ] 양 스토어 심사 제출
문항별로 막히면 그 화면만 보여줘 — 그 부분만 같이 풀자.