iOS App Store IAP のガイドラインを確認する
App Store でアプリの承認を得るには、特にアプリ内購入とサブスクリプションを実装する場合、Apple のガイドラインに細心の注意を払う必要があります。このガイドでは、最初の投稿で審査に合格するために知っておく必要のあるすべてのことを説明します。

アプリ内購入の要件
Section titled “アプリ内購入の要件”価格の透明性 (重要)
Section titled “価格の透明性 (重要)”Apple では、購入前に明確な価格開示が必要です。
必須要素:
- 購入前に正確な価格を表示ボタン
- 請求頻度を表示します (例: “$9.99/月”)
- ユーザーがお金を払って得られるものを明確に示します
- 料金がいつ発生するかを示します
一般的な拒否:
「サブスクリプションの価格は明確かつ事前に設定する必要があります。」
:::注意 価格の一貫性 すべての価格は以下の間で一致する必要があります。
- App Store メタデータのリスト
- アプリ内購入画面
- サブスクリプション管理画面
ストアの掲載情報 (4.99 ドル) とアプリ (5.99 ドル) に 1 ドルの差異があるだけでも、自動的に拒否されます。 :::
サブスクリプションプランのプレゼンテーション
Section titled “サブスクリプションプランのプレゼンテーション”必須開示事項:
- 利用可能なすべてのサブスクリプション層が一緒に表示されます
- 階層ごとの機能の明確な比較
- 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> );}購入を復元する
Section titled “購入を復元する”必要な実装:
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>一般的な拒否理由
Section titled “一般的な拒否理由”1. アプリのクラッシュまたは機能の破損
Section titled “1. アプリのクラッシュまたは機能の破損”失敗する理由:
- 起動時にアプリがクラッシュする
- 購入フローが完了しない
- スクリーンショットに示されている機能は動作しません
予防:
- (シミュレーターだけでなく) 実際のデバイスでテストします。
- すべてのサブスクリプション フローをエンドツーエンドでテストする
- 領収書の検証が機能することを確認する
- ネットワークエラー処理を確認してください
2. メタデータの不一致
Section titled “2. メタデータの不一致”失敗する理由:
- スクリーンショットには現在のビルドにない機能が表示されます
- 説明に存在しない機能が記載されている
- メタデータの価格はアプリ内価格とは異なります

予防:
// Document exactly what's in each tierconst 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 description3. 権限の説明が欠落している
Section titled “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>4. 誤解を招くマーケティング
Section titled “4. 誤解を招くマーケティング”失敗する理由:
- 証拠もなく「世界ナンバー1のアプリ」などと主張する
- 隠れた制限のある「無制限」機能
- 偽の緊急戦略 (「あと 2 枠しかありません!」)


