コンテンツにジャンプ

iOSサブスクリプショングループを作成

GitHub

iOSアプリで複数のサブスクリプションレベルを管理するために、サブスクリプショングループは不可欠です。サブスクリプショングループのしくみを理解することは、アップグレード、ダウングレード、クロスグレード機能を実装するために不可欠です。

サブスクリプショングループとは?

サブスクリプショングループとは?

サブスクリプショングループとは、ユーザーが選択できる関連サブスクリプションの集合体です。ユーザーは、グループ内で1つのサブスクリプションにのみサブスクライブできます。サブスクリプションを切り替えると、Appleは自動的に移行を処理します。

サブスクリプショングループの重要性

サブスクリプショングループの重要性

サブスクリプショングループは次の機能を提供します。

  • 段階的な価格設定: 基本、プレミアム、そして究極のプランを提供します
  • 期間の差: 月額、年額、ライフタイムのオプション
  • アップグレード/ダウングレードロジック: サブスクリプションの変更を自動的に処理
  • シンプルな管理: 関連するサブスクリプションをグループ化

サブスクリプション レベル

サブスクリプション レベル

グループ内で、各サブスクリプションは、値の高い順 (レベル 1) から値の低い順にランク付けされます。このランク付けは、サブスクリプションの変更を分類するために使用されます。

サブスクリプション グループ階層

レベル例

レベル例示

レベル1 (最高値)

  • プレミアム年間($99.99/年)
  • 究極の月額($19.99/月)

レベル2 (中間値)

  • スタンダード年間($49.99/年)
  • プレミアム月額($9.99/月)

レベル3 (最低値)

  • ベーシック年間($29.99/年)
  • 標準月額 ($4.99/月)

サブスクリプション変更の種類

サブスクリプション変更の種類

レベルランキングに基づいて、Appleは自動的に3つの種類のサブスクリプション変更を処理します。

より高いレベルの higher-tier 動作:

即時効果

  • 即時効果 protectedTokens
  • ユーザーは 残り時間分の割引 がもらえる
  • 新しいサブスクリプションはすぐに始まる

例:

// User currently has: Standard Monthly (Level 2)
// User upgrades to: Premium Annual (Level 1)
// Result: Immediate access to Premium, refund for unused Standard time

レベルを 下げる サブスクリプション (例: レベル 1 → レベル 2).

動作:

  • 効果が発生する時期 次回の更新日
  • ユーザーは現在のサブスクリプションを期限まで保持します
  • サブスクリプションが期限切れになった後、自動的に新しいサブスクリプションが開始されます

例:

// User currently has: Premium Annual (Level 1)
// User downgrades to: Standard Monthly (Level 2)
// Result: Premium access continues until annual renewal date, then switches

同じレベルのサブスクリプションに切り替える 同じレベルのサブスクリプションに切り替える.

期間が異なる場合の動作は次のとおりです

期間が異なる → Native Purchases の動作を変更します ダウングレード

  • 次回の更新日以降に効果を発揮します
  • 例:月額プレミアム (レベル 1) → 年間プレミアム (レベル 1)

同じ期間 → Native Purchases の動作を変更します アップグレード

  • 即時効果
  • 例:プレミアム月額 (レベル 1) → アップルティム月額 (レベル 1)

サブスクリプション グループの作成

「サブスクリプション グループの作成」のセクション
  1. サブスクリプションに移動

    App Store Connectで、選択したアプリを選択し、 「Monetize > Subscriptions」.

  2. 「グループの作成」

    Click + 「グループの名前」

  3. グループの名前を選択してください。

    「プレミアムアクセス」

    • 「クラウドストレージプラン」
    • 「プロ機能」
    • 「サブスクリプションの追加」
  4. グループを作成した後、個々のサブスクリプションを追加します。各サブスクリプションにはレベルランキングが付与されます。

    「次へ」

  5. レベルランキングの設定

    サブスクリプションを値段の高い順に並べる

    • 年間プランは月額プランよりも高い順に並べる
    • 価格の高いプランは価格の低いプランよりも上に並べる
    • プレミアムプランは最高に並べる

アプリ内での使用

アプリ内での使用

native-purchases プラグインは自動的にサブスクリプション グループのロジックを処理します

import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
// Fetch all subscriptions in a group
const { products } = await NativePurchases.getProducts({
productIdentifiers: ['premium_monthly', 'premium_annual', 'ultimate_monthly'],
productType: PURCHASE_TYPE.SUBS,
});
// Display current subscription using StoreKit transactions
const { purchases } = await NativePurchases.getPurchases({
productType: PURCHASE_TYPE.SUBS,
});
const activeSubs = purchases.filter((purchase) => purchase.isActive);
// Detect pending downgrade/cancellation (StoreKit sets willCancel === true)
const pendingChange = purchases.find((purchase) => purchase.willCancel === true);
if (pendingChange) {
console.log('Subscription will stop auto-renewing on', pendingChange.expirationDate);
}
// Purchase (StoreKit handles upgrades/downgrades automatically)
await NativePurchases.purchaseProduct({
productIdentifier: 'premium_annual',
productType: PURCHASE_TYPE.SUBS,
});
// Listen for StoreKit updates (fires on upgrades/downgrades/refunds)
NativePurchases.addListener('transactionUpdated', (transaction) => {
console.log('Subscription updated:', transaction);
});

サブスクリプションの変更を処理する

サブスクリプションの変更を処理する

変更の種類を検出する

