iOS App Store In-App Purchase 리뷰 지침
이 플러그인의 설치 단계와 전체 마크다운 가이드를 포함한 설정 지시를 복사하세요.
애플의 지침에 주의 깊게 집중하여 인앱 구매 및 구독을 implement하는 경우 앱 스토어에 승인받는 데 필요한 조심스러운 주의가 필요합니다. 이 가이드는 첫 번째 제출에서 검토 통과를 위해 알아야 할 모든 것을 다룹니다.

제출하기 전에
제목이 “제출하기 전에”인 섹션앱 스토어 연결 설정 완료
제목이 “앱 스토어 연결 설정 완료”인 섹션애플이 구매 흐름을 검토하기 전에, 앱 레코드 자체가 완전한지 확인하세요:
- 추가 개인 정보 보호 정책 URL App Store Connect 에서 앱을 등록합니다.
- 추가 지원 URL 사용자에게 실제 연락처 정보를 제공하는 URL
- 앱을 등록할 수 있도록 앱의 연령 등급을 완료하세요. 연령 등급 설문조사 추가
- 앱 리뷰 연락처 정보 및 앱 리뷰어의 명확한 설명 로그인 필요 시 사용자에게 연락처 정보를 제공하세요.
- __CAPGO_KEEP_0__ 리뷰 중인 demo 계정이 만료되지 않습니다.
실제 빌드가 리뷰 중인 현재 스크린샷을 사용하세요.
iPhone의 경우- (6.7인치)가 기본 크기 중 가장 쉬운 크기입니다.
- 앱이 iPad에서 작동하는 경우 iPad 스크린샷도 업로드하세요.
1290 x 2796현재 승인된 대형 iPad 크기는 다음과 같습니다. - __CAPGO_KEEP_0__
- __CAPGO_KEEP_0__
2064 x 2752(13인치)와2048 x 2732(12.9인치) - iPhone 스크린샷을 iPad 지원을 위장하기 위해 늘리지 마세요.
테스트 플라이트에서 리뷰어의 여정을 미리보기 하세요.
테스트 플라이트에서 리뷰어의 여정을 미리보기 하기실제 기기에서 Apple이 따르는 정확한 경로를 실행하세요:
- 테스트 플라이트에서 최신 빌드를 설치하세요.
- 리뷰 계정으로 로그인하세요.
- 숨겨진 제스처나 디버그 메뉴 없이 벽돌에 도달하세요.
- 구매, 복원 및 구독 관리 흐름을 완료하세요.
- 권한이 거부된 경우 앱이 여전히 올바르게 동작하는지 확인하세요.
인앱 구매 요구 사항
구매 요구 사항 섹션 제목가격 투명성 (중요)
가격 투명성 (중요) 섹션 제목애플은 구매 전에 명확한 가격 공개가 필요합니다.
필수 요소:
- 구매 버튼 앞에 정확한 가격을 표시하십시오
- 사용자가 돈을 지불하는 데 무엇을 얻는지 명확하게 밝히십시오
- 요금이 언제 발생하는지 나타내십시오
- 일반적인 거부:
Common Rejection:
:::경고 가격 일관성 모든 가격은 다음에 일치해야 합니다:
모든 가격은 다음에 일치해야 합니다: :::caution Price Consistency All prices must match across:
- 앱 스토어 메타데이터 목록
- 인앱 구매 화면
- 구독 관리 화면
스토어 목록 ($4.99)과 앱 ($5.99) 사이의 $1 차이만 존재해도 자동으로 거절됩니다. :::
구독 플랜 제시
구독 플랜 제시 섹션필수 공개 정보:
- 모든 구독 등급이 함께 표시됩니다
- 등급당 기능 비교가 명확합니다
- 프리미엄 등급으로 자동 전환하는 UI 트릭이 없습니다
- 취소 안내가 쉽게 찾을 수 있습니다

