コンテンツへスキップ

iOS App Store Review Guidelines for IAP

App Store で承認されるには、Apple のガイドラインに注意深く注意が必要です。特にアプリ内購入とサブスクリプションを実装する場合です。このガイドでは、初回提出でレビューに合格するために必要なすべてについて説明します。

iOS App Store Review Process

Apple は購入前に価格を明確かつ前向きに開示することを要求します:

必須要素:

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

一般的な却下:

“サブスクリプション価格は明確で事前に行う必要があります。”

:::caution 価格一貫性 すべての価格は以下と一致する必要があります:

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

ストアリスト ($4.99) とアプリ ($5.99) の間に $1 の割引さえあっても、自動却下がトリガーされます。 :::

サブスクリプション計画プレゼンテーション

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

必須開示:

  • 利用可能なすべてのサブスクリプション層が一緒に表示されます
  • ティアごとの機能の明確な比較
  • UI トリックスを通じてプレミアム層に自動デフォルトなし
  • 簡単に見つけられるキャンセル手順

UI Design Dos and Don'ts

準拠した UI の例:

import { NativePurchases } from '@capgo/native-purchases';
function SubscriptionScreen() {
return (
<div>
<h2>プランを選択してください</h2>
{/* すべてのティアを均等に表示 */}
<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} // プレミアムを強制しない
/>
{/* クリアなキャンセル情報 */}
<Text>
設定 > サブスクリプションでいつでもキャンセルできます。
一部期間の払い戻しはありません。
</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('購入が正常に復元されました!');
return;
}
const { purchases: iaps } = await NativePurchases.getPurchases({
productType: PURCHASE_TYPE.INAPP,
});
const hasIap = iaps.some((purchase) => purchase.productIdentifier === 'premium_unlock');
showMessage(
hasIap ? 'プレミアム購入が復元されました!' : '以前の購入は見つかりませんでした。',
);
} catch (error) {
showError('購入の復元に失敗しました。もう一度お試しください。');
}
}
// 見えやすい "購入を復元" ボタンを追加
<Button onClick={restorePurchases}>
購入を復元
</Button>

1. アプリのクラッシュまたは機能の破損

Section titled “1. アプリのクラッシュまたは機能の破損”

失敗する理由:

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

防止:

  • 実デバイスでテスト (シミュレータのみではなく)
  • すべてのサブスクリプション フローをエンドツーエンドでテストしてください
  • レシート検証が機能することを確認
  • ネットワーク エラー処理を確認

失敗する理由:

  • スクリーンショットは現在のビルドに存在しない機能を表示
  • 説明は存在しない機能を述べています
  • メタデータの価格はアプリ内の価格と異なります

Metadata Checklist

防止:

// 各ティアに正確に含まれるものを文書化する
const SUBSCRIPTION_FEATURES = {
basic: ['Ad-free', 'Cloud sync', 'Basic themes'],
premium: ['Ad-free', 'Cloud sync', 'All themes', 'Priority support']
};
// これらを App Store の説明と両方のアプリで使用します

3. 欠落しているアクセス許可の説明

Section titled “3. 欠落しているアクセス許可の説明”

失敗する理由:

  • 説明なしにカメラ/場所/健康をリクエスト
  • パーミッションリクエストは複数の画面の深さに埋もれています
  • 曖昧な、または一般的なアクセス許可の説明

防止:

Info.plist を明確な説明で更新します:

<key>NSCameraUsageDescription</key>
<string>高速サブスクリプションアップグレードの製品バーコードをスキャンするには、カメラアクセスが必要です。</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>位置情報は、プレミアムサブスクリプションで関連する地元のコンテンツを表示するのに役立ちます。</string>

失敗する理由:

  • 証拠のない “世界で #1 アプリ” のような主張
  • “無制限の機能で隠された制限がある
  • 偽りの緊急タクティクス (“残り 2 つのスポットだけ!”)

Description Guidelines Examples

Additional Description Guidelines

防止:

  • 説明では具体的で事実上であることを使用してください
  • 証拠がなければ上級者を避ける
  • 偽りの希少性でユーザーにプレッシャーをかけないでください

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

