코드 완성이 출시의 절반이라면, 나머지 절반은 App Store Connect다. 생각보다 손댈 곳이 많다.

Apple Developer Program

Apple Developer Program은 연 $99다. 개인(Individual)으로 가입하면 App Store에 Seller Name이 본명으로 표시된다. 조직으로 가입하면 D-U-N-S 번호가 필요하고 처리 기간도 길어진다. 개인 프로젝트라 Individual로 가입했다.

가입 즉시 사용 가능하다. 예전에는 검토 시간이 있었지만 요즘은 거의 바로 된다.

App Store Connect 앱 등록

앱 등록에서 채워야 하는 것들.

필수 정보

  • 앱 이름, 부제목, 설명 (영문/한국어 각각)
  • 키워드 (100자 제한)
  • 지원 URL, 개인정보처리방침 URL
  • 카테고리 (주/부)
  • 연령 등급

주의할 점들

앱 설명은 첫 3줄이 중요하다. 앱스토어에서 “더 보기” 전에 보이는 부분이다. 기능 나열보다 게임의 핵심 경험을 한 문장으로.

연령 등급은 앱 내 콘텐츠에 따라 결정된다. Painting Star는 광고가 있어서 그냥 4+가 아니라 광고 콘텐츠 관련 항목에 체크해야 했다.

개인정보처리방침 URL은 필수다. GitHub Pages로 간단히 만들어뒀다.

스크린샷

스크린샷 요구사항이 까다롭다.

디바이스 해상도
iPhone 6.9” (필수) 1320×2868
iPhone 6.5” (필수) 1284×2778
iPad 13” (필수) 2048×2732

iPhone 17 Pro Max 시뮬레이터에서 찍은 스크린샷은 크기가 다를 수 있다. Python으로 리사이즈 스크립트를 짜서 처리했다.

from PIL import Image

img = Image.open("screenshot.png")
resized = img.resize((1284, 2778), Image.LANCZOS)
resized.save("screenshot_1284x2778.png", "PNG")

스크린샷에 텍스트 오버레이를 넣는 앱들이 많다. Painting Star는 텍스트 최소화가 컨셉이라 게임 화면 그대로 올렸다. 어차피 퍼즐 게임은 화면이 설명한다.

스크린샷 찍을 때 팁: 시뮬레이터에서 Cmd+S로 저장하면 폰 상단 바(시간, 배터리)가 같이 찍힌다. 깔끔한 게임 화면만 찍으려면 Phaser 캔버스를 PNG로 직접 export하거나, 상단 바 없는 상태에서 캡처하면 된다.

인앱결제 등록

App Store Connect에서 인앱결제 상품을 등록하는 방법.

  1. 앱 페이지 → 앱 내 구입 → (+)
  2. Non-Consumable 선택 (광고 제거는 한 번 사면 영구)
  3. Product ID 입력 (com.hsc.paintingstar.remove_ads)
  4. 가격 설정
  5. 메타데이터: 표시 이름, 설명
  6. 검토용 스크린샷: 640×920 이미지 별도 필요 (앱 스크린샷과 별개)

검토용 스크린샷을 빠뜨리면 “메타데이터 누락”으로 저장이 안 된다. 처음에 이게 뭔지 몰라서 헤맸다.

빌드 업로드

Xcode에서 Product → Archive → Distribute App으로 업로드한다. 업로드가 완료되면 App Store Connect에서 빌드를 선택할 수 있다.

빌드를 업로드하는 것과 심사 제출은 다르다. 업로드 후 App Store Connect에서 빌드를 선택하고 모든 정보를 채운 다음 “심사에 추가”를 눌러야 제출이 완료된다.

심사 제출 전 체크리스트

제출하려고 “심사에 추가”를 눌렀는데 여러 군데에서 막혔다.

NSUserTrackingUsageDescription 누락 Info.plist에 ATT 사용 목적 문자열이 없으면 제출 불가. AdMob을 쓰면 반드시 필요하다.

iPad 스크린샷 누락 iPhone 스크린샷만 있으면 안 된다. iPad 13” 스크린샷도 필수다.

수출 규정 관련 문서 앱에 암호화를 사용하는지 묻는다. HTTPS를 쓰는 것만으로도 해당될 수 있는데, 표준 암호화(HTTPS, TLS)만 사용하고 별도 암호화 구현이 없으면 “해당 없음”으로 처리 가능하다.

인앱결제 목록 추가 심사 제출 화면에서 인앱결제 항목도 별도로 추가해야 한다. 상품을 등록해놨다고 자동으로 연결되지 않는다.

예상 리젝 포인트

제출 후 걱정되는 부분이 두 가지 있다.

첫째, AdMob isTesting: true. 심사 중에 리뷰어가 실제 광고를 볼 수 없다. 이 상태로 심사 통과 여부가 불확실하다. AdMob 계정 승인 전에는 테스트 모드로 둘 수밖에 없다.

둘째, 인앱결제 동작 검증. Sandbox 환경에서 상품을 찾지 못하는 상태로 제출했다. 심사 중에 인앱결제가 동작하지 않으면 리젝될 수 있다. 앱이 심사 큐에 들어가면서 상품 상태가 WAITING_FOR_REVIEW로 바뀌었으니 심사 시점에는 동작할 거라고 봤다.

현재 상태

심사 제출 완료, 대기 중. 리젝되면 그때 대응하는 것으로.

App Store 심사 프로세스는 생각보다 절차가 많다. 코드 완성 → 빌드 → 스크린샷 → App Store Connect 입력 → 인앱결제 설정 → 빌드 업로드 → 심사 제출. 각 단계에서 빠뜨린 게 있으면 다음 단계로 못 간다. 처음 하는 사람이라면 체크리스트를 만들어두는 게 낫다.