メニューに進む

iOS App Store Review Guidelines for IAP

App Storeへのアプリの承認には、Appleのガイドラインに特にインアプリ購入やサブスクリプションの実装に関して注意が必要です。このガイドでは、初回提出でレビューを通過するために必要なすべての情報をカバーしています。

App StoreのiOSレビュープロセス

提出前に

提出前に

App Store Connectのセットアップを完了

Section titled “App Store Connectの設定を完了する”

Appleが購入フローのレビューを実施する前に、App Store Connectのアプリレコード自体が完了していることを確認してください:

  • Add a プライバシーポリシーURL in App Store Connect
  • Add a サポートURL that leads to real contact information for users
  • Complete the 年齢制限 questionnaire so the app is publishable
  • Add App Review の連絡先情報 とクリアなレビューノート
  • レビュー中に期限切れにならないデモアカウントを提供する必要がある場合は、ログインが必要な場合 Note
実際のビルドを使用してレビュー中の現実のスクリーンショットを準備する
  • Section titled “Prepare Real Screenshots”
  • 現実のビルドのスクリーンショットを使用してレビュー中の現実のスクリーンショットを準備する 1290 x 2796 (6.7インチ)はデフォルトの最小サイズです
  • iPadでアプリが実行される場合、iPadのスクリーンショットもアップロードしてください
  • 現在受け入れられている大きなiPadサイズには 2064 x 2752 (13インチ)と 2048 x 2732 (12.9インチ)があります
  • iPhoneのスクリーンショットを拡大してiPadのサポートを偽装することはありません

TestFlightでレビュアージャーニーをDry-Runしてください

TestFlightでレビュアージャーニーをDry-Runする方法

TestFlightから最新のビルドをインストールしてください

  • レビュー用のアカウントでサインインしてください
  • レビュー用のアカウントでサインインして、支払い壁を通過してください。Debugメニューや隠しジェスチャーはありません。
  • TestFlightで実行するパスを実際のデバイスで実行してください:
  • 購入、復元、サブスクリプション管理フロー
  • パーミッションが拒否された場合にアプリが正しく動作することを確認する

Appleは購入前に明確な価格の公開が必要です:

必須要素:

  • 購入ボタン前に正確な価格を表示する
  • 請求頻度(例:「$9.99/月」)を表示する
  • ユーザーが得るものを明確に述べる
  • ユーザーが支払うことになる時期を示す

一般的な拒否:

「サブスクリプションの価格は明確で事前提示される必要があります。」

:::注意:価格の一貫性 すべての価格は次の場所で一致する必要があります:

  • アプリストアのメタデータリスト
  • インアプリ購入画面
  • サブスクリプション管理画面

ストアリストの価格($4.99)とアプリの価格($5.99)に$1の差異がある場合、自動的に拒否されます。 :::

必要な披露:

  • すべての利用可能なサブスクリプションのレベルが一緒に表示される
  • 各レベルごとの機能の明確な比較
  • No auto-defaulting to premium tiers through UI tricks
  • UI上でプレミアム層への自動切り替えを回避する

Easy-to-locate cancellation instructions

キャンセル方法が簡単にわかる

UI Design Dos and Don'ts

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

Paywall with restore purchases and legal links

購入の復元と法的情報の付いたパイウォール

Example of Compliant UI:

規制に適合したUIの例

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>

クリップボードにコピーする

Section titled “Common Rejection Reasons”

Why It Fails:

  • App crashes on launch
  • Purchase flow fails to complete
  • Features shown in screenshots don’t work

Prevention:

  • Test on real devices (not just simulators)
  • Test all subscription flows end-to-end
  • Verify receipt validation works
  • Check network error handling

なぜ失敗するか:

  • スクリーンショットは現在のビルドにない機能を示している
  • 説明では存在しない機能を言及している
  • メタデータ内の価格とアプリ内価格が異なる

メタデータチェックリスト

予防対策:

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

なぜ失敗するか:

  • カメラ/位置/健康情報の要求に説明がない
  • 許可の要求が複数の画面奥に埋め込まれている
  • 曖昧または一般的な許可の説明

防止:

最新の 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>

なぜ失敗するのか:

  • __CAPGO_KEEP_0__の証拠なしの主張
  • __CAPGO_KEEP_0__の証拠なしの特徴
  • __CAPGO_KEEP_0__の急ぎの戦術(「残り2つ」など)

説明ガイドラインの例

追加の説明ガイドライン

防止法

  • 説明を具体的で事実に基づいて書く
  • 証拠なしの超越的な表現を避ける
  • ユーザーに偽の不足感を与えない

なぜ失敗するのか:

  • No cancellation method mentioned
  • キャンセルボタンの表示が隠されている
  • 複数ステップのキャンセルプロセスが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();
}

2025年以降、Appleはプライバシー要件を大幅に強化しました。

必要な披露

「必要な披露」

各パーミッションごとに:

  1. なぜ必要なのか(具体的な用途)
  2. When it will be used
  3. How data is stored/shared
  4. Whether it’s optional or required

Example: Proper Permission Flow

