new-app-info은(는) 무엇을 하나요?
Apple의 "추가 정보 필요" 요청을 하나의 파일로 변환합니다. 사용자는 App Store Connect에 답변을 게시하고 App Review Information의 노트 필드에도 붙여넣어 향후 제출 시에도 사용할 수 있도록 합니다. 녹화는 사용자만 직접 제작할 수 있는 부분입니다.
Apple이 요구하는 6가지 항목
모든 패키지는 Apple의 메시지에 항목이 누락되거나 다르게 표현되더라도 1~6번 순서로 6가지 항목을 모두 포함합니다. Apple의 메시지에 항목이 추가되거나 변경된 경우 Apple 버전을 따르고 차이점을 기록하세요.
| # | Apple이 요청하는 항목 | 답변 제공 주체 |
|---|---|---|
| 1 | 최신 OS가 설치된 실제 기기에서 화면 녹화. 앱 실행부터 시작하여 계정 등록, 로그인 및 계정 삭제, 사용자 생성 콘텐츠의 신고 및 차단, 유료 콘텐츠 접근 등 일반적인 사용자 흐름을 보여주어야 함 | 파트 1 (샷 리스트) + 답변 §1 |
| 2 | 앱의 목적과 대상 사용자: 해결하는 문제와 제공하는 가치 | 답변 §2 |
| 3 | 주요 기능 설정 및 접근 방법, 필요한 로그인 자격 증명 또는 샘플 파일 포함 | 답변 §3 |
| 4 | 핵심 기능에 사용되는 외부 서비스, 도구 또는 플랫폼 (데이터 제공자, 인증, 결제 처리, AI 서비스) | 답변 §4 |
| 5 | 기능 또는 콘텐츠의 지역별 차이점 또는 모든 지역에서 동일하게 작동한다는 확인 | 답변 §5 |
| 6 | 규제가 심한 산업 또는 보호된 제3자 자료: 승인을 증명하는 문서 또는 자격 증명 | 답변 §6 |
엄격한 규칙
- 녹화는 반드시 실제 기기, 최신 OS, 단일 테이크, 정상 속도, 앱 아이콘을 탭하는 순간부터 시작해야 합니다. 시뮬레이터 녹화나 속도가 조정된 편집본을 제출용으로 제공하지 마십시오. 사용자의 휴대폰을 조작할 수 없으므로 녹화는 사용자가 직접 수행하며, 여러분의 역할은 샷 리스트를 제공하는 것입니다.
- 빌드에 있는 내용만 주장하세요. 모든 기능, 서비스 및 언어는 계획이나 메모가 아닌 코드에서 비롯되어야 합니다.
- 해당 사항 없음도 답변입니다. 사유와 함께 한 문장으로 제시하세요 (예: "앱에 계정 등록 또는 로그인이 없습니다").
- 계정: 사용자가 계정을 만들 수 있는 경우 계정 삭제는 필수이며 녹화에 포함되어야 합니다. 누락된 경우 차단 항목으로 보고하십시오. 로그인이 있는 경우 항목 3에는 데모 자격 증명이 필요합니다 (계정 유형당 한 세트). 사용자에게 App Store Connect에 입력하도록 안내하십시오. 절대 실제 비밀번호를 파일에 작성하지 마십시오.
- App Store Connect에서 아무 것도 보내거나 제출하거나 편집하지 마십시오. 사용자가 답변을 붙여넣고 비디오를 첨부합니다.
- 리포지토리나 기기에서 가능한 모든 플레이스홀더를 채우십시오. 남은 플레이스홀더와 각각을 채울 내용을 나열하십시오.
1단계: Apple 메시지 읽기
사용자가 메시지를 붙여넣은 경우 위 표의 번호가 매겨진 항목과 비교하고 이 앱에 적용되는 녹화 조건 (계정, 사용자 생성 콘텐츠, 유료 콘텐츠)을 기록하십시오.
2단계: 코드에 기반하여 검증
제출된 커밋의 코드를 읽으세요. 작업 복사본이 아닙니다 (먼저 고정하십시오. 6단계 → 리뷰 빌드, 0단계 참조). 작업 복사본은 종종 출시되지 않은 기능이 있는 기능 브랜치이며, 이를 Apple에 설명하는 것은 보유하지 않은 빌드에 대한 주장이 됩니다. git grep <패턴> <커밋> -- <경로> 및 git show <커밋>:<경로>를 사용하십시오.
모든 검색에서 build, Pods, .dart_tool, node_modules 및 .git을 제외하십시오.
| 항목 | 확인 위치 |
|---|---|
| 1, 3: 실행부터의 주요 흐름 | 라우터 및 화면; 온보딩; 핵심 루프 |
| 1, 3: 계정, 로그인, 삭제 | firebase_auth, sign_in_with_apple, supabase, Auth, login, signUp, deleteAccount, delete.*data |
| 1: 사용자 생성 콘텐츠 | 게시, 댓글, 채팅, 업로드; report, block, flag |
| 1, 3: 유료 콘텐츠 | purchases_flutter, revenuecat, StoreKit, product_id, 페이월 화면. 어떤 기능이 잠겨 있는지, 무료 체험 기간이 있는지, 페이월이 나타나는 시기, 구매 복원 위치 확인 |
| 1: 화면 캡처 차단 | no_screenshot, isSecureTextEntry 트릭, UIScreen.capturedDidChange, FLAG_SECURE. 차단된 화면은 녹화에서 빈 화면으로 나타나므로 답변에 이유를 명시해야 함 |
| 2: 목적 및 대상 사용자 | 스토어 리스팅 카피, 브랜드 또는 음성 문서, README, 출시 체크리스트, 온보딩 카피 (.arb, .strings, strings.xml) |
| 3: 샘플 파일 | 파일 가져오기, 문서 피커, QR/바코드 스캐닝, 앱에 필요한 하드웨어 |
| 4: 외부 서비스 | 종속성 (pubspec.yaml, Podfile, package.json, Gradle) 및 빌드 정의 (--dart-define, 키 파일, 릴리스 스크립트). 각각: 하는 일과 가져오는 데이터. 릴리스 빌드에서 실제로 켜는 SDK만 나열 |
| 5: 지역 | 출시된 로케일; 지역 검사 (locale, countryCode, region); 지역별 가격, 기능 또는 콘텐츠 |
| 6: 규제 또는 보호 | 건강, 의료, 금융, 도박, 법률 또는 어린이 콘텐츠 및 관련 주장; 라이선스가 필요한 콘텐츠, 음악, 이미지, 폰트 및 라이선스 |
| 연락처 | 설정, 개인정보 보호 문서 및 웹사이트 파일의 지원 이메일 |
| 플랫폼 | IPHONEOS_DEPLOYMENT_TARGET, TARGETED_DEVICE_FAMILY (iPhone 전용 또는 iPad 포함) |
항목 4의 분석 관련 문구가 리포지토리의 개인정보 처리방침과 일치하는지 확인하십시오. 일치하지 않거나, App Store Connect 앱 개인정보 보호 답변을 확인할 수 없는 경우 플래그를 지정하십시오.
3단계: 기기 및 OS (항목 1)
xcrun devicectl list devices로 페어링된 기기를 표시합니다. 사용자가 사용할 수 있는 자신의 iPhone을 선택하십시오.xcrun devicectl device info details --device <id> | grep -i osVersion으로 iOS 버전을 표시합니다.- 웹에서 최신 iOS 릴리스를 검색하십시오. 휴대폰이 구버전인 경우 알립니다: 사용자는 녹화 전에 설정 → 일반 → 소프트웨어 업데이트에서 업데이트한 다음 버전을 다시 읽습니다. 휴대폰 OS는 사용자가 업데이트해야 합니다.
- 페어링된 휴대폰이 없으면
[iOS 버전]을 남겨두고 사용자에게 확인 위치 (설정 → 일반 → 정보)를 알려주십시오.
4단계: 일반적인 문제 방지
Apple의 일반적인 문제 각각을 확인하고 그 결과를 사용자에게 보고하십시오. 이는 답변의 일부가 아닌 사용자를 위한 확인 사항입니다.
| 가이드라인 | 확인 사항 |
|---|---|
| 2.1 버그 및 크래시 | 녹화는 실제 기기에서 제출된 버전의 TestFlight 빌드를 사용합니다. TARGETED_DEVICE_FAMILY에서 지원되는 플랫폼: iPad가 지원되는 경우 사용자에게 iPad에서도 테스트하도록 알립니다 |
| 2.1 앱 접근 | 로그인 → 데모 자격 증명이 계정 유형당 한 세트씩 App Store Connect에 입력되어 있고 여전히 작동하는지 확인 |
| 2.3.3 스크린샷 | 스토어 스크린샷을 나열하십시오 (예: app-store-assets/*screenshots*). 타이틀 아트, 스플래시 또는 로그인 화면처럼 보이는 것이 있으면 플래그를 지정하십시오 |
| 3.1.1 인앱 구매 | 코드의 모든 제품 ID가 App Store Connect에 구성되어 있고 이 제출에 첨부되어 있는지 확인하십시오. 사용자가 확인할 수 있도록 ID를 나열하십시오 |
| 3.2 기타 비즈니스 모델 | 앱이 하나의 비즈니스, 조직 또는 해당 직원을 위한 것이라면 다른 배포 옵션 (사용자 지정 앱 또는 비공개 배포)이 필요하다는 플래그를 지정하십시오 |
5단계: 파일 작성
app-store-assets/new-app-info.md 폴더가 있으면 해당 위치에, 없으면 ./new-app-info.md에 작성하십시오. 다음 형식을 유지하십시오 (전체 예제는 examples/seven-minute-math/new-app-info.md에 있음):
# App Review 정보 — <앱 이름>
파트 2와 함께 App Store Connect에 답변을 게시하고 녹화를 첨부하십시오. 그런 다음 파트 2를
App Review Information → Notes에 붙여넣어 향후 제출 시에도 사용할 수 있도록 하십시오.
<아직 채워야 할 플레이스홀더(있는 경우).>
## 파트 1 — 화면 녹화 (항목 1; 직접 녹화)
이유: 실제 기기, 최신 OS, 단일 테이크, 정상 속도, 아이콘 탭부터 시작.
설정 (기본값: Mac에서 설치된 릴리스 빌드; 아래 "리뷰 빌드" 참조):
샌드박스 테스터 생성 (App Store Connect → 사용자 및 액세스 → 샌드박스 → 테스트 계정);
휴대폰에서 앱 삭제; 리뷰 빌드를 빌드 및 설치; 제어 센터에서 마이크 꺼진 상태로 화면 녹화;
방해 금지 켜기; 샌드박스 테스터로 Apple 구매 시트에 로그인 ("샌드박스"라고 표시된 시트는 정상).
번호가 매겨진 샷 리스트: 아이콘 탭 → 온보딩 → 종단 간 일반적인 흐름 → 결과 →
적용되는 모든 녹화 조건 (가입, 로그인, 계정 삭제; 게시, 신고, 차단;
페이월, 샌드박스 구매, 잠금 해제된 기능, 구매 복원) → 사용자가 데이터를 삭제하는 방법 → 중지.
빈 화면이 될 모든 화면 (캡처 차단) 및 이유.
## 파트 2 — 답변 (이것을 붙여넣기)
인사말 및 녹화가 이루어진 기기 및 iOS 버전.
**1. 화면 녹화** … **6. 규제 산업 / 제3자 자료**: 각각 굵은 제목 섹션.
지원 이메일로 마무리.
작성:
- §1: 녹화 내용, 적용되지 않는 녹화 조건 및 이유, 빈 화면.
- §2: 대상 사용자, 문제, 앱 해결 방법, 가치. 3~4문장.
- §3: 시작하는 데 필요한 것 (자격 증명은 App Store Connect에 입력, 파일에 절대 입력 금지), 주요 기능을 짧은 목록으로, 무료 및 유료 여부와 페이월이 나타나는 시기.
- §4: 각 서비스의 역할을 설명하는 글머리 기호. 그리고 앱이 사용하지 않는 것 (AI, 데이터 제공자, 인증)에 대한 한 줄 설명 (해당되는 경우).
- §5: 언어 및 지역별 차이점 또는 "모든 지역에서 동일하게 작동".
- §6: 문서, 또는 "해당 사항 없음"과 이유.
- 평이하고 사실적이며 정중하게. 마케팅 언어 사용 금지.
6단계: 종단 간 비디오 (항목 1)
리뷰 빌드
리뷰 중인 정확한 버전의 릴리스 빌드를 Mac에서 바로 휴대폰에 설치하여 녹화하십시오. 여러분이 빌드 및 설치하고 사용자가 녹화합니다.
- 제출된 버전을 고정하십시오. 사용자에게 App Store Connect의 검토 중인 제출에 표시된 버전 및 빌드 번호 (예: 1.0.0 (1))를 물어보십시오 (아직 제공하지 않은 경우). 이를 생성한 커밋을 찾으십시오: 릴리스 태그, 릴리스 또는 메인 브랜치, "App Store에 출시됨"과 같은 커밋 메시지, 또는
pubspec.yaml/Info.plist가 해당 버전 및 빌드를 설정한 커밋. 일치하는 커밋이 두 개일 수 있는 경우 어느 것인지 물어보십시오. 작업 복사본에서 절대 빌드하지 마십시오: 작업 복사본은 종종 Apple이 보지 못한 커밋되지 않은 변경 사항이 있는 기능 브랜치입니다. 대신 격리된 작업 트리에서 빌드하십시오 (git worktree add --detach <scratch>/review-build <commit>). git에서 무시된 키 파일 (예:keys.json)을 읽지 않고cp를 사용하여 복사하십시오. 빌드 중인 커밋과 비디오에 포함되지 않을 최신 브랜치의 내용을 사용자에게 알리십시오. - 프로젝트의 일반적인 기기 빌드 (run 스크립트,
tool/*.sh, Makefile, Fastlane)를 찾으십시오.DUMMY_PURCHASES,MOCK,FAKE,USE_TEST_STORE, RevenueCattest_키 또는 StoreKit 구성 파일과 같이 구매를 시뮬레이션하는 모든 플래그를 제거하십시오. 가짜 구매는 Apple의 시트를 절대 표시하지 않으며, 리뷰어가 유료 기능이 가짜 구매 없이 잠금 해제되는 것을 보면 인앱 구매 회피 (3.1.1)로 간주할 수 있습니다. 접두사만으로 구매 키가 실제 스토어 키인지 확인하십시오 (예:grep -q '"REVENUECAT_IOS_KEY": "appl_'). 키 값을 절대 출력하지 마십시오. - 릴리스 모드로 빌드하십시오. 디버그 모드는 절대 금지: 디버그 Flutter 및 React Native 빌드는 홈 화면 아이콘에서 열 수 없으며, Apple은 녹화가 거기서 시작되기를 원합니다. Flutter:
flutter build ios --release와 프로젝트의 일반적인 정의에서 가짜 정의를 제외한 것. - 빌드된 앱이 제출과 일치하는지 확인하십시오:
/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" -c "Print CFBundleVersion" build/ios/iphoneos/Runner.app/Info.plist가 제출된 버전 및 빌드를 출력해야 합니다. 그렇지 않으면 중지하고 사용자에게 알리십시오. - 사용자에게 먼저 휴대폰에서 앱을 삭제하도록 요청하십시오 (휴대폰의 데이터가 지워지므로 사용자의 결정입니다). 그런 다음 설치:
xcrun devicectl device install app --device <id> build/ios/iphoneos/Runner.app. - Mac에서 설치된 빌드는 Apple의 샌드박스를 통해 구매하므로 사용자는 구매 시트에 로그인하기 위해 샌드박스 테스터가 필요합니다. 동일한 빌드 번호의 TestFlight 설치도 작동하며 (구매는 자체 Apple ID로 무료), Apple이 보유한 정확한 바이너리를 보장합니다. 사용자가 선호하는 경우 사용하십시오.
녹화 및 확인
녹화가 존재하고 확인될 때까지 패키지는 완료되지 않습니다. 사용자가 녹화하고 여러분이 단계별로 안내합니다. 채팅에서 사용자에게 파트 1의 설정 (샌드박스 테스터 포함)과 번호가 매겨진 샷 리스트를 제공하십시오. AirDrop을 사용하여 app-store-assets/review-recording/에 파일을 넣고 완료되면 알리도록 요청하십시오. 그런 다음:
ffprobe -v error -show_entries format=duration:stream=width,height,codec_name -of default=nw=1 <file>. 해상도가 실제 iPhone 화면 (시뮬레이터 창이나 편집된 크롭이 아닌)과 일치하는지, 지속 시간이 전체 흐름을 포함하는지 확인하십시오.- 10초마다 한 프레임씩 콘택트 시트 생성:
ffmpeg -i <file> -vf "fps=1/10,scale=240:-1,tile=8x8" -frames:v 1 <dir>/contact.png. 또한 첫 번째 프레임을 별도로 저장하십시오. 둘 다 읽으십시오. - 순서대로 확인: 첫 번째 프레임이 홈 화면 또는 앱 아이콘을 탭하는 장면을 보여주는지; 모든 샷 리스트 단계가 순서대로 있는지; 녹화 조건이 적용되는 순서대로 있는지; 계정 삭제 (해당되는 경우)가 마지막 작업인지; 녹화가 완전히 중지되었는지.