iOS App Store 리뷰 지침: IAP
설치 단계 및 이 플러그인의 전체 마크다운 가이드를 포함하여 설정 지시를 복사합니다.
애플의 지침에 주의 깊게 집중하여 앱 스토어에 앱을 승인하려면, 특히 인앱 구매 및 구독을 implement하는 경우가 많습니다. 이 가이드는 첫 번째 제출을 통과하기 위해 필요한 모든 것을 다룹니다.

제출하기 전에
제목: "제출하기 전에"앱 스토어 연결 설정을 완료하기 전에, 구매 흐름을 검토하기 전에 앱 레코드 자체가 완전한지 확인하세요:
App Store Connect개인 정보 보호 정책 URL
- App Store Connect Add a 앱 스토어 연결에 개인 정보 보호 정책 URL을 추가하세요.
- in App Store Connect 지원 URL __CAPGO_KEEP_0__
- 앱을 출시하기 위해 질문naires를 완료하세요 연령 등급 사용자에게 실제 연락처 정보로 연결되는 URL
- App Review 연락처 정보와 명확한 리뷰어 노트를 추가하세요 리뷰 중에 만료되지 않는 데모 계정을 제공하세요 주의
- 주의 If login is required, provide a demo account that does not expire during review.
실제 빌드가 검토 중인 실제 빌드에서 현재 스크린샷을 사용하십시오.
iPhone의 경우- (6.7인치)는 기본 크기 중 가장 쉬운 크기입니다.
- 앱이 iPad에서 실행되는 경우 iPad 스크린샷도 업로드하십시오.
1290 x 2796현재 허용되는 대형 iPad 크기는 - (13인치)와
- (12.9인치)입니다.
2064 x 2752iPhone 스크린샷을 iPad 지원을 위장하기 위해 늘리지 마십시오.2048 x 2732__CAPGO_KEEP_0__ - __CAPGO_KEEP_0__
__CAPGO_KEEP_0__ 테스트 플라이트에서 리뷰어 여행을 시뮬레이션합니다.
__CAPGO_KEEP_0__ 테스트 플라이트에서 리뷰어 여행을 시뮬레이션합니다.실제 기기에서 Apple이 따르는 정확한 경로를 실행합니다.
- 테스트 플라이트에서 최신 빌드를 설치합니다.
- 리뷰 계정으로 로그인합니다.
- 가려진 제스처나 디버그 메뉴 없이 결제 벽을 도달합니다.
- 구매, 복원 및 구독 관리 흐름을 완료합니다.
- 권한이 거부되더라도 앱이 올바르게 동작하는지 확인합니다.
__CAPGO_KEEP_0__ 인앱 구매 요구 사항입니다.
__CAPGO_KEEP_0__ 인앱 구매 요구 사항입니다.__CAPGO_KEEP_0__ 가격 정보 투명성 (중요합니다).
__CAPGO_KEEP_0__ 가격 정보 투명성 (중요합니다).애플은 구매 전 crystal-clear 가격 공개를 요구합니다.:
필수 요소:
- 구매 버튼 전에 정확한 가격을 표시하십시오.
- billing frequency (예: “$9.99/월”)를 표시하십시오.
- 사용자가 돈을 지불하는 데 무엇을 얻는지 명확하게 밝혀십시오.
- 요금이 언제 발생하는지 나타내십시오.
일반적인 거부:
“Subscription pricing must be clear and upfront.”
:::caution Price Consistency 모든 가격은 다음에 일치해야 합니다:
- App Store metadata listing
- In-app purchase screens
- 구독 관리 화면
1 달러의 차이만 있어도 매출 목록 ($4.99)과 앱 ($5.99) 간의 불일치가 자동으로 거절을 유발합니다. :::
구독 계획 제시
구독 계획 제시 제목필수 공개 정보:
- 모든 구독 계층이 함께 표시됩니다
- 계층당 기능 비교
- 프리미엄 계층에 대한 자동 기본 설정은 UI 트릭을 통해 이루어지지 않습니다
- 취소 안내가 쉽게 찾을 수 있습니다

준수하는 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위 앱” 같은 주장
- “무제한” 기능이 숨겨진 제한이 있는 경우
- 기한이 없는 긴급한 상황을 조장하는 전략


