iOS App Store Review 지침 IAP
이 플러그인의 설치 단계와 전체 마크다운 가이드를 포함한 설정 지시를 복사하세요.
애플의 지침에 주의 깊게 주의해야 하는 앱 스토어 승인에 필요한 모든 것을 다룹니다. 특히 인앱 구매 및 구독을 implement하는 경우.

제출하기 전에
제목이 “제출하기 전에”인 섹션앱 스토어 연결 설정 완료
제목이 “앱 스토어 연결 설정 완료”인 섹션애플이 구매 흐름을 검토하기 전에, 앱 레코드 자체가 완전한지 확인하세요:
- 추가 개인 정보 보호 정책 URL App Store Connect에서 앱을 등록합니다.
- 추가 지원 URL 사용자에게 실제 연락처 정보를 제공하는 URL입니다.
- 앱을 등록할 수 있도록 앱의 연령 등급을 완료하세요. 연령 등급 설문조사 추가
- 앱 리뷰 연락처 정보 및 앱 리뷰어의 명확한 주석 로그인이 필요할 경우 사용자에게 제공해야 하는
- __CAPGO_KEEP_0__ __CAPGO_KEEP_0__
실제 빌드가 검토 중인 현재 스크린샷을 사용하세요
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 지원을 위장하기 위해 늘리지 마세요
TestFlight에서 리뷰어의 여정을 시뮬레이션하세요
TestFlight에서 리뷰어의 여정을 시뮬레이션하세요실제 기기에서 Apple이 따르는 정확한 경로를 실행하세요:
- TestFlight에서 최신 빌드를 설치하세요
- 리뷰 계정으로 로그인하세요(리뷰를 제공할 계획에 따라)
- 가려진 제스처나 디버그 메뉴 없이 결제 벽을 도달하세요
- 구매, 복원 및 구독 관리 흐름을 완료하세요
- 권한이 거부된 경우 앱이 여전히 올바르게 동작하는지 확인하세요
In-App 구매 요구 사항
Section titled “구매 내역 요구 사항”가격 투명성 (중요)
Section titled “가격 투명성 (중요)”애플은 구매 전 crystal-clear 가격 공개를 요구합니다.
필수 요소:
- 구매 버튼 앞에 정확한 가격을 표시하세요
- 청구 주기 (예: “월 $9.99”)를 표시하세요
- 돈을 주고 받는 것에 대한 명확한 설명을 하세요
- 청구가 언제 발생하는지 나타내세요
일반적인 거부 사유:
“구독 가격은 명확하고 사전에 알려져야 합니다.”
:::caution 가격 일관성 모든 가격은 다음에 일치해야 합니다:
- 앱 스토어 메타데이터 목록
- 인앱 구매 화면
- 구독 관리 화면
스토어 목록 ($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. 권한 설명이 누락된 이유
권한 설명이 누락된 이유:카메라/위치/건강 정보를 요청하는 이유가 설명되지 않음
- 권한 요청이 여러 화면 깊이에 묻혀 있음
- 권한 설명이 모호하거나 일반적임
- __CAPGO_KEEP_0__
예방:
업데이트하세요 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. 유도적 마케팅”인 섹션Why It Fails:
- 증명되지 않은 “세계 1위 앱”과 같은 주장
- 숨겨진 제한이 있는 “무제한” 기능
- 위기감을 유도하는 속임수 (“마지막 2개만 남았습니다!”)


예방책:
- 사실적이고 구체적인 설명을 유지하세요
- 증거가 없는 최고의 등급을 피하세요
- 사용자에게 가짜 부족감으로 압박하지 마세요
5. 숨겨진 취소 프로세스
제목 "5. 숨겨진 취소 프로세스"실패의 이유:
- 취소 방법에 대한 언급이 없음
- 애플의 네이티브 흐름과 다른 취소 버튼
- Apple의 네이티브 흐름과 다른 여러 단계 취소 프로세스
예방:
// 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_0__
예시: 올바른 권한 흐름
권한 흐름 예시 섹션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 제안 조건이 정확한지 확인합니다.
-
모든 복사본을 검토합니다.
- 장치 텍스트를 제거합니다.
- 증명이 테스트 가능한지 확인합니다.
- 문법과 철자가 정확한지 확인합니다.
- 설명이 현재 빌드와 일치하는지 확인합니다.
- 경쟁사 언급을 제거합니다.
-
권한을 테스트합니다.
- 필요한 권한만 요청합니다.
- 권한 요청 전에 명확한 설명을 제공합니다.
- “거부” 흐름을 테스트합니다 (앱은 여전히 작동해야 함)
- __CAPGO_KEEP_0__ 설명이 명확한지 확인하십시오.
-
__CAPGO_KEEP_1__ 테스트 계정 준비
- __CAPGO_KEEP_2__ 검토를 위해 유효한 계정을 생성하세요.
- __CAPGO_KEEP_3__ App Review 정보에 로그인 자격 증명 문서화
- __CAPGO_KEEP_4__ 검토자가 결제 WALL을 접근하고 구매 흐름을 완료할 수 있는지 확인하십시오.
- __CAPGO_KEEP_5__ 필요에 따라 Notes field에 추가 계정 또는 앱 전용 Switch를 포함하세요.
-
__CAPGO_KEEP_6__ Metadata 확인
- __CAPGO_KEEP_7__ 현재 UI와 일치하는 스크린샷 확인
- __CAPGO_KEEP_8__ Support URL에 실제 연락처 정보가 포함되어 있는지 확인하십시오.
- __CAPGO_KEEP_9__ Privacy policy URL이 채워져 있는지 확인하십시오.
- __CAPGO_KEEP_10__ 앱의 내용과 일치하는 Age rating이 있는지 확인하십시오.
- __CAPGO_KEEP_11__ 앱 프리뷰 비디오(있을 경우)가 현재 버전을 보여주는지 확인하십시오.
- 기능을 정확하게 설명합니다.
- 앱 내에서 및 스토어 목록에서 접근할 수 있는 개인 정보 보호 정책입니다.
-
상세 리뷰 노트를 작성하세요.
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 요구 사항을 정기적으로 업데이트하므로 현재 마감일을 확인하기 전에 릴리스 빌드를 업로드하기 전에
- 테스트 플라이트는 제출하기 전에 정확한 리뷰어 경로를 확인하는 가장 안전한 곳입니다
네이티브 구매 플러그인에 대한最佳 관행
네이티브 구매 플러그인에 대한最佳 관행적절한 오류 처리를 구현하십시오
적절한 오류 처리를 구현하십시오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> );}약관을 명확하게 표시하십시오
Section titled “Show Terms Clearly”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)
- 애플이 무엇을 문제로 지적했는지 정확히 이해하세요
-
문제를 완전히 고치세요
- 단순히 패치하지 말고根本적인 문제를 고치세요
- 고친 내용을 철저히 테스트하세요
- 변경한 내용을 문서화하세요
-
해결에 대한 센터에서 응답하십시오
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시간 이내
소송 절차
소송 절차만약 거절이 잘못된 것이라면:

