コンテンツにジャンプ

iOS App StoreのIAPのレビュー ガイドライン

GitHub

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

iOS App Store Review Process

提出前に

提出前に

Appleが購入フローをレビューする前に、まずアプリレコード自体が完了していることを確認してください。

Add a

プライバシーポリシーURL

  • App Store Connectに in App Store Connect App Store Connectの設定を完了する
  • アプリに追加する サポートURL ユーザーに実際の連絡先情報を示すようにするURL
  • アプリが公開可能になるように、 年齢制限の質問紙を完了する アプリに追加する
  • アプリレビューの連絡先情報と、レビューノートを明確にする ログインが必要な場合、 レビュー中に期限切れにならないデモアカウントを提供する
  • 注意 __CAPGO_KEEP_0__
App Storeのリストメタデータとポリシー、サポートリンク

実際のスクリーンショットを用意する

「実際のスクリーンショットを用意する」のセクション
  • 現在レビュー中のビルドから現在のスクリーンショットを使用する
  • iPhoneの場合、 1290 x 2796 (6.7インチ)はデフォルトのサイズ
  • あなたのアプリがiPadで動作する場合、iPadのスクリーンショットもアップロードする
  • 現在受け入れられている大きなiPadサイズは 2064 x 2752 (13インチ)と 2048 x 2732 (12.9インチ)
  • iPhoneのスクリーンショットを拡大してiPadのサポートを偽装しない

実際のデバイスでAppleが実行するパスを完全に再現するDry-Runのレビュージャーニーをテストフライトで実行する

「テストフライトでDry-Runのレビュージャーニーを実行する」

実際のデバイスでAppleが実行するパスを完全に再現する:

  • テストフライトから最新のビルドをインストールする
  • レビューするアカウントでサインインする
  • 非表示のジェスチャーやデバッグメニューなしで壁紙に到達する
  • 購入、復元、サブスクリプション管理フローを完了する
  • パーミッションが拒否された場合でもアプリが正しく動作することを確認する

インアプリ購入の要件

「インアプリ購入の要件」

価格の透明性(重要)

価格透明性 (重要)

Apple は購入前に明確な価格の披露を要求しています:

必須要素:

  • 購入ボタン前に正確な価格を表示する
  • 請求頻度を明確に表示する (例: “$9.99/月”)
  • ユーザーが得るものを明確に述べる
  • 課金時期を示す

一般的な拒否理由:

“Subscription pricing must be clear and upfront.”

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

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