예방책:
- 정확하고 사실적인 설명을 하세요
- 증거가 없는 최고의 표현을 피하세요
- 사용자에게 가짜 부족감을 강요하지 마세요
5. 숨겨진 취소 절차
제목 ‘5. 숨겨진 취소 절차’Why 실패하는 이유:
- 취소 방법에 대한 언급이 없음
- 취소 버튼이 숨겨져 있거나 가려져 있음
- 애플의 네이티브 흐름과 다른 여러 단계의 취소 절차
예방책:
// 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년에 개인 정보 보호 요구 사항을 엄격하게 강화했습니다.
필수 공개
필수 공개모든 권한에 대해:
- 왜 필요한가 (특정 사용 사례)
- 사용할 때
- 데이터가 저장/공유되는 방식
- 선택적이거나 필수적인지 여부
예시: 적절한 권한 흐름
클립보드에 복사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년 개인 정보 영양표 오류는 심사 거부의 일반적인 이유입니다. 데이터 수집을 신중히 검토하세요.
제출 전 검사 목록
제출 전 검사 목록
-
__CAPGO_KEEP_0__
- 각 구독 등급을 구매하세요
- 무료 시범판을 테스트하세요
- 소개 요약이 올바르게 적용되는지 확인하세요
- 구매를 복원하는 것을 테스트하세요
- 가족 공유 기능이 활성화된 경우 모든 가족 구성원에게 적용되는지 확인하세요
- 다양한 기기에서 테스트하세요
-
가격 일관성을 확인하세요
- 앱 스토어 메타데이터가 인앱 가격과 일치하는지 확인하세요
- 모든 통화가 올바른지 확인하세요
- 설명서에 나온 무료 시범판 기간이 정확한지 확인하세요
- 소개 요약 조건이 정확한지 확인하세요
-
모든 복사본을 검토하세요
- 장치에 있는 텍스트를 제거하세요
- 선언이 테스트할 수 있는지 확인하세요
- 문법과 철자가 올바른지 확인하세요
- 설명이 현재 빌드와 일치하는지 확인하세요
- 경쟁사 언급을 제거하세요
-
권한을 테스트하세요
- 필요한 권한만 요청하세요
- 권한을 요청하기 전에 명확한 설명을 보여주세요
- ‘거부’ 흐름을 테스트하세요 (앱은 여전히 작동해야 함)
- Info.plist 설명이 명확한지 확인하세요
-
테스트 계정 준비
- 리뷰를 위해 유효한 리뷰 계정을 생성하세요
- __CAPGO_KEEP_0__ 로그인 자격 증명을 App Review 정보에 문서화합니다.
- __CAPGO_KEEP_0__ 리뷰어에게 도달할 수 있는 지 확인하고 구매 흐름을 완료할 수 있는지 확인합니다.
- __CAPGO_KEEP_0__ 필요 시 Notes field에 추가 계정 또는 앱 전용 Switch를 포함합니다.
-
__CAPGO_KEEP_0__을 확인합니다.
- __CAPGO_KEEP_0__ 현재 UI와 일치하는지 스크린샷을 확인합니다.
- __CAPGO_KEEP_0__에서 실제 연락처 정보를 포함하는지 확인합니다.
- __CAPGO_KEEP_0__이 채워져 있는지 확인합니다.
- __CAPGO_KEEP_0__이 앱의 콘텐츠와 일치하는지 확인합니다.
- __CAPGO_KEEP_0__ (있을 경우) 현재 버전을 보여주는지 확인합니다.
- __CAPGO_KEEP_0__이 기능을 정확하게 설명하는지 확인합니다.
- __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.
__CAPGO_KEEP_1__
__CAPGO_KEEP_2__
__CAPGO_KEEP_4__ __CAPGO_KEEP_5__ __CAPGO_KEEP_6__ __CAPGO_KEEP_7__ __CAPGO_KEEP_8__ __CAPGO_KEEP_9__ __CAPGO_KEEP_10__ __CAPGO_KEEP_11__
__CAPGO_KEEP_0__:
Waiting for ReviewIn ReviewPending Developer ReleaseRejected
2026 제출 초점
제목: "2026 제출 초점"현재 초점 영역
제목: "현재 초점 영역"1. 구독 명확성
- 비교 가능한 요금 계획이 필요합니다.
- 비용이 저렴한 옵션을 숨기지 않는 "암흑 패턴"이 없습니다.
- 다운그레이드/업그레이드 경로가 명확합니다.
2. 메타데이터 정확도
- 스크린샷은 검토 중인 빌드와 일치해야 합니다
- 아이패드 스크린샷은 아이패드 지원이 활성화된 경우 필요합니다
- 제출 전에 지원 URL 및 개인 정보 정책이 이미 활성화되어야 합니다
3. 개인 정보 및 검토 세부 정보 품질
- SDK가 실제로 수집하는 것과 일치하는 개인 정보 공개가 필요합니다
- 앱 검토 연락처 및 메모는 첫 번째 제출 시 완전해야 합니다
- 데모 자격 증명은 검토 기간 동안 유효해야 합니다
4. 제출 준비
- 애플은 최소 SDK 요구 사항을 정기적으로 업데이트하므로 제출할 릴리즈 빌드 전에 현재 마감일을 확인해야 합니다
- 테스트 플라이트는 검토자 경로를 정확하게 검증하기 위해 제출하기 전에 가장 안전한 곳입니다
네이티브 구매 플러그인最佳 관행
Native 구매 플러그인에 대한 최적의 사용 방법적절한 오류 처리를 구현하세요.
오류 처리를 구현하세요.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)
- Apple이 무엇을 문제로 지목했는지 정확히 이해하세요
-
문제를 완전히 고치세요
- 단순히 패치하지 말고根本적인 문제를 고치세요
- 고친 내용을 철저히 테스트하세요
- 변경한 내용을 문서화하세요
-
해결 센터에서 답변하세요
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. -
급히 다시 제출하세요
- 재제출은 일반적으로 빠른 시일 내에 검토됩니다
- 보통 24시간 이내
appeal process
appeal process제출이 거부된 경우 잘못된 거부라고 생각하시면:

