コンテンツにジャンプ

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

GitHub

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

iOS App Store レビュー プロセス

App Store Connect設定を完了する

タイトル「App Store Connect設定を完了する」

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

  • プライバシーポリシーURLを追加する Add a __CAPGO_KEEP_0__ App Store Connect に追加
  • Add a サポート URL ユーザーに実際の連絡先情報を提供するための URL
  • 質問票を完了してアプリを公開できるようにする 年齢制限の質問票を完了 Add
  • App Review の連絡先情報と明確なレビューノート ログインが必要な場合、レビュー中に期限切れにならないデモアカウントを提供する レビュー中に期限切れにならないデモアカウントを提供する
  • レビュー中に期限切れにならないデモアカウントを提供する レビュー中に期限切れにならないデモアカウントを提供する
App Store listing metadata with policy and support links
  • Use current screenshots from the actual build under review
  • For iPhone, 1290 x 2796 (6.7-inch) is the easiest default size
  • If your app runs on iPad, upload iPad screenshots too
  • Current accepted large iPad sizes include 2064 x 2752 (13-inch) and 2048 x 2732 (12.9-inch)
  • iPhoneのスクリーンショットを拡大してiPadのサポートを偽装することはない

実機でAppleが実行するパスを完全に再現するDry-Runのレビュージョーンリー

TestFlightでDry-Runするレビュージョーンリー

実機でAppleが実行するパスを完全に再現するDry-Runのレビュージョーンリーの実行

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

In-App Purchaseの要件

In-App Purchaseの要件

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

必須要素:

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

一般的な拒否理由:

“Subscription pricing must be clear and upfront.”

サブスクリプション価格は明確かつ事前提示でなければなりません。

  • :::caution Price Consistency すべての価格は次のものと一致する必要があります:
  • In-app purchase screens
  • サブスクリプション管理画面

Even a $1 discrepancy between store listing ($4.99) and app ($5.99) will trigger automatic rejection.

「サブスクリプションプランの表示」のセクション

  • 必要な披露
  • すべてのサブスクリプションの階層が表示される
  • 各階層ごとの機能の明確な比較
  • プレミアム階層への自動切り替えを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

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位のアプリ”と主張する
  • 「無制限」な機能が実際には制限がある
  • 「限りある時間」で急いで購入するように迫る

説明ガイドラインの例

追加の説明ガイドライン

防止:

  • 具体的で事実に基づいた説明を記載する
  • 証拠のない超越的な表現を避ける
  • ユーザーに偽の限界感を与えない

なぜ失敗するか:

  • キャンセル方法の説明が欠落している
  • キャンセルボタンが非表示または隠されている
  • 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年、アップルはプライバシー要件を大幅に強化しました。

あらゆるパーミッションの場合

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

App Storeのプライバシー栄養ラベルが正確に反映されていることを確認してください。

  • 購入履歴の収集
  • 受領のためのメールアドレス
  • 不正行為防止のためのデバイスID
  • 分析のための使用データ

2025年には不正確なプライバシー栄養ラベルが一般的な却下理由です。データ収集を慎重に検討してください。

提出前にチェックリスト

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

    • 各サブスクリプション階層を購入する
    • 無料試用期間をテストする
    • 導入オファーが正しく適用されていることを確認する
    • 購入を復元する機能をテストする
    • ファミリーシェアリング機能が有効の場合、ファミリーシェアリングをテストする
    • 複数のデバイスでテストする
  2. 価格の一貫性を確認する

    • App Storeのメタデータがインアプリ価格と一致していることを確認する
    • すべての通貨が正しいことを確認する
    • 無料試用期間の長さが説明と一致していることを確認する
    • __CAPGO_KEEP_0__の紹介オファーの条件を正確に確認する
  3. __CAPGO_KEEP_0__のすべてのコピーを確認する

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

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

    • レビュー期間中でも有効なレビュー用アカウントを作成する
    • App Review情報にログイン情報を記載する
    • レビュアーがパイウォールに到達し購入フローを完了できることを確認する
    • 必要に応じて、Notesフィールドに追加のアカウントやアプリ固有のスイッチを含める
  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.

クリップボードにコピー

レビューのタイムライン

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

標準レビュー: 24-48時間 ピーク時期: 3-5日(アプリストアのホリデーリリース) 週末: レビューは処理されません 早期レビュー: App Store Connectでクリティカルなバグ修正のためにリクエスト

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

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

2026 年の提出焦点

2026 年の提出焦点

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

  • プランの比較
  • No “dark patterns”が存在しない、より安いオプションを隠さない
  • 明確なダウングレード/アップグレードパス

2. メタデータの正確さ

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

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

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

4. 提出の準備

  • Appleは、定期的に最小限のSDK要件を更新しているため、現在の締切を確認して、リリースビルドをアップロードする前に提出を確認する必要があります
  • TestFlightは、実際のレビュアー パスを確認するために、安全な場所で確認することができます。

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

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

適切なエラー処理を実装する

適切なエラー処理を実装する
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)
    • Appleが指摘した問題を完全に理解する
  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時間以内

再提出が却下された場合に誤りであると考える場合:

App Storeの説明書きの手続き

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

ドキュメントの要求の例

サポート

サポート

問題が解決しない場合

ガイドラインの説明の確認

専門家の助けが必要ですか?

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

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

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

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

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

あなたが使用している場合 IAPのためのiOS App Store Review Guidelinesを使用して、ストアの承認と配布の計画に接続する to plan store approval and distribution, connect it with @capgo/native-purchases native capabilityの使用に@capgo/native-purchases @capgo/capacitor-in-app-review @capgo/capacitor-in-app-reviewの実装詳細 Using @capgo/capacitor-in-app-review native capabilityの使用にUsing @capgo/capacitor-in-app-review @capgo/capacitor-native-market @capgo/capacitor-native-marketの実装詳細 Using @capgo/capacitor-native-market native capabilityの使用にUsing @capgo/capacitor-native-market