例: 正しい許可フロー
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. 各サブスクリプションのレベルを購入してください

    • 無料トライアルをテストしてください
    • 導入オファーが正しく適用されることを確認してください
    • 購入の復元をテストしてください
    • ファミリーシェアリング (有効の場合) をテストしてください
    • 複数のデバイスでテストしてください
    • __CAPGO_KEEP_0__
  2. 価格の一致性を確認する

    • App Storeのメタデータとインアプリ価格が一致するか確認する
    • すべての通貨が正しいか確認する
    • 無料試用期間の説明と実際の期間が一致するか確認する
    • 導入オファーの条件が正確か確認する
  3. すべてのコンテンツを確認する

    • プレースホルダーテキストを削除する
    • 主張がテスト可能か確認する
    • 文法とスペルを確認する
    • 現在のビルドと説明が一致するか確認する
    • 競合他社の言及を削除する
  4. 権限のテスト

    • 必要な権限のみを要求する
    • アプリの説明を明確に表示する前に要求する
    • 「拒否」フローをテストする (アプリは正常に動作するはず)
    • Info.plistの説明が明確であることを確認する
  5. テストアカウントを準備する

    • レビュー期間中有効なレビュー用アカウントを作成する
    • App Review情報にログイン情報を記載する
    • レビュアーがpaywallに到達し購入フローを完了できることを確認する
    • 必要に応じてNotesフィールドに追加アカウントまたはアプリ固有のSwitchを含める
  6. メタデータを確認する

    • スクリーンショットが現在のUIと一致することを確認する
    • サポート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.

アプリストアのレビューのタイムライン

標準レビュー: 24-48時間 ピーク期間: 3-5日(App Storeのホリデーリリース) 週末: レビューが処理されません 優先レビュー: 緊急修正用のクリティカルバグに対してのみ利用可能(App Store Connectからリクエスト)

App Store Connectでよく見るステータス:

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

1. サブスクリプションの明確性

  • 比較対象のプランを横並びに表示する必要があります
  • 安価なオプションを隠す「暗いパターン」は存在しません
  • ダウングレード/アップグレードのパスが明確に表示されます

2. メタデータの正確性

  • レビューされるビルドと一致するスクリーンショットが必要です
  • iPadのサポートが有効になっている場合、iPadのスクリーンショットが必要です
  • サポートURLとプライバシーポリシーは提出前にすでに公開されている必要があります

3. プライバシーとレビュー詳細の品質

  • SDKが実際に収集するプライバシー情報と一致するプライバシー情報が必要です
  • App Reviewの連絡先情報とメモは最初の提出時に完全な状態でなければなりません。
  • デモクレデンシャルは、全体的なレビュー期間中に有効でなければなりません。

4. 提出の準備

  • Appleは定期的に最小限のSDK要件を更新しているため、リリースビルドをアップロードする前に現在の締切を確認してください。
  • TestFlightは、提出前に正確なレビュ modalパスを確認する最も安全な場所です。

ネイティブ購入プラグインのベストプラクティス

ネイティブ購入プラグインのベストプラクティス

適切なエラーハンドリングを実装する

適切なエラーハンドリングを実装する
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>
);
}

__CAPGO_KEEP_1__

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

__CAPGO_KEEP_3__

__CAPGO_KEEP_4__

__CAPGO_KEEP_5__

__CAPGO_KEEP_2__
  1. __CAPGO_KEEP_6__

    • __CAPGO_KEEP_7__
    • __CAPGO_KEEP_8__
  2. __CAPGO_KEEP_9__

    • 根本的な原因を修正するだけではありません
    • 修正を徹底的にテストする
    • 変更したことをドキュメントする
  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時間以内にレビューされます
    • 通常24時間以内

抗議プロセス

抗議プロセス

再提出の却下が不正であると考えている場合:

App Storeの説明プロセス

  1. App Store Connectで「Appeal」をクリックしてください。
  2. 明確な証拠を提供してください:
    • 規制に適合していることを示すスクリーンショット
    • 具体的なガイドラインへの言及
    • 要件を満たしていることを説明してください
  3. プロフェッショナルで事実に基づいた内容でください
  4. 機能が見つからない場合はテストアカウントを含めてください

ドキュメントの要求例

問題が解決しない場合は:

アプリのレビューに苦戦しているか、個別の支援が必要ですか? 専門チームと電話会議を予約してください 専用サポートのために:

  • IAP実装のレビューと最適化
  • App Storeレビューの準備と戦略
  • 提出物のチェックリストのレビュー
  • 却下の解決と訴え
  • 完全なテストと検証

私たちの専門家は、IAPのためにレビューを通過するために成功した数百のアプリを支援しました!

iOS App Store Review GuidelinesのIAPの部分から続けてください

iOS App Store レビュー ガイドラインの IAP セクションから続けてください

IAP を使用している場合 iOS App Store レビュー ガイドラインの IAP ストアの承認と配信を計画するには、接続する必要があります。 @capgo/native-purchases を使用して @capgo/native-purchases のネイティブ機能を使用する場合、 @capgo/capacitor-in-app-review を使用して @capgo/capacitor-in-app-review の実装詳細を参照する場合、 @capgo/capacitor-in-app-review を使用して @capgo/capacitor-in-app-review のネイティブ機能を使用する場合、 @capgo/capacitor-native-market を使用して @capgo/capacitor-native-market の実装詳細を参照する場合、 @capgo/capacitor-native-marketを使用して native capabilityを使用して@capgo/capacitor-native-marketを使用します。