Contrôler les messages App Store dans le SDK iOS

L’App Store doit parfois afficher un message à vos utilisateurs concernant leur abonnement : leur demander de consentir à une hausse de prix, les informer d’un problème de facturation, ou leur présenter une offre de reconquête. Par défaut, StoreKit affiche ces messages tout seul lorsque votre application est ouverte — même par-dessus un paywall, un onboarding ou un écran de paiement.

Pour choisir vous-même le bon moment, passez le SDK Adapty en gestion manuelle des messages. Le SDK ajoute alors chaque message à une liste en attente, et votre application affiche cette liste lorsqu’elle appelle showStoreMessages.

Warning

En mode manuel, StoreKit n’affiche pas les messages automatiquement. Si votre application n’appelle jamais showStoreMessages, les utilisateurs ne verront jamais de demande de consentement à une augmentation de prix ni d’avis de problème de facturation.

Avant de commencer

Vous avez besoin de :

  • Adapty iOS SDK 4.2 ou version ultérieure : les versions antérieures ne disposent pas de l’API des messages du store.
  • iOS 16, Mac Catalyst 16, ou visionOS 1 ou version ultérieure sur l’appareil de l’utilisateur : StoreKit ne transmet pas les messages aux applications sur les versions antérieures. L’API des messages du store n’est pas disponible sur macOS.

Activer la gestion manuelle

Pour capturer les messages de l’App Store, définissez storeMessagesHandling sur .manual lors de l’activation du SDK :

let configurationBuilder = AdaptyConfiguration
    .builder(withAPIKey: "YOUR_PUBLIC_SDK_KEY")
    .with(storeMessagesHandling: .manual) // .auto is the default

Le SDK commence à capturer les messages dès son activation et les conserve en mémoire pour la session d’application en cours. Avec la valeur par défaut .auto, le SDK ne capture rien, et getPendingStoreMessageTypes ainsi que showStoreMessages ne font rien.

Obtenir les types de messages en attente

Pour savoir si des messages sont en attente, appelez getPendingStoreMessageTypes. Cette méthode renvoie les types des messages en attente sans les afficher ni les supprimer :

let pendingTypes = await Adapty.getPendingStoreMessageTypes()

if pendingTypes.contains(.billingIssue) {
    // Par exemple, ignorer l'upsell et afficher le message de facturation en premier
}

Chaque message possède l’un des types suivants :

TypeMessage
.genericUn message App Store générique.
.priceIncreaseConsentUne demande de consentement à une augmentation de prix d’abonnement.
.billingIssueUn avis concernant un problème de facturation d’abonnement. Disponible sur iOS 16.4 et ultérieur.
.winBackOfferUne offre de reconquête éligible. Disponible sur iOS 18 et ultérieur.

Un type de message non reconnu par le SDK a la valeur brute storekit_<number>.

Afficher les messages en attente

Lorsque votre application atteint un point où une fenêtre système n’interrompra pas l’utilisateur — par exemple, après que l’utilisateur a fermé un flow ou terminé un onboarding — appelez showStoreMessages :

Le SDK affiche les messages les uns après les autres. Après que StoreKit a affiché un message, le SDK le retire de la liste en attente. Si StoreKit échoue à afficher un message, le SDK enregistre l’erreur dans le journal Adapty, conserve le message pour le prochain appel et continue avec les autres messages.

Afficher uniquement certains types de messages

Pour n’afficher que certains messages en attente, passez les types dans for. Les autres messages restent en attente :

try await Adapty.showStoreMessages(
    for: [.billingIssue, .priceIncreaseConsent],
    using: displayStoreKitMessage
)

Sans for, le SDK affiche tous les messages en attente, y compris les types qu’il ne reconnaît pas.

Erreurs

showStoreMessages lève une AdaptyError avec l’un de ces codes :

CodeNomCause
3201operationInProgressUn autre appel showStoreMessages affiche encore des messages. Attendez qu’il se termine, puis réessayez.
3202resolverFailureUIKit uniquement : vous n’avez pas passé de scène, et le SDK n’a trouvé aucune scène active au premier plan. Appelez la méthode à nouveau lorsque votre application est au premier plan, ou passez la scène explicitement.
9000operationInterruptedLa tâche qui a appelé la méthode a été annulée.