コンテンツにスキップ

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

GitHub

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

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

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

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

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

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

段階的な価格設定

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

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

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

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

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

: レベル 1 最高値

  • プレミアム年間 ($99.99/年)
  • アクティブな月額 ($19.99/月)

レベル 2 中間値

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

レベル 3 最低値

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

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

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

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

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

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

  • 1. Upgrade Section titled “1. Upgrade”
  • Moving to a higher-tier 残り時間
  • 新規サブスクリプションはすぐに始まります

例:

// 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 > サブスクリプションに移動 Cloudflare.

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

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

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

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

アップグレードの場合:

“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].”

サーバー監視

「サーバー監視」

App Store Server Notifications v2を使用するか、独自の受領検証バックエンドを使用して、StoreKitの変更をデータベースに反映するために、AppleのApp Store Server Notifications v2または独自の受領検証バックエンドを使用します。サーバー通知をデータベースの変更と組み合わせてください。 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でサブスクリプションの状態を確認してください。

関連リソース

「関連リソース」

詳細については、 iOS サブスクリプション グループに関する公式の 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 Capgoの実装詳細については@capgo/capacitor-in-app-reviewを参照してください。 Capgoの@capgo/capacitor-in-app-reviewを使用します。 Capgoのネイティブ機能については、Using @capgo/capacitor-in-app-reviewを参照してください。 Capgoの@capgo/capacitor-native-marketを使用します。 Capgoの@capgo/capacitor-native-marketの実装詳細については、@capgo/capacitor-native-marketを参照してください。 CapgoのUsing @capgo/capacitor-native-marketを使用します。 Capgoのネイティブ機能については、Using @capgo/capacitor-native-marketを参照してください。