ストアリストの価格 ($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. アプリのクラッシュまたは機能の不具合」セクション

なぜ失敗するのか:

  • アプリは起動時にクラッシュする
  • 購入フローが完了しない
  • スクリーンショットに表示されている機能が正常に動作しない

対策:

  • 実機でテストする (シミュレータだけでは不十分)
  • すべてのサブスクリプションフローをエンドツーエンドでテストする
  • 受け取り確認の検証が正常に動作することを確認する
  • ネットワークエラーのハンドリングを確認する

なぜ失敗するのか:

  • スクリーンショットに表示されている機能が現在のビルドに含まれていない
  • 説明文に存在しない機能が記載されている
  • メタデータの価格設定は、インストール中の価格設定と異なります。

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

対策:

// 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 明確な説明とともに:

__CAPGO_KEEP_0__ 許可のコピーが十分に明確ではないため、レビューが不可能です。
<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. 誤解を招くマーケティング」のセクション

  • なぜ失敗するのか:
  • 「世界で#1のアプリ」などの証拠なしの主張
  • 「無制限」な機能が隠れた制限を持つ

「時間が残りわずか!」などの偽の緊急性の戦術

説明ガイドラインの例

__CAPGO_KEEP_0__

  • __CAPGO_KEEP_1__
  • __CAPGO_KEEP_2__
  • __CAPGO_KEEP_3__

5. 隠されたキャンセルプロセス

5. 隠されたキャンセルプロセスのセクション

なぜ失敗するか

  • キャンセル方法の説明がなくなる
  • キャンセルボタンが隠されている
  • Appleのネイティブフローを使用しない複数ステップのキャンセルプロセス

__CAPGO_KEEP_0__

// 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. なぜ必要なのか (具体的な用途)
  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年には不正確なプライバシー栄養ラベルが一般的な却下理由です。データ収集を慎重に検査してください。

提出前にチェックリスト

  1. すべての購入フローをテストする

    • 各サブスクリプションのレベルを購入する
    • 無料トライアルをテストする
    • 導入割引が正しく適用されることを確認する
    • 購入を復元するテスト
    • Family Sharing (有効の場合) を確認する
    • 複数のデバイスでテストする
  2. 価格の一貫性を確認する

    • App Store のメタデータがインアプリ価格と一致することを確認する
    • すべての通貨が正しいことを確認する
    • 無料トライアルの期間が説明と一致することを確認する
    • 導入割引の条件が正確であることを確認する
  3. すべてのコピーを確認

    • プレースホルダー テキストを削除
    • 確認できるかどうかテストする
    • 文法とスペルの確認
    • 現在のビルドに合わせた説明を確認
    • 競合他社の言及を削除
  4. パーミッションのテスト

    • 必要なパーミッションのみを要求
    • パーミッションを要求する前に明確な説明を示す
    • 「拒否」フローをテスト(アプリはまだ動作するはず)
    • Info.plistの説明が明確かどうか確認
  5. テスト用アカウントの準備

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

    • スクリーンショットが現在のUIと一致する
    • サポートURLに実際の連絡先情報が含まれている
    • プライバシーポリシーURLが埋められている
    • アプリの内容と一致する年齢制限が設定されている
    • アプリプレビュー動画(ある場合)が現在のバージョンを表示している
    • 説明が機能を正確に説明している
    • プライバシーポリシーがアプリ内とストアリストからアクセス可能
  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.

App Store レビュータイムライン

標準レビュー: 24-48 時間 ピーク期: App Store ハoliday リリースの場合 3-5 日 週末: レビューが処理されません 優先レビュー: 緊急修正対応可能 (App Store Connect からリクエスト)

App Store Connect で見ることができる一般的なステータス:

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

2026 年の提出焦点

「2026 年の提出焦点」

現在の焦点分野

「現在の焦点分野」

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

  • プランの比較が必要
  • 安いオプションを隠す「暗いパターン」は使用しないでください
  • 明確なダウングレード/アップグレードパス

2. メタデータの正確性

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

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

  • SDKが実際に収集するものと一致するプライバシーの披露が必要です
  • アプリレビューの連絡先情報と注釈は、初回提出時に完全に記入されている必要があります
  • デモクレデンシャルは、レビュー期間中に有効なまま残す必要があります

4. 提出の準備

  • Appleは定期的に最小限の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. 拒否の理由を読み、よく理解する

    • 拒否の理由を読み、よく理解する
    • 拒否の理由を読み、よく理解する
  2. 問題を徹底的に修正する

    • 根本的な問題を修正するだけではなく、問題の根本原因を修正する
    • 問題の根本原因を修正したことを確認する
    • 変更したことをドキュメントする
  3. Resolution Centerに回答する

    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_1__
    • __CAPGO_KEEP_2__

__CAPGO_KEEP_3__

__CAPGO_KEEP_4__

__CAPGO_KEEP_5__

__CAPGO_KEEP_6__

  1. __CAPGO_KEEP_7__
  2. __CAPGO_KEEP_8__
    • __CAPGO_KEEP_9__
    • __CAPGO_KEEP_10__
    • __CAPGO_KEEP_11__
  3. 専門的かつ事実に基づいた
  4. 機能が見つけるのが難しい場合はテストアカウントを含める

ドキュメントの要求の例

サポート

サポート

問題が解決しない場合:

専門チームと電話会議を予約してください

専門的なサポートのために:

__CAPGO_KEEP_0__ __CAPGO_KEEP_1__ __CAPGO_KEEP_2__

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

私たちの専門家は、数百のアプリをレビューに通わせることに成功しています!

iOS App Store Review Guidelines for IAPから続けてください

「iOS App Store Review Guidelines for IAPから続けてください」のセクション

あなたが使用している場合 iOS App Store Review Guidelines for IAP 店舗承認と配布の計画に使用し、@__CAPGO_KEEP_0__/native-purchasesに接続する Using @capgo/native-purchases native capabilityの使用に@capgo/native-purchasesを使用します。 @capgo/capacitor-in-app-reviewを使用します。 @capgo/capacitor-in-app-reviewの実装詳細については、@capgo/capacitor-in-app-reviewを参照してください。 @capgo/capacitor-in-app-reviewを使用します。 native capabilityの使用に@capgo/capacitor-in-app-reviewを使用します。 @capgo/capacitor-native-marketを使用します。 @capgo/capacitor-native-marketの実装詳細については、@capgo/capacitor-native-marketを参照してください。 @capgo/capacitor-native-marketを使用します。 native capabilityの使用に@capgo/capacitor-native-marketを使用します。