컨텐츠로 바로가기

iOS 앱 스토어 리뷰 지침에서 IAP

GitHub

애플의 지침을 준수하는 데 주의가 필요하며, 인앱 구매 및 구독을 implement하는 경우 App Store에 앱을 승인받는 것은 매우 중요합니다. 이 가이드는 첫 번째 제출을 통과하기 위해 필요한 모든 것을 다룹니다.

iOS App Store 리뷰 프로세스

__CAPGO_KEEP_0__

__CAPGO_KEEP_1__

__CAPGO_KEEP_2__

  • __CAPGO_KEEP_3__ __CAPGO_KEEP_4__ URL을 App Store Connect에 추가하세요. __CAPGO_KEEP_5__ URL을 App Store Connect에 추가하세요.
  • __CAPGO_KEEP_6__을 완료하여 앱이 출시되도록 하세요. __CAPGO_KEEP_7__ __CAPGO_KEEP_8__
  • __CAPGO_KEEP_9__을 완료하여 앱이 출시되도록 하세요. __CAPGO_KEEP_10__ __CAPGO_KEEP_11__
  • Add 앱 리뷰 연락처 정보 및 리뷰어 노트를 명확하게 하세요
  • 로그인이 필요할 경우, 리뷰 기간 동안 만료되지 않는 데모 계정을 제공하세요 Note
실제 빌드가 리뷰 중인 현재 스크린샷을 사용하여 Prepare Real Screenshots를 준비하세요
  • Prepare Real Screenshots를 준비하세요
  • 아이폰용 1290 x 2796 6.7인치가 가장 쉬운 기본 크기입니다.
  • 아이패드용 앱이면 아이패드 스크린샷도 업로드하세요.
  • 현재 지원하는 큰 아이패드 크기는 2064 x 2752 13인치 2048 x 2732 12.9인치
  • 아이폰 스크린샷을 늘려서 아이패드 지원을 위장하지 마세요.

테스트 플라이트에서 리뷰어의 여정을 시뮬레이션하세요.

제목: 테스트 플라이트에서 리뷰어의 여정을 시뮬레이션하세요.

실제 기기에서 애플이 따르는 정확한 경로를 실행하세요:

  • 테스트 플라이트에서 최신 빌드를 설치하세요.
  • 리뷰를 제공할 계정으로 로그인하세요.
  • __CAPGO_KEEP_0__을 숨겨진 동작이나 디버그 메뉴 없이 paywall에 접근하세요
  • __CAPGO_KEEP_0__ 구매, 복원 및 구독 관리 흐름을 완료하세요
  • __CAPGO_KEEP_0__ 앱이 권한이 거부되더라도 올바르게 동작하는지 확인하세요

In-App Purchase Requirements

__CAPGO_KEEP_1__

Pricing Transparency (Critical)

__CAPGO_KEEP_1__

Apple은 구매 전에 명확한 가격 공개가 필요합니다.

Must-Have Elements:

  • 구매 버튼 앞에 정확한 가격을 표시하세요
  • billing frequency (예: “$9.99/month”)를 표시하세요
  • 돈을 주고 받는 데 대한 사용자에게 명확하게 설명하세요
  • 요금이 발생할 때 알려주세요

일반 거부:

“구독 가격은 명확하고 사전 알림이 있어야 합니다.”

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

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

스토어 목록 ($4.99)과 앱 ($5.99) 사이에 $1의 불일치만으로도 자동 거부가 트리거됩니다. :::

필수 공개 정보:

  • 모든 구독 계층이 함께 표시됩니다
  • 기능별 등급 비교
  • UI를 통해 등급을 자동으로 기본 등급으로 설정하지 않습니다.
  • 취소 지침을 찾기 쉬운 방법

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 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

Why It Fails:

  • 카메라/위치/건강 정보 요청을 설명하지 않고 요청하는 경우
  • 권한 요청이 여러 화면 깊숙이 묻혀 있는 경우
  • 권한 설명이 모호하거나 일반적인 경우

예방:

업데이트하여 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. 숨겨진 취소 절차

왜 실패하는가:

  • 취소 방법을 언급하지 않음
  • 취소 버튼이 숨겨져 있거나 가려져 있음
  • 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년 Apple은 개인정보 요구 사항을 크게 강화했습니다.

모든 권한에 대해:

  1. Why you need it (specific use case)
  2. When it will be used
  3. How data is stored/shared
  4. Whether it’s optional or required

Example: Proper Permission Flow

Example: Proper 권한 흐름
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';
}

앱 스토어 개인 정보 영양 표가 정확히 반영되도록 하세요:

  • 구매 이력 수집
  • 이메일 주소 (영수증을 위해)
  • __CAPGO_KEEP_0__ (위조 방지)
  • __CAPGO_KEEP_0__ (분석을 위한 사용 데이터)

2025년 1차 승인 거부 사유 중 가장 흔한 것은 개인 정보 보호 레이블이 정확하지 않다는 것입니다. 데이터 수집을 신중히 검토하세요.

__CAPGO_KEEP_1__

__CAPGO_KEEP_2__