Section titled “5. 隠されたキャンセルプロセス”

失敗する理由:

  • キャンセル方法について言及がない
  • キャンセルボタンは非表示または曖昧にされています
  • Apple のネイティブフローなしの多段階キャンセル処理

防止:

// 常にユーザーにキャンセルについて通知します
function SubscriptionInfo() {
return (
<div>
<h3>キャンセル方法</h3>
<ol>
<li>iPhone 設定を開く</li>
<li>上部の名前をタップしてください</li>
<li>サブスクリプションをタップしてください</li>
<li>このアプリを選択してキャンセルをタップ</li>
</ol>
<p>または、App Store アプリで直接管理します。</p>
<Button onClick={openSubscriptionManagement}>
設定でサブスクリプションを管理
</Button>
</div>
);
}
async function openSubscriptionManagement() {
// iOS サブスクリプション管理への直接リンク
await NativePurchases.showManageSubscriptions();
}

プライバシーとデータ使用 (セクション 5.1.1)

Section titled “プライバシーとデータ使用 (セクション 5.1.1)”

Apple は 2025 年のプライバシー要件を大幅に厳しくしました。

すべての権限の場合:

  1. 必要な理由 (特定のユースケース)
  2. いつ使用されるか
  3. データがどのように保存/共有されるか
  4. オプションであるか必須であるか
async function requestCameraPermission() {
// 要求する前に説明を表示
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']
});
// その後、アクセス許可をリクエスト
const result = await Camera.requestPermissions();
return result.camera === 'granted';
}

プライバシーニュートリションラベル

Section titled “プライバシーニュートリションラベル”

App Store プライバシーラベルが正確に反映されていることを確認:

  • 購入履歴の収集
  • メールアドレス (領収書用)
  • デバイス ID (不正防止用)
  • 使用データ (分析用)

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

Pre-Submission Checklist

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

    • 各サブスクリプション層を購入
    • 無料試用版をテストする
    • 紹介オファーが正しく適用されることを確認
    • 購入を復元をテスト
    • ファミリー共有を確認 (有効な場合)
    • 複数のデバイスでテスト
  2. 価格設定の一貫性を確認

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

    • プレースホルダー テキストを削除します
    • クレームはテスト可能であることを確認
    • 文法とスペルを確認
    • 説明が現在のビルドと一致することを確認
    • 競合他社の言及を削除
  4. テストアクセス許可

    • 必要なアクセス許可のみをリクエスト
    • リクエスト前に明確な説明を表示
    • “拒否” フローをテスト (アプリは引き続き機能する必要があります)
    • Info.plist の説明が明確であることを確認
  5. テストアカウントを準備

    • サンドボックステストアカウントを作成
    • App Review Notes でログイン認証情報を文書化する
    • テストアカウントがアクティブなサブスクリプションを確認
    • レビュアーが購入フローを完了できることを確認
  6. メタデータを確認

    • スクリーンショットは現在の UI と一致
    • アプリプレビュービデオ (ある場合) は現在のバージョンを表示
    • 説明は機能を正確に説明
    • 年齢レーティングはコンテンツと一致
    • プライバシーポリシーはアプリ内でアクセス可能
  7. 詳細なレビューノートを作成

    テストアカウント:
    メール: reviewer@test.com
    パスワード: TestPass123!
    テスト手順:
    1. 上記のテストアカウントでログイン
    2. "プレミアムにアップグレード" ボタンをタップ
    3. "月次プレミアム" サブスクリプションを選択
    4. 購入を完了する (サンドボックスでは無料)
    5. プレミアム機能がロック解除されることを確認
    注: サブスクリプション価格は購入前に明確に表示されます。
    キャンセル手順は設定 > アカウントにあります。

App Store Review Timeline

標準レビュー: 24-48 時間 ピークの時間帯: 3-5 日 (App Store 休日リリース) 週末: レビューは処理されません 急速レビュー: 重要なバグ修正で利用可能 (App Store Connect 経由でリクエスト)

