diff --git a/docs/store/phase7-submission-guide.md b/docs/store/phase7-submission-guide.md index 862149b..d4961d1 100644 --- a/docs/store/phase7-submission-guide.md +++ b/docs/store/phase7-submission-guide.md @@ -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//...`. (이러면 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) 완료 -- [ ] 양 스토어 심사 제출 +문항별로 막히면 그 화면만 보여줘 — 그 부분만 같이 풀자. diff --git a/docs/store/play_icon_512.png b/docs/store/play_icon_512.png new file mode 100644 index 0000000..e6ed586 Binary files /dev/null and b/docs/store/play_icon_512.png differ diff --git a/docs/store/privacy-policy.html b/docs/store/privacy-policy.html new file mode 100644 index 0000000..f64333a --- /dev/null +++ b/docs/store/privacy-policy.html @@ -0,0 +1,105 @@ + + + + + +Block Seasons — Privacy Policy / 개인정보처리방침 + + + + + +

Block Seasons 개인정보처리방침

+

최종 업데이트: 2026년 6월 14일 · 문의: airkjw@gmail.com

+ +

본 방침은 모바일 게임 Block Seasons(이하 "본 앱")의 개인정보 처리에 관한 내용을 설명합니다. 본 앱은 계정 가입이 필요 없으며, 이름·이메일 등 직접적인 개인 식별 정보를 수집하지 않습니다.

+ +

1. 수집하는 정보

+ +

본 앱 개발자는 위 정보를 통해 개인을 식별하지 않으며, 별도의 서버에 개인정보를 저장하지 않습니다. 게임 진행·설정은 기기 내부(로컬)에만 저장됩니다.

+ +

2. 정보 이용 목적

+ + +

3. 제3자 제공 및 처리

+

본 앱은 다음 제3자 서비스를 사용하며, 해당 서비스의 정책에 따라 정보가 처리됩니다.

+ + +

4. 추적 및 맞춤 광고 (iOS)

+

iOS에서는 앱 실행 시 추적 허용(App Tracking Transparency) 동의를 요청합니다. 동의하면 맞춤형 광고가 제공될 수 있고, 거부해도 본 앱의 모든 기능을 정상적으로 이용할 수 있으며 비맞춤형 광고가 표시됩니다.

+ +

5. 인앱 구매

+

일회성 "광고 제거(Remove Ads)" 인앱 구매를 제공합니다. 결제는 Apple App Store 또는 Google Play를 통해 처리되며, 개발자는 결제 카드 등 결제 수단 정보를 수집하거나 보관하지 않습니다.

+ +

6. 아동의 개인정보

+

본 앱은 만 13세 미만 아동을 주 대상으로 하지 않으며, 아동의 개인정보를 고의로 수집하지 않습니다.

+ +

7. 데이터 보관 및 삭제

+

로컬 저장 데이터는 앱 삭제 시 함께 제거됩니다. 광고/분석 데이터의 처리·삭제는 위 제3자 정책을 따릅니다. 관련 문의는 아래 이메일로 연락 주십시오.

+ +

8. 문의

+

개인정보 관련 문의: airkjw@gmail.com

+ +
+ + +

Block Seasons Privacy Policy

+

Last updated: June 14, 2026 · Contact: airkjw@gmail.com

+ +

This policy describes how the mobile game Block Seasons ("the App") handles information. The App requires no account sign-up and does not collect directly identifying personal information such as your name or email.

+ +

1. Information We Collect

+ +

The developer does not use this information to identify you personally and stores no personal data on its own servers. Game progress and settings are stored only locally on your device.

+ +

2. How We Use Information

+ + +

3. Third Parties

+ + +

4. Tracking & Personalized Ads (iOS)

+

On iOS the App requests App Tracking Transparency permission. If you allow it, personalized ads may be shown. If you decline, the App works fully and shows non-personalized ads.

+ +

5. In-App Purchases

+

A one-time "Remove Ads" purchase is offered. Payment is handled by the Apple App Store or Google Play; the developer does not collect or store your payment details.

+ +

6. Children's Privacy

+

The App is not primarily directed at children under 13 and does not knowingly collect personal information from children.

+ +

7. Data Retention & Deletion

+

Locally stored data is removed when the App is uninstalled. Advertising and analytics data follow the third-party policies above. For requests, contact us below.

+ +

8. Contact

+

Privacy inquiries: airkjw@gmail.com

+ + +