내용으로 건너뛰기

iOS App Store Review 지침 IAP

GitHub

애플의 지침에 주의 깊게 주의해야 하는 앱 스토어 승인에 필요한 모든 것을 다룹니다. 특히 인앱 구매 및 구독을 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에서 최신 빌드를 설치하세요
  • 리뷰 계정으로 로그인하세요(리뷰를 제공할 계획에 따라)
  • 가려진 제스처나 디버그 메뉴 없이 결제 벽을 도달하세요
  • 구매, 복원 및 구독 관리 흐름을 완료하세요
  • 권한이 거부된 경우 앱이 여전히 올바르게 동작하는지 확인하세요

애플은 구매 전 crystal-clear 가격 공개를 요구합니다.

필수 요소:

  • 구매 버튼 앞에 정확한 가격을 표시하세요
  • 청구 주기 (예: “월 $9.99”)를 표시하세요
  • 돈을 주고 받는 것에 대한 명확한 설명을 하세요
  • 청구가 언제 발생하는지 나타내세요

일반적인 거부 사유:

“구독 가격은 명확하고 사전에 알려져야 합니다.”

:::caution 가격 일관성 모든 가격은 다음에 일치해야 합니다:

  • 앱 스토어 메타데이터 목록
  • 인앱 구매 화면
  • 구독 관리 화면

스토어 목록 ($4.99)과 앱 ($5.99) 사이에 $1의 불일치가 발생하면 자동으로 거절됩니다. :::

구독 플랜 제시

구독 플랜 제시 섹션

필수 공개 정보:

  • 모든 구독 계층이 함께 표시됩니다
  • 계층당 기능 비교가 명확합니다
  • 프리미엄 계층에 대한 UI 트릭으로 자동으로 전환하지 않습니다
  • 취소 지침이 쉽게 찾을 수 있습니다

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. 앱이 충돌하거나 기능이 깨져 있는 경우 제목

왜 실패하는가:

  • 앱이 실행 시 충돌합니다.
  • 구매 흐름이 완료되지 않습니다.
  • 스크린샷에 표시된 기능이 작동하지 않습니다.

예방책:

  • 실제 기기에서 테스트하세요 (시뮬레이터만 테스트하지 마세요).
  • 모든 구독 흐름을 종단에서 종단으로 테스트하세요.
  • 수취인 확인이 작동하는지 확인하세요.
  • 네트워크 오류 처리를 확인하세요.

왜 실패하는가:

  • 스크린샷은 현재 빌드에 없는 기능을 보여주고 있습니다
  • 설명에는 존재하지 않는 기능을 언급하고 있습니다
  • 메타데이터에 있는 가격이 앱 내 가격과 다릅니다

메타데이터 체크리스트

예방책:

// Document exactly what's in each tier
const 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 description

3. 권한 설명이 누락된 이유

권한 설명이 누락된 이유:

카메라/위치/건강 정보를 요청하는 이유가 설명되지 않음

  • 권한 요청이 여러 화면 깊이에 묻혀 있음
  • 권한 설명이 모호하거나 일반적임
  • __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>

Why It Fails:

  • 증명되지 않은 “세계 1위 앱”과 같은 주장
  • 숨겨진 제한이 있는 “무제한” 기능
  • 위기감을 유도하는 속임수 (“마지막 2개만 남았습니다!”)

설명 지침 예시

추가 설명 지침

예방책:

  • 사실적이고 구체적인 설명을 유지하세요
  • 증거가 없는 최고의 등급을 피하세요
  • 사용자에게 가짜 부족감으로 압박하지 마세요

5. 숨겨진 취소 프로세스

제목 "5. 숨겨진 취소 프로세스"

실패의 이유:

  • 취소 방법에 대한 언급이 없음
  • 애플의 네이티브 흐름과 다른 취소 버튼
  • Apple의 네이티브 흐름과 다른 여러 단계 취소 프로세스

예방:

// Always inform users about cancellation
function 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년에 개인정보 보호 요구 사항을 엄격히 강화했습니다.

왜 필요한가 (특정 사용 사례)

  1. 사용될 때
  2. 데이터가 저장/공유되는 방식
  3. 선택적이거나 필수적인지 여부
  4. __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년 개인 정보 영양 표 오류는 일반적인 거절 사유입니다. 데이터 수집을 신중히 감사하세요.

제출 전 체크리스트

제출 전 체크리스트