1. AI 機能開示 アプリが任意の機能に AI を使用している場合、以下が必要です:

  • AI 生成コンテンツを明確にラベル付け
  • AI の使用方法を説明
  • コンテンツセーフティ対策を文書化

2. サブスクリプション明確化の向上

  • サイドバイサイド計画の比較が必要
  • より安価なオプションを隠す “ダークパターン” なし
  • クリアなダウングレード/アップグレード経路

3. プライバシーの強化

  • セクション 5.1.1 の執行を増加
  • データ収集の正当化をより詳しく監視
  • 子供のアプリのためのより厳しい要件
  • モジュラー提出が許可されるようになりました (製品ページを独立して更新)
  • アプリ内イベントは個別に提出できます
  • 誤解を招くサブスクリプション UI の実装を厳しく実施
  • 暗号通貨/ NFT アプリの新しいガイダンス

Native Purchases プラグインのベストプラクティス

Section titled “Native Purchases プラグインのベストプラクティス”
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,
});
// 成功
await validateReceiptOnServer(transaction.receipt);
showSuccess('サブスクリプションがアクティベートされました!');
unlockFeatures();
} catch (error: any) {
// 特定のエラーケースを処理します
if (error.code === 'USER_CANCELLED') {
// ユーザーがキャンセルしました - エラーを表示しないでください
console.log('Purchase cancelled by user');
} else if (error.code === 'PAYMENT_PENDING') {
showInfo('支払いは保留中です。後で確認してください。');
} else if (error.code === 'PRODUCT_ALREADY_PURCHASED') {
// 代わりに復元
await NativePurchases.restorePurchases();
} else {
// ユーザーフレンドリーなエラーを表示
showError('購入を完了できません。もう一度お試しください。');
}
}
}
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 ? '処理中...' : '今すぐサブスクライブ'}
</button>
);
}
function SubscriptionTerms() {
return (
<div className="terms">
<p>
現在の期間の終了の少なくとも 24 時間前にキャンセルされていない限り、サブスクリプションは自動的に更新されます。
</p>
<p>
現在の期間の終了前の 24 時間以内に、アカウントは更新請求されます。
</p>
<p>
サブスクリプションはユーザーが管理でき、アカウント設定での購入後にオートリニューアルをオフにすることができます。
</p>
<p>
<a href="/terms">利用規約</a> |
<a href="/privacy">プライバシーポリシー</a>
</p>
</div>
);
}
  1. 却下を慎重に読む

    • 引用された特定のガイドライン (例: 3.1.1、5.1.1) を注記
    • Apple が正確にフラグを立てた内容を理解する
  2. 問題を完全に修正

    • パッチではなく根本原因を修正する
    • フィックスを広範囲にテスト
    • 行ったことを文書化する
  3. 解決センターで対応

    ご意見をありがとうございます。問題に対処しました:
    問題: サブスクリプション価格が事前にクリアでない
    修正: サブスクリプション選択画面に明示的な価格表示を追加しました。購入ボタンの前に "$9.99/月" を表示します。同じ画面にキャンセル手順も追加しました。
    変更はこの提出にあり、提供されたテストアカウントを使用してテストすることができます。
  4. すぐに再提出

    • 再提出は通常より速くレビューされます
    • 通常は 24 時間以内

却下が不正だと思う場合:

App Store Clarification Process

  1. App Store Connect で “アピール” をクリック
  2. 明確な証拠を提供:
    • コンプライアンスを示すスクリーンショット
    • 特定のガイドラインへの参照
    • 要件をどのように満たすかの説明
  3. プロ意識的かつ事実上であることを使用してください
  4. 機能が見つけにくい場合はテストアカウントを含める

Request for Documents Example

まだ問題がある場合:

エキスパートの助けが必要ですか?

Section titled “エキスパートの助けが必要ですか?”

アプリレビューで苦労しているか、個人的な支援が必要ですか? チームとのコンサルテーション通話を予約 専用サポートを行います:

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

当社の専門家は数百のアプリをレビューに合格させるのに成功しました!