コンテンツへスキップ

iOS App Store IAP のガイドラインを確認する

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

iOS App Store レビュー プロセス

Apple では、購入前に明確な価格開示が必要です。

必須要素:

  • 購入前に正確な価格を表示ボタン
  • 請求頻度を表示します (例: “$9.99/月”)
  • ユーザーがお金を払って得られるものを明確に示します
  • 料金がいつ発生するかを示します

一般的な拒否:

「サブスクリプションの価格は明確かつ事前に設定する必要があります。」

:::注意 価格の一貫性 すべての価格は以下の間で一致する必要があります。

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

ストアの掲載情報 (4.99 ドル) とアプリ (5.99 ドル) に 1 ドルの差異があるだけでも、自動的に拒否されます。 :::

サブスクリプションプランのプレゼンテーション

Section titled “サブスクリプションプランのプレゼンテーション”

必須開示事項:

  • 利用可能なすべてのサブスクリプション層が一緒に表示されます
  • 階層ごとの機能の明確な比較
  • 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. アプリのクラッシュまたは機能の破損

Section titled “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 を明確な説明で更新します。

<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 枠しかありません!」)

記述ガイドラインの例

追加の説明ガイドライン

予防:

  • 説明は具体的かつ事実に基づいてください
  • 根拠のない最上級の表現は避ける
  • 偽りの希少性でユーザーに圧力をかけないでください

失敗する理由: ・キャンセル方法については記載がありません

  • キャンセルボタンが非表示または隠されている
  • 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();
}
```## プライバシーとデータの使用 (セクション 5.1.1)
Apple は、2025 年にプライバシー要件を大幅に強化します。
### 必要な開示
**すべての権限について:**
1. 必要な理由 (具体的な使用例)
2. いつ使用するか
3. データの保存/共有方法
4. オプションか必須か
### 例: 適切な許可フロー
```typescript
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 メタデータがアプリ内価格と一致することを確認します
    • すべての通貨が正しいことを確認してください
    • 無料トライアル期間が説明と一致していることを確認します
    • 紹介特典の条件が正確であることを確認してください
  3. すべてのコピーを確認

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

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

    • サンドボックステストアカウントの作成
    • ログイン資格情報をアプリレビューメモに文書化します。
    • テストアカウントにアクティブなサブスクリプションがあることを確認します
    • レビュー担当者が購入フローを完了できるかテストする
  6. メタデータの確認

    • スクリーンショットは現在の UI と一致します
    • アプリのプレビュー ビデオ (存在する場合) には現在のバージョンが表示されます
    • 説明は機能を正確に説明しています
    • 年齢レーティングはコンテンツと一致します
    • アプリ内でプライバシー ポリシーにアクセスできます
  7. 詳細なレビューノートを書く

    Test Account:
    Email: reviewer@test.com
    Password: TestPass123!
    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 時間 ピーク期間: 3 ~ 5 日 (App Store ホリデー リリース) 週末: レビューは処理されていません 迅速なレビュー: 重大なバグ修正に利用可能 (App Store Connect 経由でリクエスト)

1. AI 機能の開示 アプリの機能に AI を使用する場合は、次のことを行う必要があります。

  • AI によって生成されたコンテンツに明確なラベルを付ける
  • AIがどのように使用されるかを説明する
  • 文書内容の安全対策

2.サブスクリプションの明確性の強化

  • プランを並べて比較する必要があります
  • 安価なオプションを隠す「暗いパターン」はありません
  • ダウングレード/アップグレード パスをクリアする

3.プライバシーの強化

  • セクション 5.1.1 の施行が強化されました
  • データ収集の正当性についてのさらなる精査
  • 子供向けアプリの要件が厳格化

2024 年からの変化- モジュール形式の提出が可能になりました (製品ページを個別に更新します)

Section titled “2024 年からの変化- モジュール形式の提出が可能になりました (製品ページを個別に更新します)”
  • アプリ内イベントは個別に送信できます
  • 誤解を招くサブスクリプション UI の厳格な適用
  • 暗号通貨/NFT アプリに関する新しいガイダンス

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

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.');
}
}
}
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. 機能が見つけにくい場合は、テスト アカウントを含めます

資料請求例

まだ問題が解決しない場合:

  • [ネイティブ購入ドキュメント]を確認してください(/docs/plugins/native-purchases/getting-started/)
  • [一般的なトラブルシューティングの問題] を確認してください(/docs/plugins/native-purchases/getting-started/#troubleshooting)
  • ガイドラインの詳細については、Apple 開発者サポートにお問い合わせください。

アプリのレビューで苦労している場合、または個別のサポートが必要ですか? チームへの相談電話を予約: 以下の専用サポートをご利用いただけます:

  • IAP実装のレビューと最適化
  • App Store 準備と戦略を確認する
  • 提出チェックリストのレビュー
  • 拒否の解決と異議申し立て
  • 完全なテストと検証

当社の専門家は、何百ものアプリが審査に合格するよう支援してきました。