- CLAUDE.md 현재 상태: 1.1 출시(2026-07-30) 확정, 1.1 내용 7항목 정리(맥 일기·CSV 가져오기· 일기 기본 표시 설정·짧은 기록 무시 KVS 동기화·스크린샷 개편·스토어 메타데이터 변경), 스크린샷 ASC 업로드 완료 처리, 문서 버전 v2.5 - Marketing/README 체크리스트 1.1 항목 완료 표시 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FVeduv1eNdXjk1ay4tSgBg
166 lines
16 KiB
Markdown
166 lines
16 KiB
Markdown
# Marketing — App Store 등록 자료
|
||
|
||
ASC(App Store Connect) 등록 때 그대로 붙여넣을 자료 모음. **앱 기능·문구가 바뀌면 이 폴더도 함께 갱신한다** (사용자 지시: 자료에 영향을 주는 변경이 생기면 별도 요청 없이 알아서 수정할 것 — 특히 description의 기능 목록, 스크린샷에 보이는 화면).
|
||
|
||
## 구성
|
||
|
||
```
|
||
AppStore/
|
||
description-{ko,en,ja}.txt 앱 설명 (4000자 이내) — 로케일별 '설명' 란
|
||
keywords.txt 키워드 (로케일별 100자 이내) — '키워드' 란
|
||
promotional-text.txt 프로모션 텍스트 (170자 이내, 심사 없이 수정 가능)
|
||
whats-new-1.0.txt 버전 1.0 '새로운 기능'
|
||
subscription-info.txt 인앱 상품 3종 메타데이터 + 자동 갱신 고지 + 등록 체크리스트
|
||
Screenshots/
|
||
iphone-6.9/{ko,en,ja}/ 아이폰 6.9" 원본 (1320×2868px — iPhone 17 Pro Max 시뮬레이터)
|
||
ipad-13/{ko,en,ja}/ 아이패드 13" 원본 (2064×2752px — iPad Pro 13"(M5) 시뮬레이터)
|
||
watch/{ko,en,ja}/ 애플워치 슬롯용 (416×496px — Series 11 46mm. 워치 앱이 있는 앱은 워치 스크린샷 필수)
|
||
framed-iphone-6.9/… ★ 업로드 권장: 홍보 문구+브랜드 배경 합성판 (같은 캔버스 크기라 ASC에 그대로)
|
||
framed-ipad-13/… ★ 업로드 권장: 〃 (원본은 예비/재합성 소스로 보관)
|
||
tools/
|
||
frame_screenshots.swift 합성 도구 — `swift Marketing/tools/frame_screenshots.swift` (저장소 루트에서).
|
||
문구·색은 파일 상단에서 수정, 원본을 다시 찍으면 이 도구만 재실행하면 됨
|
||
```
|
||
|
||
- 스크린샷(1.1 전면 개편, 2026-07-29 — ASC 한도 기기당 10장을 모두 사용):
|
||
- **아이폰 10장** = 01 모음 / 02 목표 / 03 하루 타임테이블 / 04 주간 통계 / 05 위젯 모아 보기 / 06 글래스 버블 메뉴 / 07 iCloud 동기화(합성) / 08 다크 모드 / 09 기록 목록(메모) / 10 주간 타임테이블
|
||
- **아이패드 10장** = 01 모음(사이드바) / 02 일기 달력(기분 사진) / 03 하루 정리 / 04 펜슬 노트 / 05 주간 타임테이블 / 06 위젯 모아 보기 / 07 iCloud 동기화(합성) / 08 일기 양식(속지) / 09 다크 모드 / 10 목표
|
||
- **워치 1장** = framed-watch/<언어>/01-main (원본 워치 스크린샷 + 문구 합성 — 원본은 watch/ 유지)
|
||
- 07-sync는 촬영본이 아니라 **합성 전용 슬라이드**: 아이폰·아이패드 01-main 원본 두 장을 frame_screenshots.swift의 renderSync가 한 캔버스에 담는다 (framed 폴더에만 존재)
|
||
- ASC는 6.9″(아이폰)·13″(아이패드)·워치 한 세트씩 필수 — 나머지 크기는 자동 축소 적용. **업로드 대상 = framed-iphone-6.9 / framed-ipad-13 / framed-watch** (원본 폴더는 재합성 소스)
|
||
- 상태바는 9:41·배터리 100%로 오버라이드된 상태로 촬영 (워치 시뮬레이터는 오버라이드 미지원 — 실제 시각 표시)
|
||
- 알려진 티: iPad 상태바의 날짜 문자열은 시뮬레이터 **시스템** 언어(한국어)를 따름 — 앱 런치 인자로는 못 바꾸는 영역. 아이폰은 시간만 표시라 무관. 완벽을 원하면 시뮬 시스템 언어 변경 후 재촬영
|
||
- 문구 오버레이 규정: Apple은 스크린샷에 마케팅 문구·배경 합성을 허용(실제 앱 화면이 반영되어 있으면 됨) — framed 세트는 이 관행을 따른 것
|
||
|
||
## 스크린샷 재생성 방법
|
||
|
||
데모 데이터 이름·메모는 `String(localized:)`라 실행 로케일을 따른다(`DebugSeed`). 로케일마다 **앱을 지우고 새로 시드**해야 그 언어의 데이터가 들어간다.
|
||
|
||
```zsh
|
||
# 0) Debug 빌드 후 앱 경로
|
||
APP=$(find ~/Library/Developer/Xcode/DerivedData/Haru_Danim-*/Build/Products/Debug-iphonesimulator -maxdepth 1 -name "Haru_Danim.app" | head -1)
|
||
IPHONE=DB9D0281-123D-425D-9547-10CFF7946733 # iPhone 17 Pro Max (6.9")
|
||
IPAD=39E5A4BE-9082-47AF-B6E4-1B9E8D271681 # iPad Pro 13-inch (M5)
|
||
|
||
# 1) 부팅 + 상태바 오버라이드 (기기당 1회)
|
||
xcrun simctl boot $IPHONE; xcrun simctl status_bar $IPHONE override --time "9:41" --batteryState charged --batteryLevel 100 --wifiBars 3 --cellularBars 4
|
||
|
||
# 2) 로케일마다: 지우고 → 설치 → 시드와 함께 화면별 콜드 스타트 → 스크린샷
|
||
# (로케일: ko_KR / en_US / ja_JP)
|
||
xcrun simctl uninstall $IPHONE com.yechan.HaruDanim && xcrun simctl install $IPHONE "$APP"
|
||
xcrun simctl launch $IPHONE com.yechan.HaruDanim -seedDemo YES -premium YES -AppleLanguages "(en)" -AppleLocale en_US
|
||
xcrun simctl io $IPHONE screenshot Marketing/Screenshots/iphone-6.9/en/01-main.png
|
||
# 이후 화면은 terminate 후 같은 로케일로: -startTab goal / -startTab history -historyMode timetable / -startTab stats -statSpan week
|
||
|
||
# 아이패드 일기: 첫 실행 -startTab diary -diarySeed YES (달력에서 시드) → 이후 -diaryOpenToday YES (+-diaryPage 1 = 노트)
|
||
```
|
||
|
||
### 시간대 정합 (필수 — 앱 내 시각과 상태바 9:41을 맞추는 법)
|
||
|
||
앱 안의 시각(측정 시작 등)이 상태바 9:41과 어긋나지 않게, **"지금이 오전 9시대인 시간대"로 시뮬레이터를 부팅**한다.
|
||
⚠️ 방법은 반드시 **부팅 시 주입**: `SIMCTL_CHILD_TZ=Asia/Bangkok xcrun simctl boot $SIM` (launchd_sim이 상속 → 전 프로세스 적용).
|
||
launch 시점의 SIMCTL_CHILD_TZ는 간헐적으로 유실되고(2026-07-29 실측 — UTC로 떨어짐), 앱 내부에서의 setenv/NSTimeZone.default는
|
||
FormatStyle에 반영되지 않는다. 로케일마다 첫 시드 실행에 `-marketingTZ <IANA id>`를 넘겨 `Documents/tz-probe.txt`의
|
||
`current=`가 의도한 시간대인지 **확인 후 촬영**한다 (2026-07-29 촬영은 KST 오전 11시대 → Asia/Bangkok(UTC+7)=오전 9시대 사용).
|
||
|
||
### 화면별 런치 인자 (로케일마다 지우고 재설치·재시드)
|
||
|
||
```zsh
|
||
# 공통: 매 실행에 -marketingTZ <IANA id> -premium YES -AppleLanguages "(xx)" -AppleLocale xx_XX
|
||
# 아이폰 (01~09는 -seedDemo만, 10은 -seedBulk 추가 시드 후):
|
||
# 01-main : (기본 실행) 02-goals: -startTab goal
|
||
# 03-timetable: -startTab history -historyMode timetable
|
||
# 04-stats : -startTab stats -statSpan week
|
||
# 05-widgets : -widgetPreview marketing ← 위젯 실렌더 모아 보기 (DEBUG 전용 화면)
|
||
# 06-bubble : -navStyle radial -radialExpanded YES
|
||
# 08-dark : 기본 실행 후 `simctl ui <sim> appearance dark` → 촬영 → light 복귀
|
||
# 09-records : -startTab history -historyDaysAgo 1 (어제 목록 — 메모 노랑 표시)
|
||
# 10-week : (벌크 시드 후) -startTab history -historyMode timetable -historyWeekly YES -historyDaysAgo 7
|
||
# 아이패드: 01/10-goals/09-dark 동일 요령. 일기는 첫 실행에
|
||
# -startTab diary -diarySeed YES -diarySeedPhoto YES -diarySeedTemplate YES 로 시드 후:
|
||
# 02: -startTab diary 03: +-diaryOpenToday 04: +-diaryPage 1 08: +-diaryApplyTemplate
|
||
# 05-timetable·06-widgets는 벌크 시드 후 아이폰 10·05와 동일 인자
|
||
# 07-sync는 촬영 없음 — 합성 도구가 아이폰·아이패드 01-main에서 만든다. 워치 합성도 도구가 watch/ 원본에서 만든다
|
||
```
|
||
|
||
### 워치 스크린샷 (페어링 아이콘 없는 깨끗한 상태바로 찍는 법)
|
||
|
||
페어링 시뮬레이터는 상태바에 빨간 '아이폰 연결 끊김' 아이콘이 떠서 스토어용으로 부적합.
|
||
**페어링 워치가 받은 스냅숏 캐시(App Group plist)를 비페어링 워치 시뮬레이터로 복사**해 찍는다:
|
||
|
||
```zsh
|
||
WA=8B57A70E-... # 페어링 워치 (iPhone 17 Pro와 페어)
|
||
MW=0A2CB37C-A755-4784-9D14-C7AB8FD72C3E # 'MarketingWatch' — 비페어링 Series 11 46mm (없으면 simctl create)
|
||
# 로케일마다: ①아이폰 재설치+시드(해당 로케일) ②페어링 워치 앱 재설치+실행(스냅숏 수신·캐시) 후 종료
|
||
# ③MW를 shutdown한 상태에서 페어링 워치의 group.com.yechan.HaruDanim.plist를 MW의 같은 경로로 복사
|
||
# (cfprefsd 캐시 때문에 반드시 종료 상태에서 — 부팅 중 복사하면 반영 안 됨)
|
||
# ④MW 부팅 → 워치 앱을 -AppleLanguages "(로케일)"로 실행 → 스크린샷
|
||
# 주의: 아이폰 앱을 삭제하면 페어링 워치의 워치 앱도 함께 삭제됨 — 로케일마다 워치 앱 재설치 필요
|
||
```
|
||
|
||
## 출시 절차 체크리스트 (계좌 승인 이후 → 출시 — 2026-07-23 상세화. 상품 메타는 subscription-info.txt)
|
||
|
||
> ✅ **2026-07-28: 아래 절차 전부 완료 — 버전 1.0 App Store 출시됨.** 이 체크리스트는 절차 기록으로 유지.
|
||
> 📸 **2026-07-29: 1.1용 스크린샷 전면 개편 — 아이폰 10장·아이패드 10장·워치 합성 1장 × ko/en/ja (전부 재촬영·재합성).**
|
||
> 스크린샷은 버전 메타데이터라 출시된 버전에서는 못 바꾼다 — **1.1 제출 때** 각 언어의 스크린샷 란을
|
||
> framed-iphone-6.9(01~10)·framed-ipad-13(01~10)·framed-watch(01)로 **전부 교체 업로드**할 것.
|
||
> 실제와 달랐던 점 2가지: ①IAP 심사용 스크린샷은 기기 규격이 아니라 **640×920만 통과** ②신형 ASC는 버전 페이지의
|
||
> 인앱 섹션 대신 **각 항목의 "심사에 추가"로 하나의 제출 초안에 담는 방식**(첫 IAP는 앱 버전·구독 그룹과 함께).
|
||
> 인앱 무료 지급은 프로모션 코드 폐지(2026-03) 이후 **특가 코드(Offer Code)** 사용.
|
||
|
||
⏳ = 승인·처리 대기 구간. ②~⑥은 계좌 승인 대기 중에도 미리 가능(단 ⑥ 인앱 상품·가격은 유료 앱 계약 활성이 선행 조건일 수 있음).
|
||
ASC 화면 구성은 수시로 바뀌므로 메뉴 위치가 다르면 항목 이름으로 찾을 것. 수수료·세무 등 금액이 걸린 내용은 ASC 안내문으로 최종 확인 권장.
|
||
|
||
### ① 유료 앱 계약 활성 (⏳ 계좌 승인 대기 → 활성)
|
||
- [ ] appstoreconnect.apple.com → **비즈니스**(구 '계약, 세금 및 은행 업무') → 유료 앱(Paid Apps) 계약이 **활성(Active)** 인지 확인 (계좌 승인 후 몇 시간~며칠)
|
||
- [ ] 같은 곳에서 한국 전자상거래법 판매자 정보 입력: **사업자등록번호·통신판매업 신고번호**(2026-07-22 신고 완료) — 한국 스토어 앱 페이지에 표시됨
|
||
- [ ] 계약 활성 직후 **소규모 사업자 프로그램**(수수료 30%→15%) 신청: developer.apple.com/kr/app-store/small-business-program/ → Account Holder로 등록. ⏳ 승인 며칠, 할인은 승인 시점부터(소급 없음으로 알려짐 — 신청 페이지에서 확인)
|
||
|
||
### ② CloudKit 프로덕션 스키마 배포 (심사 제출 전 필수 — TestFlight 설치 **전에**)
|
||
- [ ] icloud.developer.apple.com → 컨테이너 `iCloud.com.yechan.HaruDanim` → Development 환경 Schema → Record Types에 CD_ 접두 타입 전부(특히 최신 `CD_DiaryTemplate`) 있는지 확인 (없으면 개발 빌드 실기기에서 iCloud 토글 켜고 데이터 조작해 생성)
|
||
- [ ] **Deploy Schema Changes… → Production** 실행 → Production 환경에서 동일하게 보이는지 확인
|
||
- ⚠️ TestFlight/App Store 빌드는 프로덕션 환경을 쓴다 — 미배포 시 출시 빌드에서 iCloud 동기화가 통째로 실패
|
||
|
||
### ③ ASC 앱 생성
|
||
- [ ] 앱 → + → 신규 앱: iOS / 이름 **하루 다님**(중복 시 "하루 다님 - 습관·시간 기록" 식 조정) / 기본 언어 **한국어** / 번들 ID `com.yechan.HaruDanim` / SKU `harudanim-ios`
|
||
|
||
### ④ 앱 정보·개인정보·가격
|
||
- [ ] 앱 정보: 카테고리 기본 **생산성**·보조 **라이프스타일** / 콘텐츠 권한 제3자 콘텐츠 없음 / **연령 등급 설문 전부 없음 → 4+**
|
||
- [ ] 개인정보 처리방침 URL: `https://github.com/notalentprogrammer/HaruDanim/blob/main/PRIVACY.md` / EULA는 비워둠(=Apple 표준 EULA, 결제 화면 링크와 일치)
|
||
- [ ] 현지화 추가(영어(미국)·일본어) — 언어별 앱 이름: ko 하루 다님 / en·ja **Haru Danim**
|
||
- [ ] 앱 개인정보 보호: **"데이터 수집 안 함"** 선택 후 게시 (PrivacyInfo.xcprivacy 4개와 일치)
|
||
- [ ] 가격 및 사용 가능 여부: **무료**, 국가 전체(최소 ko·us·jp 확인)
|
||
|
||
### ⑤ 버전 1.0 페이지 (언어 ko/en/ja마다 전환하며 입력)
|
||
- [ ] 스크린샷: iPhone 6.9″ = `Screenshots/framed-iphone-6.9/<언어>/01~04` 4장 / iPad 13″ = `framed-ipad-13/<언어>/01~04` 4장 / **Apple Watch = `watch/<언어>/01-main.png` 1장(워치 앱 있는 앱은 필수)**
|
||
- [ ] 프로모션 텍스트 = promotional-text.txt / 설명 = description-<언어>.txt / 키워드 = keywords.txt 해당 줄 / 지원 URL = `https://github.com/notalentprogrammer/HaruDanim`
|
||
- [ ] App Review 정보: 연락처 + **로그인 필요 없음** 체크 + 메모(계정 없음·프리미엄은 설정 → 프리미엄에서 샌드박스 구매 가능·약관 링크는 결제 화면과 설명에 있음·일기는 iPad 전용 펜슬 지원)
|
||
- [ ] 출시 방식: 심사 통과 후 자동 출시(또는 수동)
|
||
|
||
### ⑥ 인앱 상품 3종 등록 (product ID는 subscription-info.txt에서 복사 — 오타 나면 앱이 상품을 못 불러옴)
|
||
- [ ] 수익화 → 구독: 그룹 `HaruDanim Premium`(현지화 프리미엄/Premium/プレミアム) → 그룹 안에 monthly(1개월·₩5,000)·yearly(1년·₩50,000) — **둘은 같은 등급(레벨 1)** (월↔년 전환이 업그레이드 취급되게). 가격은 임시가, 등록 시점 최종 결정
|
||
- [ ] 수익화 → 앱 내 구입: 비소모성 lifetime(₩80,000)
|
||
- [ ] 각 상품 ko/en/ja 현지화 입력. 심사용 스크린샷 란은 ⑧까지 비워둠("메타데이터 누락" 상태가 정상)
|
||
|
||
### ⑦ 아카이브 → 업로드 (⏳ 처리 10~60분)
|
||
- [ ] Xcode 스킴 `Haru_Danim` + 대상 **Any iOS Device (arm64)** / 4개 타깃 버전 1.0·빌드 일치 확인(워치 버전 불일치 시 업로드 거부)
|
||
- [ ] Product → Archive → Organizer → Distribute App → App Store Connect → Upload (자동 서명 그대로. aps-environment는 배포 서명에서 자동 production)
|
||
- [ ] ⏳ 처리 완료 메일 후 TestFlight 탭에 빌드 등장. 수출 규정 질문 없음(`ITSAppUsesNonExemptEncryption=NO` 등록됨). 재업로드는 **빌드 번호 증가** 필수
|
||
|
||
### ⑧ TestFlight 실기기 확인 (내부 테스터는 베타 심사 불필요)
|
||
- [ ] TestFlight 탭 → 내부 테스팅 그룹 생성 → 본인 추가 → 빌드 지정 → 기기 TestFlight 앱에서 설치
|
||
- [ ] 결제 화면 상품 3종 로드(⑥ 반영까지 몇 시간 걸릴 수 있음)·구매·복원 / **iCloud 동기화 2기기 왕복(=② 프로덕션 검증)** / 위젯·워치·일기 잠금·펜슬
|
||
- [ ] **결제 화면(설정 → 프리미엄, 상품 3종 보이는 상태) 실기기 스크린샷 캡처** → ⑨에서 사용
|
||
|
||
### ⑨ IAP 심사 스크린샷 첨부
|
||
- [ ] 상품 3종 각각 심사 정보 → 스크린샷에 ⑧ 캡처 업로드(**3종 동일 이미지 재사용 가능**) → 상태 "제출 준비 완료" 확인
|
||
|
||
### ⑩ 심사 제출 (⏳ 보통 24~48시간, 첫 앱은 더 걸릴 수 있음)
|
||
- [ ] 버전 1.0 페이지 → 빌드 선택 + **인앱 구입 및 구독 섹션에 상품 3종 첨부**(신규 IAP는 단독 심사 불가 — 빼먹으면 앱만 승인되고 결제가 빈 화면) → 심사를 위해 추가 → 제출
|
||
- [ ] 거절 시 해결 센터에서 사유 확인 → 소명 또는 수정 재제출 (복원 버튼·약관 링크·자동 갱신 고지는 이미 갖춤)
|
||
|
||
### ⑪ 승인 → 출시 → 직후
|
||
- [ ] 자동 출시면 승인 즉시 전파(전 세계 반영 2~24시간), 수동이면 "이 버전 출시" 버튼
|
||
- [ ] 스토어 다운로드로 첫 실행·결제 화면 로드 확인 / 소규모 사업자 승인 여부 / 한국 스토어 사업자 정보 표시 확인
|
||
- [x] 다음 버전부터: 1.1 + "새로운 기능" 작성, IAP 첨부 불필요(이미 승인됨) — **1.1 출시 완료(2026-07-30)**: 스크린샷 전체 교체·앱 이름/부제목/키워드/프로모션 변경·whats-new-1.1 반영
|