제출 전 체크리스트

  1. 구매 흐름을 모두 테스트하세요

    • 각 구독 등급을 구매하여 테스트하세요
    • 무료 시범 기간을 테스트하세요
    • 초기 제안이 올바르게 적용되는지 확인하세요
    • 구매를 복원하는지 테스트하세요
    • 가족 공유 기능이 활성화된 경우 가족 공유를 테스트하세요
    • 다양한 기기에서 테스트하세요
  2. 가격 일관성을 확인하세요

    • 앱 스토어 메타데이터가 인앱 가격과 일치하는지 확인하세요
    • 모든 통화가 올바른지 확인하세요
    • 자유试用 기간이 설명과 일치하는지 확인합니다.
    • 소개ductory 제안 조건이 정확한지 확인합니다.
  3. 모든 복사본을 검토합니다.

    • 장치 텍스트를 제거합니다.
    • 증명이 테스트 가능한지 확인합니다.
    • 문법과 철자가 정확한지 확인합니다.
    • 설명이 현재 빌드와 일치하는지 확인합니다.
    • 경쟁사 언급을 제거합니다.
  4. 권한을 테스트합니다.

    • 필요한 권한만 요청합니다.
    • 권한 요청 전에 명확한 설명을 제공합니다.
    • “거부” 흐름을 테스트합니다 (앱은 여전히 작동해야 함)
    • __CAPGO_KEEP_0__ 설명이 명확한지 확인하십시오.
  5. __CAPGO_KEEP_1__ 테스트 계정 준비

    • __CAPGO_KEEP_2__ 검토를 위해 유효한 계정을 생성하세요.
    • __CAPGO_KEEP_3__ App Review 정보에 로그인 자격 증명 문서화
    • __CAPGO_KEEP_4__ 검토자가 결제 WALL을 접근하고 구매 흐름을 완료할 수 있는지 확인하십시오.
    • __CAPGO_KEEP_5__ 필요에 따라 Notes field에 추가 계정 또는 앱 전용 Switch를 포함하세요.
  6. __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__ 앱 프리뷰 비디오(있을 경우)가 현재 버전을 보여주는지 확인하십시오.
    • 기능을 정확하게 설명합니다.
    • 앱 내에서 및 스토어 목록에서 접근할 수 있는 개인 정보 보호 정책입니다.
  7. 상세 리뷰 노트를 작성하세요.

    Contact:
    Name: Jane Developer
    Email: review@yourapp.com
    Phone: +1 555-0100
    Test Account:
    Email: reviewer@test.com
    Password: TestPass123!
    This account does not expire during review.
    Testing Instructions:
    1. Log in with test account above
    2. Tap "Upgrade to Premium" button
    3. Select "Monthly Premium" subscription
    4. Complete purchase (no charge in sandbox)
    5. Verify premium features unlock
    Note: 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 Review
  • In Review
  • Pending Developer Release
  • Rejected

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>
);
}

애플에서 앱을 거부한 경우

애플에서 앱을 거부한 경우

해결 방법

해결 방법
  1. 거부 사유를 읽어보세요

    • 특정 가이드라인을 확인하세요 (예: 3.1.1, 5.1.1)
    • 애플이 무엇을 문제로 지적했는지 정확히 이해하세요
  2. 문제를 완전히 고치세요

    • 단순히 패치하지 말고根本적인 문제를 고치세요
    • 고친 내용을 철저히 테스트하세요
    • 변경한 내용을 문서화하세요
  3. 해결에 대한 센터에서 응답하십시오

    Thank you for your feedback. I have addressed the issue:
    Issue: Subscription pricing not clear upfront
    Fix: Added explicit pricing display on subscription selection
    screen showing "$9.99/month" before purchase button. Also added
    cancellation instructions on the same screen.
    The changes are in this submission and can be tested using the
    provided test account.
  4. 급히 다시 제출하십시오

    • 재제출은 일반적으로 빠르게 검토됩니다
    • 보통 24시간 이내

소송 절차

소송 절차

만약 거절이 잘못된 것이라면:

앱 스토어 명확성 절차

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

문서 요청 예시

추가 리소스

추가 리소스 섹션

문제가 해결되지 않는 경우:

‘전문가의 도움이 필요하세요?’ 섹션

‘전문가의 도움이 필요하세요?’ 섹션

‘전문가의 도움이 필요하세요?’ 섹션 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의 경우.