예시: IAP 준수 UI:
import { NativePurchases } from '@capgo/native-purchases';
function SubscriptionScreen() { return ( <div> <h2>Choose Your Plan</h2>
{/* Show all tiers equally */} <PlanCard title="Basic" price="$4.99/month" features={['Feature A', 'Feature B']} /> <PlanCard title="Premium" price="$9.99/month" features={['All Basic', 'Feature C', 'Feature D']} highlighted={false} // Don't force premium />
{/* Clear cancellation info */} <Text> Cancel anytime in Settings > Subscriptions. No refunds for partial periods. </Text> </div> );}구매를 복원
구매를 복원하는 제목필수 구현:
IAP를 사용하는 모든 앱은 사용자가 이전 구매를 복원할 수 있는 방법을 제공해야 합니다. 사용자가 지원에 연락하지 않고.
import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
async function restorePurchases() { try { await NativePurchases.restorePurchases();
const { purchases } = await NativePurchases.getPurchases({ productType: PURCHASE_TYPE.SUBS, });
const activeSub = purchases.find( (purchase) => purchase.isActive && purchase.expirationDate, );
if (activeSub) { unlockPremiumFeatures(); showMessage('Purchases restored successfully!'); return; }
const { purchases: iaps } = await NativePurchases.getPurchases({ productType: PURCHASE_TYPE.INAPP, }); const hasIap = iaps.some((purchase) => purchase.productIdentifier === 'premium_unlock');
showMessage( hasIap ? 'Premium purchase restored!' : 'No previous purchases found.', ); } catch (error) { showError('Failed to restore purchases. Please try again.'); }}
// Add a visible "Restore Purchases" button<Button onClick={restorePurchases}> Restore Purchases</Button>거부 사유:
구매를 복원하는 제목1. 앱이 충돌하거나 기능이 깨진다.
1. 앱이 충돌하거나 기능이 깨진다:왜 실패하는가:
- 앱이 시작할 때 충돌합니다.
- 구매 흐름이 완료되지 않습니다.
- 스크린샷에 표시된 기능이 작동하지 않습니다.
예방책:
- 실제 기기에서 테스트하세요 (시뮬레이터만 테스트하지 마세요).
- 모든 구독 흐름을 종단에서 종단으로 테스트하세요.
- 수취인 확인이 작동하는지 확인하세요.
- 네트워크 오류 처리를 확인하세요.
2. 메타데이터 불일치:
제목이 "2. 메타데이터 불일치"인 섹션왜 실패하는가:
- 스크린샷은 현재 빌드에 없는 기능을 보여주고 있습니다.
- 설명에는 존재하지 않는 기능을 언급하고 있습니다.
- 메타데이터에 있는 가격이 앱 내 가격과 다릅니다.

예방:
// Document exactly what's in each tierconst SUBSCRIPTION_FEATURES = { basic: ['Ad-free', 'Cloud sync', 'Basic themes'], premium: ['Ad-free', 'Cloud sync', 'All themes', 'Priority support']};
// Use these in both your app AND App Store description3. 권한 설명이 부족한 이유
제목이 “3. 권한 설명이 부족한 이유”인 섹션왜 실패하는가:
- 카메라/위치/건강 정보 요청을 설명하지 않고 요청하는 경우
- 권한 요청이 여러 화면 깊이에 묻혀 있는 경우
- 권한 설명이 모호하거나 일반적인 경우
예방:
업데이트 하세요 Info.plist 명확한 설명과 함께
<key>NSCameraUsageDescription</key><string>Camera access is needed to scan product barcodes for quick subscription upgrades.</string>
<key>NSLocationWhenInUseUsageDescription</key><string>Location helps us show relevant local content in your Premium subscription.</string>4. 유도적 마케팅
제목이 ‘4. 유도적 마케팅’인 섹션왜 실패하는가:
- ‘세계 1위 앱’이라는 주장과 증거가 없는 경우
- ‘무제한’ 기능이 실제로는 제한된 경우
- ‘마감 임박’ 전략 (‘마지막 2개만!’ 등)