予防:
- 説明は具体的かつ事実に基づいてください
- 根拠のない最上級の表現は避ける
- 偽りの希少性でユーザーに圧力をかけないでください
5. 非表示のキャンセル処理
Section titled “5. 非表示のキャンセル処理”失敗する理由: ・キャンセル方法については記載がありません
- キャンセルボタンが非表示または隠されている
- Apple のネイティブ フローを使用しない複数ステップのキャンセル プロセス
予防:
// Always inform users about cancellationfunction 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)
Apple は、2025 年にプライバシー要件を大幅に強化します。
### 必要な開示
**すべての権限について:**1. 必要な理由 (具体的な使用例)2. いつ使用するか3. データの保存/共有方法4. オプションか必須か
### 例: 適切な許可フロー
```typescriptasync 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';}プライバシー栄養ラベル
Section titled “プライバシー栄養ラベル”App Store プライバシー ラベルが以下を正確に反映していることを確認してください。
- 購入履歴の収集 ・メールアドレス(領収書用)
- デバイスID(不正行為防止用)
- 使用状況データ (分析用)
不正確なプライバシー ラベルは、2025 年の一般的な拒否理由です。データ収集を慎重に監査してください。
提出前チェックリスト
Section titled “提出前チェックリスト”
-
すべての購入フローをテストする
- 各サブスクリプション層を購入する
- 無料トライアルをテストする
- 紹介特典が正しく適用されていることを確認する
- 購入した復元のテスト
- ファミリー共有を確認します (有効な場合)
- 複数のデバイスでテストする
-
価格の一貫性を確認
- App Store メタデータがアプリ内価格と一致することを確認します
- すべての通貨が正しいことを確認してください
- 無料トライアル期間が説明と一致していることを確認します
- 紹介特典の条件が正確であることを確認してください
-
すべてのコピーを確認
- プレースホルダーテキストを削除する
- クレームがテスト可能であることを確認する
- 文法とスペルをチェックする
- 説明が現在のビルドと一致していることを確認してください
- 競合他社への言及を削除する
-
権限のテスト
- 必要な権限のみをリクエストする
- 要求する前に明確な説明を示す
- 「拒否」フローをテストします (アプリは引き続き動作するはずです)
- Info.plist の説明が明確であることを確認します
-
テストアカウントの準備
- サンドボックステストアカウントの作成
- ログイン資格情報をアプリレビューメモに文書化します。
- テストアカウントにアクティブなサブスクリプションがあることを確認します
- レビュー担当者が購入フローを完了できるかテストする
-
メタデータの確認
- スクリーンショットは現在の UI と一致します
- アプリのプレビュー ビデオ (存在する場合) には現在のバージョンが表示されます
- 説明は機能を正確に説明しています
- 年齢レーティングはコンテンツと一致します
- アプリ内でプライバシー ポリシーにアクセスできます
-
詳細なレビューノートを書く
Test Account:Email: reviewer@test.comPassword: TestPass123!Testing Instructions:1. Log in with test account above2. Tap "Upgrade to Premium" button3. Select "Monthly Premium" subscription4. Complete purchase (no charge in sandbox)5. Verify premium features unlockNote: Subscription pricing is clearly shown before purchase.Cancellation instructions are in Settings > Account.
レビューのタイムライン
Section titled “レビューのタイムライン”
標準レビュー: 24 ~ 48 時間 ピーク期間: 3 ~ 5 日 (App Store ホリデー リリース) 週末: レビューは処理されていません 迅速なレビュー: 重大なバグ修正に利用可能 (App Store Connect 経由でリクエスト)
2025 年のガイドラインの更新
Section titled “2025 年のガイドラインの更新”1. AI 機能の開示 アプリの機能に AI を使用する場合は、次のことを行う必要があります。
- AI によって生成されたコンテンツに明確なラベルを付ける
- AIがどのように使用されるかを説明する
- 文書内容の安全対策
2.サブスクリプションの明確性の強化
- プランを並べて比較する必要があります
- 安価なオプションを隠す「暗いパターン」はありません
- ダウングレード/アップグレード パスをクリアする
3.プライバシーの強化
- セクション 5.1.1 の施行が強化されました
- データ収集の正当性についてのさらなる精査
- 子供向けアプリの要件が厳格化
2024 年からの変化- モジュール形式の提出が可能になりました (製品ページを個別に更新します)
Section titled “2024 年からの変化- モジュール形式の提出が可能になりました (製品ページを個別に更新します)”- アプリ内イベントは個別に送信できます
- 誤解を招くサブスクリプション UI の厳格な適用
- 暗号通貨/NFT アプリに関する新しいガイダンス
ネイティブ購入プラグインのベスト プラクティス
Section titled “ネイティブ購入プラグインのベスト プラクティス”適切なエラー処理を実装する
Section titled “適切なエラー処理を実装する”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.'); } }}読み込み状態の表示
Section titled “読み込み状態の表示”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> );}用語を明確に表示する
Section titled “用語を明確に表示する”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> );}アプリが拒否された場合
Section titled “アプリが拒否された場合”-
拒否内容をよく読んでください
- 引用されている特定のガイドラインに注意してください (例: 3.1.1、5.1.1)
- Apple がフラグを立てた内容を正確に理解する
-
問題を徹底的に修正します
- パッチを適用するだけではなく、根本原因を修正してください
- 修正を広範囲にテストする
- 変更内容を文書化する
-
解決センターで対応
Thank you for your feedback. I have addressed the issue:Issue: Subscription pricing not clear upfrontFix: Added explicit pricing display on subscription selectionscreen showing "$9.99/month" before purchase button. Also addedcancellation instructions on the same screen.The changes are in this submission and can be tested using theprovided test account. -
速やかに再提出してください
- 再提出は通常、より迅速に審査されます
- 通常 24 時間以内
上訴プロセス
Section titled “上訴プロセス”拒否が間違っていると思われる場合は、次のようにします。

- App Store Connect の [異議申し立て] をクリックします。
- 明確な証拠を提供します。
- コンプライアンスを示すスクリーンショット
- 特定のガイドラインへの参照
- 要件を満たす方法の説明
- 専門的かつ事実に基づいて行動する
- 機能が見つけにくい場合は、テスト アカウントを含めます

追加のリソース
Section titled “追加のリソース”まだ問題が解決しない場合:
- [ネイティブ購入ドキュメント]を確認してください(/docs/plugins/native-purchases/getting-started/)
- [一般的なトラブルシューティングの問題] を確認してください(/docs/plugins/native-purchases/getting-started/#troubleshooting)
- ガイドラインの詳細については、Apple 開発者サポートにお問い合わせください。
専門家の助けが必要ですか?
Section titled “専門家の助けが必要ですか?”アプリのレビューで苦労している場合、または個別のサポートが必要ですか? チームへの相談電話を予約: 以下の専用サポートをご利用いただけます:
- IAP実装のレビューと最適化
- App Store 準備と戦略を確認する
- 提出チェックリストのレビュー
- 拒否の解決と異議申し立て
- 完全なテストと検証
当社の専門家は、何百ものアプリが審査に合格するよう支援してきました。