コンテンツにスキップ

Create iOS Subscription Group

GitHub

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

サブスクリプショングループとは何ですか?

サブスクリプショングループとは何ですか?

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

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

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

サブスクリプショングループにより次のことが可能になります。

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

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

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

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

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

レベル例

「レベル例」

(最高値) サブスクリプション グループの階層

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

レベル 2 (中間の価値)

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

レベル 3 (最低の価値)

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

サブスクリプションの変更タイプ

サブスクリプションの変更タイプのセクション

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

より高いレベルのサブスクリプションに移行する より高いレベルのサブスクリプション (例:レベル 2 → レベル 1). 動作:

即座に効果を発揮

  • ユーザーは残りの時間に対して割引を受けます 残りの時間に対する割引
  • Appleは、レベルランキングに基づいて、3つのサブスクリプション変更のタイプを自動的に処理します。 1. アップグレード より高いレベルのサブスクリプションに移行する
  • 新規サブスクリプションはすぐに始まります

例:

// 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) 動作:

次回の更新日以降に効果

  • ユーザーは現在のサブスクリプションを利用するまでの期間を維持 protectedTokens
  • protectedTokens
  • 期限が切れた後、新しいサブスクリプションは自動的に開始されます。

例:

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

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

期間が異なる場合の動作は

異なる期間 → ダウングレードと同じ動作 次回の更新日付で効果を発揮

  • protectedTokens
  • 例: 月額プレミアム (レベル 1) → 年額プレミアム (レベル 1)

同じ期間 → 以下のように動作 アップグレード

  • 即時効果
  • 例: プレミアム月額 (レベル 1) → アップルトゥエイト月額 (レベル 1)

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

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

    App Store Connect にアクセスし、 Monetize > サブスクリプション.

  2. グループを作成

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

  3. グループ名を設定

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

    • 「プレミアム アクセス」
    • 「クラウド ストレージ プラン」
    • 「プロ フィーチャー」
  4. サブスクリプションを追加

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

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

    サブスクリプションを高値から低値まで並べ替えてください。考慮すべき事項は次の通りです。

    • 年間プランは月額プランよりもランクが高いことが多いです
    • 価格の高い層は価格の低い層よりも上にランク付けされます。
    • 最高/プレミアム層は最高のランク付けです。

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

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

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

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

変更の動作を明確に伝えましょう:

アップグレードの場合:

「プレミアム機能に即時アクセスできます。現在のサブスクリプションを割引します。」

ダウングレードの場合:

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

クロスグレードの場合:

「次回の更新日[日付]に、年間課金プランに切り替わります。」

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)

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

トラブルシューティング

「トラブルシューティング」

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

  • 正しいグループに割り当てられていることを確認する
  • 「Ready to Submit」状態以上であることを確認する
  • 製品 ID が正しいことを確認する

アップグレード/ダウングレードの不正解:

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

グループ間の製品:

  • ユーザーは複数のグループに同時にサブスクライブできる
  • これは意図的な動作 - 関連する製品は同じグループに残す

getActiveProducts で複数のサブスクリプションが表示される場合:

  • サブスクリプションが異なるグループに所属しているかどうか確認する
  • ユーザーがファミリー シェアリングを通じてサブスクライブしていないかどうか確認する
  • App Store Connect でサブスクリプションの状態を確認する

追加のリソース

追加リソース

詳細については、 公式のAppleドキュメントの購入グループ.

Create iOS Subscription Groupから続ける

Create iOS Subscription Groupから続ける

Create iOS Subscription Groupを使用している場合 Create iOS Subscription Group Create iOS Subscription Groupを使用してストアの承認と配布を計画している場合、 Using @capgo/native-purchases Using @capgo/native-purchasesのネイティブ機能 @capgo/capacitor-in-app-review @capgo/capacitor-in-app-reviewの実装詳細 Using @capgo/capacitor-in-app-review for the native capability in Using @capgo/capacitor-in-app-review, @capgo/capacitor-native-market for the implementation detail in @capgo/capacitor-native-market, and Using @capgo/capacitor-native-market for the native capability in Using @capgo/capacitor-native-market.