コンテンツにスキップ

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

GitHub

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

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

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

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

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

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

サブスクリプショングループにより

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

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

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

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

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

レベル 1 (最高値)

  • プレミアム年間 ($99.99/年)
  • アクティベート月額 ($19.99/月)

レベル 2 (中間値)

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

レベル 3 (最低値)

  • ベーシック年間 ($29.99/年)
  • スタンダード月額 ($4.99/月)

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

より高いレベルのサブスクリプションに切り替えること (例: レベル2 → レベル1) 動作: 即時効果

ユーザーは割引を受けます

  • Moving to a higher-tier subscription (e.g., level 2 → level 1). Behavior:
  • Takes effect immediately User receives prorated refund 残り期間
  • 新規サブスクリプションはすぐに始まります

例:

// 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

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

期間が異なる場合の動作は次のようになる

異なる期間 → ダウングレードと同じ動作をする ダウングレードと同じ動作をする

  • 次回更新日以降に有効
  • 例:月額プレミアム(レベル1)→ 年額プレミアム(レベル1)

同じ期間 → そのような動作 アップグレード

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

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

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

    App Store Connectでアプリを選択し、Monetize > サブスクリプションに移動 Monetize.

  2. グループを作成

    「サブスクリプション グループ」をクリック + 「サブスクリプション グループ」をクリックして新しいグループを作成

  3. グループ名を設定

    グループ名を選択して、グループに含まれるサブスクリプションを反映させてください

    • プレミアム アクセス
    • クラウド ストレージ プラン
    • プロ機能
  4. サブスクリプションを追加

    グループを作成した後、個々のサブスクリプションを追加してください。各サブスクリプションにはレベルランキングが設定されます。

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

    サブスクリプションを値段の高い順 (1) から低い順に並べるようにしてください。考慮すべき点は

    • 年間プランは通常月額プランよりもランクが高い
    • 価格が高いレベルは価格が低いレベルよりも上にランク付けされる
    • 最高/プレミアムレベルは最高ランク

ネイティブ購入プラグインは自動的にサブスクリプション グループ ロジックを処理します:

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();
}
});

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

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

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

アップグレードの場合:

“You’ll get immediate access to Premium features. We’ll prorate your current subscription.”

ダウングレードの場合:

“You’ll keep Premium access until [renewal date], then switch to Standard.”

クロスグレードの場合:

“Your plan will change to Annual billing at the next renewal on [date].”

サーバー監視

「サーバー監視」

AppleのApp Store Server Notifications 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)
  • 基本 → プレミアム: 即時アップグレード
  • プレミアム → アンリミテッド: 即時アップグレード
  • アンリミテッド → プレミアム: 再契約時にダウングレード
  • 基本 → アンリミテッド: 即時アップグレード

シナリオ 2: 混合期間のプラン

シナリオ 2: 混合期間のプラン
Level 1: Premium Annual ($99.99/year)
Level 2: Premium Monthly ($9.99/month)
  • 月額 → 年額: 再契約時クロスグレード
  • 年額 → 月額: 再契約時ダウングレード

シナリオ 3: 多層多期間

「シナリオ 3: 多層多期間」
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で複数のサブスクリプションが表示される場合:

  • サブスクリプションが異なるグループに所属していることを確認してください。
  • ファミリー共有を介してサブスクライブしていないことを確認してください。
  • App Store Connectでサブスクリプションの状態を確認してください。

関連リソース

「関連リソース」

詳細については、 公式のAppleドキュメントの「サブスクリプション グループ」.

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

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

Capgoを使用している場合 Create iOS Subscription Group ストアの承認と配布を計画するためにCapgoを使用している場合、 Using @capgo/native-purchases Using @capgo/native-purchasesのネイティブ機能 Using @capgo/capacitor-in-app-review Capacitorの実装詳細については@capgo/capacitor-in-app-reviewを参照してください。 Capacitorの@capgo/capacitor-in-app-reviewを使用します。 Capacitorのネイティブ機能については、Capacitorの@capgo/capacitor-in-app-reviewを参照してください。 Capacitorの@capgo/capacitor-native-marketを使用します。 Capacitorの実装詳細については@capgo/capacitor-native-marketを参照してください。また、 Capacitorの@capgo/capacitor-native-marketを使用します。 Capacitorのネイティブ機能については、Capacitorの@capgo/capacitor-native-marketを参照してください。