- App Store Connect에서 "Appeal"을 클릭하세요
- 명확한 증거를 제공하세요:
- 규정 준수 증거
- 규정에 대한 특정 참조
- 요구 사항을 충족하는 방법에 대한 설명
- 업무적인 태도를 유지하고 사실만 말하세요
- 기능이 찾기 어려울 때 테스트 계정 포함

추가 리소스
추가 리소스 섹션지원
지원 섹션If you’re still having issues:
- Review the Native Purchases 문서를 참조하십시오
- Check 일반적인 문제 해결 방법
- Apple Developer Support으로 연락하여 지침에 대한 설명을 받으십시오
Need Expert Help?
제목이 ‘Need Expert Help?’인 섹션앱 리뷰에 어려움을 겪거나 개인화된 지원이 필요하신가요? 우리 팀과 상담 전화 예약을 하십시오 다음과 같은 전용 지원과 함께:
- IAP 구현 검토 및 최적화
- 앱 스토어 리뷰 준비 전략
- 제출 목록 검토
- 반려 해결 및 항소
- 완전한 테스트 및 검증
우리의 전문가들은 수백 개의 앱이 리뷰 통과에 성공했습니다!
iOS 앱 스토어 리뷰 지침서에서 IAP로 계속 진행하세요
IAP를 위한 iOS 앱 스토어 리뷰 지침서에서 계속 진행하세요__CAPGO_KEEP_0__를 사용하여 iOS 앱 스토어 리뷰 지침서에서 IAP를 사용하여 스토어 승인 및 배포를 계획하고 __CAPGO_KEEP_0__/native-purchases를 사용하여 capgo/native-purchases의 네이티브 기능을 사용하여 capgo/native-purchases를 사용하여 @capgo/capacitor-in-app-review for the implementation detail in @capgo/capacitor-in-app-review, Using @capgo/capacitor-in-app-review for the native capability in Using @capgo/capacitor-in-app-review, @capgo/capacitor-native-market for the implementation detail in @capgo/capacitor-native-market, and Using @capgo/capacitor-native-market for the native capability in Using @capgo/capacitor-native-market.