Files
BlockSeasons/docs/store/phase7-submission-guide.md
T
airkjw 40abc26f5d build(release): Android signing, iOS privacy manifest, store assets (Phase 7)
- Android: release keystore signing wired via gitignored key.properties (falls
  back to debug when absent). Verified: signed AAB built (signer CN=Block Seasons).
- iOS: app PrivacyInfo.xcprivacy (ATT tracking flag, device-id/usage data types,
  UserDefaults+FileTimestamp required-reason APIs) registered in the Runner target.
- Store: app-ads.txt (pub-5605900229781491), EN/KO listing copy, owner submission
  guide (privacy labels, app-ads hosting, upload/submit steps).
Secrets (keystore, key.properties) are gitignored — owner backs them up.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-13 22:49:43 +09:00

5.9 KiB

Phase 7 — 릴리스 & 스토어 제출 가이드 (오너용)

코드/빌드 쪽(서명, 프라이버시 매니페스트, app-ads.txt 내용, 스토어 카피)은 준비돼 있습니다. 이 문서는 오너가 콘솔/웹에서 할 일제출 순서입니다. 헷갈리면 Claude에게 화면 보여주면서 같이 하면 됩니다.


0. 먼저 — 안드로이드 서명 키 백업 (가장 중요)

android/app/upload-keystore.jks 파일과 비밀번호는 이 앱의 영구 서명 키입니다. 잃어버리면 Play에서 이 앱을 영원히 업데이트할 수 없습니다.

  • upload-keystore.jks 파일을 안전한 곳(클라우드 드라이브 + 외장 등 2곳 이상)에 백업.
  • 비밀번호도 비밀번호 관리자에 저장. (git에는 올라가지 않습니다 — gitignore됨)

참고: Play **앱 서명(Play App Signing)**을 쓰면 이 키는 "업로드 키"가 되고 분실 시 재설정이 가능하지만, 그래도 백업은 필수입니다.


1. 개인정보처리방침(Privacy Policy) 페이지 — 양 스토어 필수

두 스토어 모두 개인정보처리방침 URL을 요구합니다. 무료로 GitHub Pages에 한 장 올리면 됩니다. 내용에 최소한 다음을 명시:

  • 수집 항목: 광고 식별자(IDFA/광고 ID), 사용 데이터(앱 이용 통계), 기기 정보.
  • 사용처: 광고 게재(AdMob), 분석(Firebase Analytics).
  • 제3자: Google AdMob, Google Firebase (각 정책 링크).
  • 추적: iOS에서 ATT 동의 시에만 맞춤 광고. 동의 거부해도 앱 정상 작동.
  • 구매: "광고 제거" 인앱 구입(비소모성).
  • 문의 이메일.

2. app-ads.txt 호스팅 — 광고 수익 인증

  • 파일 내용은 docs/store/app-ads.txt에 있습니다:
    google.com, pub-5605900229781491, DIRECT, f08c47fec0942fa0
    
  • 이걸 개발자 웹사이트 도메인 루트에 올립니다 → https://<도메인>/app-ads.txt.
  • ⚠️ 그 도메인은 스토어 리스팅의 "마케팅/개발자 웹사이트" URL과 정확히 같아야 AdMob이 인식합니다. (GitHub Pages 커스텀 도메인이면 그 도메인)
  • 올린 뒤 AdMob → 앱 → app-ads.txt 상태가 며칠 내 "발견됨"으로 바뀝니다.

3. 개인정보 라벨 — 콘솔 입력값 (그대로 답하면 됨)

코드가 실제로 수집하는 것과 일치하는 답변입니다. 이 표대로 입력하세요.

App Store Connect → 앱 개인정보 보호

데이터 유형 수집? 사용 목적 사용자 연결 추적에 사용
식별자 → 기기 ID(광고 식별자) 제3자 광고 아니요
사용 데이터 → 제품 상호작용 분석, 앱 기능 아니요 아니요
구매 → 구매 내역 (Apple이 IAP 자동 처리, 별도 수집 안 함)

Google Play → 데이터 보안(Data safety)

  • 데이터 수집함:
  • 앱 활동(앱 상호작용) → 분석 목적, 사용자 연결 안 함.
  • 기기 또는 기타 ID(광고 ID) → 광고/마케팅 목적, 공유함(Google).
  • 전송 중 암호화: 예. 사용자가 삭제 요청 가능: 해당 시 명시.
  • ⚠️ "아동 대상 앱" 아니오 (Everyone/4+, 아동 타겟 아님으로 정확히).

4. 안드로이드 — Play 업로드

  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) 완료
  • 양 스토어 심사 제출