- 앱 스토어 연결에서 "소송"을 클릭하십시오
- rõ ràng한 증거를 제공하십시오:
- 준수하는 화면샷
- 특정 지침에 대한 참조
- 요구 사항을 충족하는 방법에 대한 설명
- 전문적이고 사실적인
- 기능이 찾기 어려울 때 테스트 계정 포함

추가 리소스
추가 리소스 섹션지원
‘지원’ 섹션문제가 해결되지 않는 경우:
- ‘Native Purchases’ 문서를 검토하세요 일반적인 문제 해결 방법을 확인하세요
- 애플 개발자 지원 센터로 연락하세요 전문가의 도움이 필요하세요?
- 앱 리뷰에 어려움을 겪거나 개인화된 지원이 필요하세요?
‘전문가의 도움이 필요하세요?’ 섹션
‘전문가의 도움이 필요하세요?’ 섹션‘전문가의 도움이 필요하세요?’ 섹션 Capgo 팀과 상담 전화 예약 다음과 관련된 전용 지원을 위해:
- IAP 구현 검토 및 최적화
- 앱 스토어 리뷰 준비 및 전략
- 제출 확인 목록 검토
- 반려 해결 및 항소
- 완전한 테스트 및 검증
Capgo 전문가들은 수백 개의 앱이 리뷰 통과에 성공했습니다!
iOS App Store Review Guidelines for IAP에서 계속하기
iOS App Store Review Guidelines for IAP에서 계속하기이미 사용 중인 경우: iOS App Store Review Guidelines for IAP 스토어 승인 및 배포를 계획하고 연결하세요. @capgo/native-purchases를 사용하여 native capability을 사용하는 @capgo/native-purchases의 경우 @capgo/capacitor-in-app-review의 implementation detail을 참조하세요. @capgo/capacitor-in-app-review를 사용하여 native capability을 사용하는 @capgo/capacitor-in-app-review의 경우 @capgo/capacitor-native-market을 참조하세요. native capability을 사용하는 @capgo/capacitor-native-market의 경우 @capgo/capacitor-native-market의 implementation detail을 참조하세요. @capgo/capacitor-native-market를 사용하여 native capability을 사용하는 @capgo/capacitor-native-market의 경우.