「変更タイプの検出」セクション
import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
// Get current subscription info
const { purchases } = await NativePurchases.getPurchases({
productType: PURCHASE_TYPE.SUBS,
});
const currentSubscription = purchases.find(
(purchase) => purchase.subscriptionState === 'subscribed',
);
if (currentSubscription) {
// StoreKit reports if user cancelled auto-renew
if (currentSubscription.willCancel) {
console.log(
`User cancelled. Access remains until ${currentSubscription.expirationDate}`,
);
}
if (currentSubscription.isUpgraded) {
console.log('User recently upgraded to this plan.');
}
}
// Listen for automatic upgrades/downgrades
NativePurchases.addListener('transactionUpdated', (transaction) => {
console.log('Subscription changed!', transaction);
if (transaction.subscriptionState === 'revoked') {
revokeAccess();
} else if (transaction.isActive) {
unlockPremiumFeatures();
}
});

ユーザーとのコミュニケーション

「ユーザーとのコミュニケーション」セクション

常に、変更の動作を明確に伝えます:

アップグレードの場合:

「プレミアム機能への即時アクセスが得られます。現在のサブスクリプションの割引が適用されます。」

ダウングレードの場合:

「プレミアムアクセスは[更新日]まで維持され、次に標準に切り替わります。」

クロスグレードの場合:

「次回の更新時点で、年間課金に切り替わります。[date]」

App Storeサーバーノーティフィケーション v2 または受領検証バックエンドを使用して、StoreKitの変更をデータベースに反映するために使用します。サーバーノーティフィケーションをリスナーと組み合わせて、クライアントとバックエンドを同期させます。 transactionUpdated ベストプラクティス

無関係な機能を混ぜない (例: ストレージと広告の削除)

異なる機能セットごとに別々のグループを作成する
  • レベルランキング戦略
  • ベストプラクティス
  • グループの組織

関連するサブスクリプションを同じグループに保持する

無関係な機能を混ぜない (例: ストレージと広告の削除)
  • 年間プラン → 月額プランと同じレベルで高レベル
  • 価格が高いレベル → 高レベル
  • 価格だけではなく価値を考慮する
  • 現在のサブスクリプションを明確に表示する
  • グループ内のすべてのオプションを表示する
  • 即時変更と再契約時変更を区別する
  • プランを簡単に切り替える
  • アップグレードシナリオのすべてのテスト
  • すべてのダウングレードシナリオをテストする
  • クロスグレード動作を検証する
  • ウェブホックの発火を確認する

共通シナリオ

共通シナリオ

シナリオ 1: 月額 3 つのレベル

シナリオ 1: 月額 3 つのレベル
Level 1: Ultimate Monthly ($19.99)
Level 2: Premium Monthly ($9.99)
Level 3: Basic Monthly ($4.99)
  • 基本 → プレミアム: 即時アップグレード
  • プレミアム → アンリミテッド: 即時アップグレード
  • アンリミテッド → プレミアム: 再契約時にダウングレード
  • 基本 → アンリミテッド: 即時アップグレード
Level 1: Premium Annual ($99.99/year)
Level 2: Premium Monthly ($9.99/month)
  • 月額 → 年額: 再契約時クロスグレード
  • 年額 → 月額: 再契約時ダウングレード
Level 1: Ultimate Annual ($199/year)
Level 2: Ultimate Monthly ($19.99/month)
Level 3: Premium Annual ($99/year)
Level 4: Premium Monthly ($9.99/month)
Level 5: Basic Annual ($49/year)
Level 6: Basic Monthly ($4.99/month)

この設定では、明確なアップグレード/ダウングレードロジックを維持しながら、最大限の柔軟性を提供します。

サブスクリプションがグループに表示されない場合

  • 正しいグループに割り当てられていることを確認してください
  • 少なくとも「提出準備中」という状態にありますか?
  • 製品IDが正しいことを確認してください

アップグレード/ダウン グレードの挙動が間違っている場合

  • レベルランキングを確認してください(1が最高)
  • サブスクリプションの階層が妥当かどうか確認してください
  • レベルが正しく設定されていることを確認してください

異なるグループの製品:

  • ユーザーは同時に複数のグループにサブスクライブできます
  • 関連する製品を同じグループに残すため、意図的にこのように設計されています

getActiveProductsが複数のサブスクリプションを表示している場合

  • サブスクリプションが異なるグループにありますか?
  • ユーザーがFamily Sharingを介してサブスクライブしていないことを確認する
  • App Store Connectでサブスクリプションの状態を確認する

詳細については、 サブスクリプション グループに関する公式のAppleドキュメントを参照してください.

「Create iOS Subscription Group」から続けてください

「Create iOS Subscription Group」から続けてください

「Create iOS Subscription Group」を使用している場合 「Create iOS Subscription Group」を使用して、ストアの承認と配布を計画している場合、@__CAPGO_KEEP_0__/native-purchasesと接続する __CAPGO_KEEP_0__ capgo native capability を使用する場合の @capgo/native-purchases @capgo/capacitor-アプリ内レビュー @capgo/capacitor-in-app-レビューの実装詳細のために @capgo/capacitor-アプリ内レビューの使用 native capability については、@capgo/capacitor-in-app-review を使用します。 @capgo/capacitor-native-market @capgo/capacitor-native-marketの実装詳細について @capgo/capacitor-ネイティブマーケットを使用 native capability の使用にあたっては、@capgo/capacitor-native-market を使用します。