예방 조치:
- 사실적인 설명을 위해 구체적이고 사실적인 설명을 사용하세요
- 증거가 없는 최고의 등급을 피하세요
- 사용자에게 가짜 부족감으로 압박하지 마세요
5. 숨겨진 취소 처리
제목 "5. 숨겨진 취소 처리"실패의 이유:
- 취소 방법에 대한 언급이 없음
- 취소 버튼이 숨겨져 있거나 가려져 있음
- 애플의 네이티브 흐름 없이 다단계 취소 처리
__CAPGO_KEEP_0__
// Always inform users about cancellationfunction SubscriptionInfo() { return ( <div> <h3>How to Cancel</h3> <ol> <li>Open iPhone Settings</li> <li>Tap your name at the top</li> <li>Tap Subscriptions</li> <li>Select this app and tap Cancel</li> </ol>
<p>Or manage directly in the App Store app.</p>
<Button onClick={openSubscriptionManagement}> Manage Subscription in Settings </Button> </div> );}
async function openSubscriptionManagement() { // Direct link to iOS subscription management await NativePurchases.showManageSubscriptions();}개인정보 보호 및 데이터 사용(5.1.1)
개인정보 보호 및 데이터 사용(5.1.1) 섹션애플은 2025년에 개인정보 보호 요구 사항을 엄격하게 강화했습니다.
필수 공개
모든 권한에 대해:왜 필요한가 (특정 사용 사례)
- 사용될 때
- 데이터가 저장/공유되는 방식
- 선택적이거나 필수적인지 여부
- __CAPGO_KEEP_1__
예시: 올바른 권한 흐름
권한 흐름 예시 섹션async function requestCameraPermission() { // Show explanation BEFORE requesting await showDialog({ title: 'Camera Access', message: 'We need camera access to let you scan barcodes for quick product lookup. Your photos are never uploaded or stored.', buttons: ['Not Now', 'Allow'] });
// Then request permission const result = await Camera.requestPermissions(); return result.camera === 'granted';}개인 정보 영양 표
개인 정보 영양 표 섹션앱 스토어 개인 정보 표에 정확히 반영되어야 하는 항목은 다음과 같습니다.
- 구매 기록 수집
- 영수증을 받을 이메일 주소
- 사기 방지에 사용되는 기기 ID
- 분석을 위한 사용 데이터
2025년 개인 정보 표가 정확하지 않아 앱 제출이 거절되는 경우가 많습니다. 데이터 수집을 신중히 검토하세요.
제출 전 체크리스트
제출 전 체크리스트 섹션
-
모든 구매 흐름을 테스트하세요
- 각 구독 등급을 구매하여 테스트하세요
- 무료 시범 기간을 테스트하세요
- 초기 제안이 올바르게 적용되는지 확인하세요
- 구매를 복원 테스트하세요
- 가족 공유 기능이 활성화된 경우 가족 공유를 확인하세요
- 다양한 기기에서 테스트하세요
-
가격 일관성을 확인하세요
- 앱 스토어 메타데이터가 인앱 가격과 일치하는지 확인하세요
- 모든 통화가 올바른지 확인하세요
- 자유试用 기간이 설명과 일치하는지 확인합니다.
- 소개ductory 제안 조건이 정확한지 확인합니다.
-
모든 복사본을 검토합니다.
- 장치 텍스트를 제거합니다.
- 증명이 테스트 가능하다는 것을 확인합니다.
- 문법과 철자가 정확한지 확인합니다.
- 설명이 현재 빌드와 일치하는지 확인합니다.
- 경쟁사 언급을 제거합니다.
-
권한을 테스트합니다.
- 필요한 권한만 요청합니다.
- 권한 요청 전에 명확한 설명을 제공합니다.
- “거부” 흐름을 테스트합니다 (앱이 여전히 작동해야 함)
- Info.plist 설명이 명확한지 확인합니다.
-
테스트 계정 준비
- 리뷰 중에 유효한 리뷰 계정을 만듭니다.
- 앱 리뷰 정보에서 로그인 자격 증명을 문서화합니다.
- 리뷰어는 결제 WALL을 확인하고 구매 흐름을 완료할 수 있는지 확인합니다.
- 필요한 경우 Notes field에 추가 계정 또는 앱 전용 Switch를 포함합니다.
-
메타데이터 확인
- 스크린샷이 현재 UI와 일치하는지 확인합니다.
- 지원 URL에 실제 연락처 정보가 포함되어 있는지 확인합니다.
- 개인 정보 보호 정책 URL이 채워져 있는지 확인합니다.
- 빌드 내의 콘텐츠와 일치하는 앱 등급이 있는지 확인합니다.
- 앱 프리뷰 비디오(있을 경우)가 현재 버전을 보여주는지 확인합니다.
- __CAPGO_KEEP_0__
- __CAPGO_KEEP_0__
-
상세 리뷰 노트를 작성하세요
Contact:Name: Jane DeveloperEmail: review@yourapp.comPhone: +1 555-0100Test Account:Email: reviewer@test.comPassword: TestPass123!This account does not expire during review.Testing Instructions:1. Log in with test account above2. Tap "Upgrade to Premium" button3. Select "Monthly Premium" subscription4. Complete purchase (no charge in sandbox)5. Verify premium features unlockNote: Subscription pricing is clearly shown before purchase.Cancellation instructions are in Settings > Account.
리뷰 타임라인
리뷰 타임라인
표준 리뷰: 24-48시간 피크 기간: 앱 스토어 휴일 출시: 3-5일 주말: 리뷰가 처리되지 않았습니다. 급여 리뷰: 중요한 버그 수정에 사용할 수 있습니다 (App Store Connect에서 요청)
App Store Connect에서 보게 될 일반적인 상태:
Waiting for ReviewIn ReviewPending Developer ReleaseRejected
2026 제출 초점
제목: 2026 제출 초점현재 초점 분야
제목: 현재 초점 분야1. 구독 명확성
- 동일한 플랜 비교가 필요합니다.
- 비용이 저렴한 옵션을 숨기는 '암흑 패턴'이 없습니다.
- 다운그레이드/업그레이드 경로가 명확합니다.
2. 메타데이터 정확도
- 스크린샷은 검토 중인 빌드와 일치해야 합니다.
- 아이패드 지원이 활성화된 경우 아이패드 스크린샷이 필요합니다.
- 제출 전 지원 URL 및 개인 정보 정책이 이미 활성화되어야 합니다.
3. 개인 정보 및 검토 세부 정보 품질
- SDK가 실제로 수집하는 개인 정보와 일치하는 개인 정보 공개가 필요합니다.
- 앱 리뷰 연락처 정보 및 메모는 첫 번째 제출 시 완전해야 합니다.
- 데모 자격 증명은 검토 기간 동안 유효해야 합니다.
4. 제출 준비
- 애플은 최소 SDK 요구 사항을 정기적으로 업데이트하므로 현재 마감일을 확인하기 전에 릴리스 빌드를 업로드하기 전에
- TestFlight은 제출하기 전에 정확한 리뷰어 경로를 확인하기에 가장 안전한 곳입니다.
네이티브 구매 플러그인에 대한 최선의 방법
네이티브 구매 플러그인에 대한 최선의 방법적절한 오류 처리를 구현하세요.
적절한 오류 처리를 구현하세요.import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
async function handlePurchase(productId: string) { try { const transaction = await NativePurchases.purchaseProduct({ productIdentifier: productId, productType: PURCHASE_TYPE.SUBS, });
// Success await validateReceiptOnServer(transaction.receipt); showSuccess('Subscription activated!'); unlockFeatures();
} catch (error: any) { // Handle specific error cases if (error.code === 'USER_CANCELLED') { // User cancelled - don't show error console.log('Purchase cancelled by user'); } else if (error.code === 'PAYMENT_PENDING') { showInfo('Payment is pending. Please check back later.'); } else if (error.code === 'PRODUCT_ALREADY_PURCHASED') { // Restore instead await NativePurchases.restorePurchases(); } else { // Show user-friendly error showError('Unable to complete purchase. Please try again.'); } }}로딩 상태를 표시하세요.
로딩 상태를 표시하세요.function PurchaseButton({ productId }: { productId: string }) { const [loading, setLoading] = useState(false);
const handlePurchase = async () => { setLoading(true); try { await NativePurchases.purchaseProduct({ productIdentifier: productId }); } finally { setLoading(false); } };
return ( <button onClick={handlePurchase} disabled={loading}> {loading ? 'Processing...' : 'Subscribe Now'} </button> );}약관을 명확하게 표시하세요.
약관을 명확하게 표시하세요.function SubscriptionTerms() { return ( <div className="terms"> <p> Subscription automatically renews unless cancelled at least 24 hours before the end of the current period. </p> <p> Your account will be charged for renewal within 24 hours prior to the end of the current period. </p> <p> Subscriptions may be managed by the user and auto-renewal may be turned off in Account Settings after purchase. </p> <p> <a href="/terms">Terms of Service</a> | <a href="/privacy">Privacy Policy</a> </p> </div> );}애플에서 앱을 거부하면
애플에서 앱을 거부하는 경우해결 방법
해결 방법-
거부 사유를 읽어보세요
- 특정 가이드라인을 확인하세요 (예: 3.1.1, 5.1.1)
- 애플이 무엇을 문제로 지적했는지 정확히 이해하세요
-
문제를 완전히 해결하세요
- 단순히 패치하지 말고根本적인 문제를 해결하세요
- 수정한 것을 철저히 테스트하세요
- 수정한 것을 문서화하세요
-
__CAPGO_KEEP_0__
Thank you for your feedback. I have addressed the issue:Issue: Subscription pricing not clear upfrontFix: Added explicit pricing display on subscription selectionscreen showing "$9.99/month" before purchase button. Also addedcancellation instructions on the same screen.The changes are in this submission and can be tested using theprovided test account. -
__CAPGO_KEEP_2__
- __CAPGO_KEEP_3__
- __CAPGO_KEEP_4__
__CAPGO_KEEP_5__
__CAPGO_KEEP_6____CAPGO_KEEP_7__

- __CAPGO_KEEP_9__
- __CAPGO_KEEP_10__
- __CAPGO_KEEP_11__
- 특정 지침에 대한 참조
- 요구 사항을 충족하는 방법에 대한 설명
- 전문적이고 사실적인
- 기능이 찾기 어려울 때 테스트 계정 포함

추가 리소스
추가 리소스 섹션지원
‘지원’ 섹션문제가 해결되지 않는 경우:
- ‘Native Purchases’ 문서를 검토하세요 일반적인 문제 해결 방법을 확인하세요
- 애플 개발자 지원 센터로 연락하세요 전문가의 도움이 필요하세요?
- 앱 리뷰에 어려움을 겪거나 개인화된 지원이 필요하세요?
‘전문가의 도움이 필요하세요?’ 섹션
‘전문가의 도움이 필요하세요?’ 섹션‘전문가의 도움이 필요하세요?’ 섹션 __CAPGO_KEEP_0__ __CAPGO_KEEP_1__
- __CAPGO_KEEP_2__
- __CAPGO_KEEP_3__
- __CAPGO_KEEP_4__
- __CAPGO_KEEP_5__
- __CAPGO_KEEP_6__
__CAPGO_KEEP_7__