내용으로 건너뛰기

iOS 앱 스토어 리뷰 지침 (In-App Purchase)

GitHub

애플의 지침에 주의 깊게 주의해야 하는 앱 스토어 승인에 필요한 모든 것을 다루는 이 가이드는 첫 번째 제출을 통과하기 위해 필요한 모든 것을 다룹니다.

iOS 앱 스토어 리뷰 프로세스

앱 구매 흐름을 검토하기 전에 앱 레코드 자체가 완전한지 확인하십시오:

  • iOS 앱 스토어 리뷰 앱 스토어 연결에 URL을 추가하세요. 개인 정보 보호 정책 URL
  • iOS 앱 스토어 리뷰 지원 URL 사용자에게 실제 연락처 정보를 제공하는 URL
  • 리뷰 연령 등급을 완료하세요. 앱이 배포 가능하도록 질문naires를 완료하세요.
  • 리뷰 앱 리뷰 연락처 정보 리뷰어의 명확한 설명
  • 로그인 필요 시 demo 계정을 제공하세요. 리뷰 기간 동안 만료되지 않는 demo 계정을 제공하세요.
앱 스토어 목록 메타데이터와 정책 및 지원 링크

실제 스크린샷을 준비하세요.

제목: 실제 스크린샷을 준비하세요.
  • 현재 리뷰 중인 실제 빌드의 스크린샷을 사용하세요.
  • 아이폰의 경우 1290 x 2796 (6.7인치)가 가장 쉬운 기본 크기입니다.
  • 아이패드에서 앱이 작동하는 경우 아이패드 스크린샷도 업로드하세요.
  • 현재 지원하는 큰 iPad 크기는 포함합니다. 2064 x 2752 (13인치)와 2048 x 2732 (12.9인치)
  • iPhone 스크린샷을 늘려서 iPad 지원을 위장하지 마세요.

TestFlight에서 리뷰어의 여정을 Dry-Run하세요.

TestFlight에서 리뷰어의 여정을 Dry-Run하는 제목

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

  • TestFlight에서 최신 빌드를 설치하세요.
  • 리뷰 계정으로 로그인하세요.
  • 숨겨진 동작이나 디버그 메뉴가 없는 상태에서 결제 벽을 도달하세요.
  • 구매, 복원 및 구독 관리 흐름을 완료하세요.
  • 권한이 거부된 경우에도 앱이 올바르게 동작하는지 확인하세요.

앱 내 구매 요구 사항

In-App Purchase Requirements 섹션

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

필수 요소:

  • 구매 버튼 이전에 정확한 가격 표시
  • billing frequency (예: “$9.99/월”) 표시
  • 사용자가 돈을 지불하는 데 대해 명확하게 설명
  • 요금이 언제 발생하는지 나타내

일반적인 거부:

“구독 가격은 명확하고 전면적으로 설명되어야 합니다.”

:::주의 가격 일관성 모든 가격은 다음과 같은 곳에서 일치해야 합니다:

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

스토어 목록 ($4.99)과 앱 ($5.99) 사이에 1달러의 가격 차이만 존재해도 자동으로 거절됩니다. :::

필수 공개 정보:

  • 모든 구독 계층이 함께 표시됩니다.
  • 각 계층의 기능 비교가 명확합니다.
  • 프리미엄 계층에 대한 자동 기본 설정은 UI 트릭을 통해 이루어지지 않습니다.
  • 취소 안내가 쉽게 찾을 수 있습니다.

UI 디자인의 규칙과 금기

구매 복원 및 법적 링크와 함께 paywall

예시: 합법적인 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. 앱이 충돌하거나 기능이 깨진다

왜 실패하는가?:

  • 앱이 실행 시에 충돌한다
  • 구매 흐름이 완료되지 않는다
  • 스크린샷에 나온 기능이 작동하지 않는다

Prevention:

  • 실기기(시뮬레이터가 아닌)에서 테스트한다
  • 구독 흐름을 종단까지 테스트한다
  • 받은 금액을 확인한다
  • 네트워크 오류 처리를 확인한다

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

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>

