Sauter au contenu

Créer un groupe d'abonnements iOS

GitHub

Les groupes de souscriptions sont essentiels pour organiser et gérer plusieurs niveaux de souscription dans votre application iOS. Comprendre comment ils fonctionnent est crucial pour mettre en œuvre la fonctionnalité d'amélioration, de dégradation et de croisement.

Qu'est-ce qu'un Groupe de Souscription?

Sous-titre « Qu'est-ce qu'un Groupe de Souscription ? »

Un groupe de souscription est une collection de souscriptions liées que les utilisateurs peuvent choisir entre. Les utilisateurs ne peuvent souscrire qu'à une seule souscription au sein d'un groupe à la fois. Lorsqu'ils changent de souscription, Apple gère automatiquement la transition.

Pourquoi les Groupes de Souscription sont importants

Sous-titre « Pourquoi les Groupes de Souscription sont importants »

Les groupes d'abonnements permettent :

  • Tarification échelonnée: Proposez des plans de base, premium et ultime
  • Diverses durées: Options mensuelles, annuelles et à vie
  • Logique de mise à niveau/diminution de niveau: Gestion automatique des changements d'abonnements
  • Gestion simplifiée: Groupez les abonnements liés ensemble

Dans un groupe, chaque abonnement doit être classé du plus élevé (niveau 1) au plus bas. Cette classification détermine comment les changements d'abonnement sont classés :

Hiérarchie du groupe d'abonnement

Niveau 1 (Valeur la plus élevée)

  • Annuel Premium ($99,99/an)
  • Mensuel Ultimate ($19,99/mois)

Niveau 2 (Valeur moyenne)

  • Annuel Standard ($49,99/an)
  • Mensuel Premium ($9,99/mois)

Niveau 3 __CAPGO_KEEP_0__

  • Tarif Annuel de Base (29,99 $ par an)
  • Tarif Mensuel de Base (4,99 $ par mois)

Apple gère automatiquement trois types de changements de souscription en fonction du niveau de classement :

Passer à un abonnement de niveau supérieur (par exemple, niveau 2 → niveau 1). Comportement :

__CAPGO_KEEP_1__

  • Prend effet immédiatement
  • L'utilisateur reçoit un remboursement partiel pour le temps restant
  • La nouvelle souscription commence tout de suite

Exemple :

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

Passer à un niveau inférieur abonnement (par exemple, niveau 1 → niveau 2).

Comportement :

  • Effet à partir de date de renouvellement suivante
  • L'utilisateur conserve son abonnement actuel jusqu'à la fin de la période
  • Un nouvel abonnement commence automatiquement après expiration

Exemple :

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

Passer à un autre abonnement au même niveau de tarification.

Le comportement dépend de la durée :

Différentes Durées → Comporte comme dégrader

  • Prend effet à la date de renouvellement suivante
  • Exemple : Abonnement mensuel Premium (Niveau 1) → Abonnement annuel Premium (Niveau 1)

Même Durée → Comporte comme améliorer

  • Prend effet immédiatement
  • Exemple : Abonnement mensuel Premium (Niveau 1) → Abonnement mensuel Ultimate (Niveau 1)

Créer un groupe d'abonnements

Créer un groupe d'abonnement
  1. Naviguez vers les abonnements

    Dans App Store Connect, sélectionnez votre application et allez à Monétiser > Abonnements.

  2. Créer un groupe

    Cliquez + à côté de « Groupe d'abonnements » pour créer un nouveau groupe.

  3. Nommez le groupe

    Choisissez un nom décrivant qui reflète les abonnements qu'il contient :

    • « Accès Premium »
    • « Plans de stockage Cloud »
    • « Fonctionnalités Pro »
  4. Ajouter des Abonnements

    Après avoir créé le groupe, ajoutez des abonnements individuels à celui-ci. Chaque abonnement aura un niveau de classement.

  5. Définir les Niveaux de Classement

    Organisez les abonnements de la valeur la plus élevée (1) à la valeur la plus basse. Considérez :

    • Les plans annuels classent généralement plus haut que les plans mensuels
    • Les tarifs plus élevés se situent au-dessus des tarifs moins élevés
    • Les tarifs ultimes/premières classent le plus haut

Le plugin native-purchases gère automatiquement la logique de groupe d'abonnements :

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