__CAPGO_KEEP_1__

  1. 모든 구입 흐름을 테스트하세요

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

    • 앱 스토어 메타데이터가 인앱 가격과 일치하는지 확인
    • 모든 통화가 정확한지 확인
    • 무료 시범 기간이 설명과 일치하는지 확인
    • 소개 제안 조건이 정확한지 확인
  3. 모든 복사본을 검토

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

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

    • 리뷰 중에 유효한 리뷰 계정을 생성하십시오
    • 앱 리뷰 정보에 로그인 자격 증명 문서화하십시오
    • 리뷰어는 결제 흐름을 완료할 수 있는지 확인하십시오
    • 필요한 경우 Notes 필드에 추가 계정이나 앱 전용 Switch 포함하십시오
  6. 메타데이터 확인

    • 스크린샷은 현재 UI와 일치하는지 확인하십시오
    • __CAPGO_KEEP_0__ URL에는 실제 연락처 정보가 포함되어 있습니다.
    • __CAPGO_KEEP_0__ 정책 URL이 채워져 있습니다.
    • __CAPGO_KEEP_0__의 콘텐츠와 일치하는 연령 등급이 있습니다.
    • 빌드에 포함된 콘텐츠와 일치하는 현재 버전의 앱 프리뷰 비디오가 표시됩니다.
    • 설명은 기능을 정확하게 설명합니다.
    • 스토어 목록에서 앱으로부터 액세스할 수 있는 개인 정보 보호 정책이 있습니다.
  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.

__CAPGO_KEEP_1__ 리뷰 타임라인

__CAPGO_KEEP_2__: __CAPGO_KEEP_0__ 주말 및 공휴일 __CAPGO_KEEP_1__ 주말 리뷰가 처리되지 않음 급여 처리 중요한 버그 수정에만 사용 가능 (App Store Connect에서 요청)

App Store Connect에서 볼 수 있는 일반적인 상태

  • Waiting for Review
  • In Review
  • Pending Developer Release
  • Rejected

__CAPGO_KEEP_2__

2026 제출 초점

현재 초점 영역

현재 초점 영역

1. 구독 명확성

  • 비교 가능한 구독 플랜
  • 비용이 저렴한 옵션을 숨기지 않는 '암흑 패턴'
  • 다운그레이드/업그레이드 경로가 명확해야 함

2. 메타데이터 정확성

  • 스크린샷은 검토 중인 빌드와 일치해야 함
  • 아이패드 지원이 활성화된 경우 아이패드 스크린샷이 필요함
  • 제출 전에 지원 URL 및 개인 정보 정책이 이미 활성화되어야 함

3. 개인 정보 및 검토 세부 정보 품질

  • SDKs에서 실제로 수집하는 것과 일치하는 개인 정보 공개 내용이 있어야 합니다.
  • 앱 리뷰 연락처 정보 및 메모는 첫 제출 시 완전해야 합니다.
  • 데모 자격증명은 리뷰 기간 동안 유효해야 합니다.

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

로딩 상태를 표시하십시오.

Display Loading States를 표시하는 방법
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>
);
}

애플에서 앱을 거부한 경우

애플에서 앱을 거부한 경우

거부를 해결하는 방법

거부를 해결하는 방법
  1. 거부를 읽어보세요

    • 특정 지침을 확인하세요 (예: 3.1.1, 5.1.1)
    • 정확하게 이해하세요
  2. __CAPGO_KEEP_0__

    • __CAPGO_KEEP_0__
    • __CAPGO_KEEP_0__
    • __CAPGO_KEEP_0__
  3. __CAPGO_KEEP_0__

    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. __CAPGO_KEEP_0__

    • __CAPGO_KEEP_0__
    • 보통 24시간 이내

__CAPGO_KEEP_0__

청구 절차

청구 절차

App Store 확인 절차

  1. App Store Connect에서 'Appeal'을 클릭하세요.
  2. 증명이 명확해야 합니다.
    • 준수하는 화면 캡처
    • 특정 지침에 대한 참조
    • 요구 사항을 충족하는 방법에 대한 설명
  3. 업무적인 사실에 기반한 표현
  4. 기능이 찾기 어려울 때 테스트 계정 포함

문서 요청 예시

추가 자료

추가 자료란

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

전문적인 도움을 필요로 합니까?

전문적인 도움을 필요로 합니까?

앱 리뷰에 어려움을 겪고 있거나 개인화된 지원이 필요하신가요? 팀과 함께 상담 전화 예약하세요. 다음과 같은 전용 지원과 함께:

  • IAP 구현 검토 및 최적화
  • 앱 스토어 리뷰 준비 및 전략
  • 제출 확인 목록 검토
  • 반려 해결 및 항소
  • 완전한 테스트 및 유효성 검사

우리의 전문가들은 수백 개의 앱이 리뷰를 통과하는 데 성공했습니다!

iOS App Store Review Guidelines를 따라서 계속하세요.

Section titled “iOS App Store Review Guidelines를 따라서 계속하세요.”

iOS App Store Review Guidelines를 따라서 계속하세요를 사용하는 경우 iOS App Store Review Guidelines를 따라서 계속하세요 iOS App Store Review Guidelines를 따라서 계속하세요를 계획하고 스토어 승인 및 배포를 위해 연결하세요. @capgo/native-purchases를 사용하여 native capability을 사용하세요. @capgo/native-purchases에서 @capgo/__CAPGO_KEEP_1__-in-app-review를 사용하여 native capability을 사용하세요. @capgo/capacitor-in-app-review를 사용하여 native capability을 사용하세요. @capgo/capacitor-in-app-review에서 @capgo/capacitor-native-market을 사용하세요. @capgo/capacitor-native-market을 사용하여 native capability을 사용하세요. @capgo/capacitor-native-market에서 @capgo/capacitor-in-app-review을 사용하여 native capability을 사용하세요. @capgo/capacitor-native-market에서 @capgo/capacitor-in-app-review을 사용하여 native capability을 사용하세요. implementation 세부 사항은 @capgo/capacitor-native-market 에서 찾을 수 있습니다. Using @capgo/capacitor-native-market native 기능은 Using @capgo/capacitor-native-market 에서 사용할 수 있습니다.