왜 실패하는가:

  • 증명이 없는 “세계에서 #1 앱”과 같은 주장
  • 숨겨진 제한이 있는 “무제한” 기능
  • 가짜 긴급성 전략 ('마지막 2 개의 자리만!' )

설명 지침 예시

추가 설명 지침

예방책:

  • 설명에서 구체적이고 사실적인 것을 강조하라
  • 증거가 없는 초월적인 표현을 피하라
  • 사용자에게 가짜 부족감을 강요하지 마라

5. 숨겨진 취소 절차

제목 '5. 숨겨진 취소 절차'

실패하는 이유:

  • 취소 방법에 대한 언급이 없음
  • 취소 버튼이 숨겨져 있거나 가려져 있음
  • 애플의 네이티브 흐름 없이 다단계 취소 프로세스

예방 조치:

// 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. 그것이 선택적이거나 필수적일지 여하에 관계없이

예시: 적절한 권한 흐름

예시: 적절한 권한 흐름
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년 개인 정보 표가 정확하지 않아 반려 사유가 되는 경우가 많습니다. 데이터 수집을 신중히 검토하세요.

Pre-제출 확인 목록

제목: Pre-제출 확인 목록

Pre-제출 확인 목록

  1. 모든 구매 흐름 테스트

    • 각 구독 등급 구매
    • 무료 시범 기간 테스트
    • 소개 요약이 올바르게 적용되는지 확인
    • 구매내역 복원 테스트
    • 가족 공유 기능이 올바르게 작동하는지 확인(사용 중)
    • 다양한 기기에서 테스트
  2. 가격 일관성 확인

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

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

    • 필요한 권한만 요청하세요.
    • 권한을 요청하기 전에 명확한 설명을 제공하세요.
    • iOS 앱 스토어 리뷰
    • Test “Deny” flows (app should still work)
  5. Info.plist 설명이 명확한지 확인합니다.

    • 테스트 계정 준비
    • 리뷰 기간 동안 유효한 리뷰 계정을 만듭니다.
    • App Review 정보에서 로그인 자격 증명을 문서화합니다.
    • 리뷰어가 결제 WALL을 접근하고 구매 흐름을 완료할 수 있는지 확인합니다.
  6. 필요한 경우 Notes field에 추가 계정 또는 앱 전용 Switch를 포함합니다.

    • 메타데이터 확인
    • 스크린샷이 현재 UI와 일치하는지 확인합니다.
    • 지원 URL에 실제 연락처 정보가 포함되어 있는지 확인합니다.
    • 개인 정보 보호 정책 URL이 채워져 있는지 확인합니다.
    • 앱 프리뷰 비디오 (있을 경우) 현재 버전을 보여줍니다.
    • 설명이 기능을 정확하게 설명합니다.
    • privacypolicy가 앱 내에서 및 스토어 목록에서 접근할 수 있습니다.
  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>
);
}
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. 기능이 찾기 어려울 때 테스트 계정을 포함하세요

문서 요청 예시

추가 자료

추가 자료

지원

지원

지원

전문적인 도움 필요하세요?

전문적인 도움 필요하세요?

iOS 앱 스토어 리뷰 또는 개인화된 지원이 필요하세요? 우리 팀과 상담 전화 예약 다음과 같은 전용 지원을 위해

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

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

iOS 앱 스토어 리뷰 지침서에서 IAP 계속하기

제목이 'iOS 앱 스토어 리뷰 지침서에서 IAP 계속하기'인 섹션

IAP 구현을 사용하고 있다면 iOS App Store 리뷰 지침을 위한 IAP 스토어 승인 및 배포를 계획하고 연결하려면 @capgo/자연스러운 구매 Using @capgo/native-purchases for the native capability in @capgo/capacitor-in-app-review for the implementation detail in @capgo/capacitor-in-app-review @capgo/capacitor-앱 내 구매 리뷰 for the native capability in Using @capgo/capacitor-in-app-review for the implementation detail in @capgo/capacitor-native-market Using @capgo/capacitor-native-market @capgo/capacitor-네이티브 마켓 사용 Using @capgo/capacitor-native-market