Communiquez toujours clairement le comportement de changement :

Pour les mises à niveau :

« Vous obtiendrez un accès immédiat aux fonctionnalités Premium. Nous proratiserons votre souscription actuelle. »

Pour les dégradations :

« Vous conserverez l'accès Premium jusqu'à la date de renouvellement, puis vous passerez à Standard. »

Pour les changements de niveau :

“Votre plan sera modifié pour un facturation annuelle à la prochaine renouvellement le [date].”

Utilisez les notifications de serveur d'App Store de Apple v2 ou votre propre backend de validation de récépissé pour refléter les modifications de StoreKit dans votre base de données. Associez les notifications de serveur avec le transactionUpdated écouteur afin que le client et le serveur restent synchronisés.

  • Gardez les abonnements liés dans le même groupe
  • N'associez pas des fonctionnalités non liées (par exemple, stockage et suppression de publicités)
  • Créez des groupes séparés pour différents ensembles de fonctionnalités
  • Plans annuels → Niveau supérieur que les plans mensuels (pour le même niveau)
  • Niveaux plus chers → Niveau supérieur
  • Considérer la valeur, et non seulement le prix
  • Afficher clairement la souscription actuelle
  • Afficher toutes les options disponibles dans le groupe
  • Indiquer les changements qui sont immédiats vs. à la renouvellement
  • Permettre un changement facile entre les plans
  • Tester tous les scénarios de mise à niveau
  • Tester tous les scénarios de dégradation
  • Vérifier le comportement de croisage
  • Vérifier l'envoi de webhook
Level 1: Ultimate Monthly ($19.99)
Level 2: Premium Monthly ($9.99)
Level 3: Basic Monthly ($4.99)
  • De base vers Premium : Mise à niveau (immédiate)
  • De Premium vers Ultimate : Mise à niveau (immédiate)
  • Ultime → Premium : Degrader (à la renouvellement)
  • De base → Ultime : Mise à niveau (immédiate)
Level 1: Premium Annual ($99.99/year)
Level 2: Premium Monthly ($9.99/month)
  • Mensuel → Annuel : Croiser (à la renouvellement)
  • Annuel → Mensuel : Degrader (à la renouvellement)
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)

Cette configuration offre la flexibilité maximale tout en maintenant une logique de mise à niveau/dégradation claire.

Abonnement ne s'affiche pas dans le groupe :

  • Vérifiez qu'il est affecté au groupe correct
  • Vérifiez qu'il est au moins en « Prêt à soumettre »
  • Assurez-vous que l'ID du produit est correct

Comportement de mise à niveau/dégradation incorrect :

  • Vérifiez les classements de niveau (1 = le plus élevé)
  • Vérifiez que les niveaux de souscription sont logiques
  • Vérifiez que les niveaux sont correctement configurés

Produits provenant de différents groupes :

  • Les utilisateurs peuvent s'abonner à plusieurs groupes simultanément
  • C'est intentionnel - gardez les produits liés dans le même groupe

getActiveProducts affichant plusieurs abonnements :

  • Vérifiez si les abonnements se trouvent dans différents groupes
  • Vérifiez que l'utilisateur n'est pas abonné via la partage familial
  • Vérifiez l'état d'abonnement dans App Store Connect

Pour plus de détails, consultez la documentation officielle d'Apple sur les groupes d'abonnements.

Continuez de la section « Créer un groupe d'abonnements iOS »

Section intitulée « Continuez de la section Créer un groupe d'abonnements iOS »

Si vous utilisez Créer un groupe d'abonnements iOS pour planifier l'approbation et la distribution de l'application, connectez-la à Utiliser @capgo/native-purchases pour la capacité native dans Utiliser @capgo/native-purchases, @capgo/capacitor-examen-en-ligne pour le détail d'implémentation dans @capgo/capacitor-examen-en-ligne, Utiliser @capgo/capacitor-examen-en-ligne pour la capacité native dans Utiliser @capgo/capacitor-examen-en-ligne, @capgo/capacitor-marché-natif pour le détail d'implémentation dans @capgo/capacitor-marché-natif, et Utiliser @capgo/capacitor-marché-natif pour la capacité native dans Utiliser @capgo/capacitor-marché-natif.