Les skills couvrent l'intégration du SDK, la création de flows et de paywalls, les audits avant publication, la migration des placements et bien plus encore. Décrivez la tâche en langage courant et votre agent choisira le skill adapté.
Pour activer les achats intégrés, vous devez comprendre trois concepts clés :
Produits – tout ce que les utilisateurs peuvent acheter (abonnements, consommables, accès à vie)
Flows & paywalls – les écrans qui présentent les produits aux utilisateurs, créés dans le Flow & Paywall Builder sans code. Le SDK les récupère via getFlow. Si vous préférez construire l’interface dans votre propre code, consultez Implémenter des paywalls personnalisés.
Placements – où et quand vous affichez les flows & paywalls dans votre app (par exemple main, onboarding, settings). Vous les associez à des placements dans le tableau de bord, puis vous les demandez par ID de placement dans votre code. Cela facilite l’exécution de tests A/B et l’affichage de contenus différents selon les utilisateurs.
Adapty vous propose trois façons d’activer les achats dans votre application. Choisissez celle qui correspond à vos besoins :
Vous implémentez l’interface de votre paywall dans le code de votre application, mais récupérez quand même l’objet flow depuis Adapty pour garder de la flexibilité sur les offres de produits. Consultez le guide.
Mode Observateur
🔴 Difficile
Vous disposez déjà de votre propre infrastructure de gestion des achats et souhaitez continuer à l’utiliser. Notez que le mode observateur présente certaines limitations dans Adapty. Consultez l’article.
Important
Les étapes ci-dessous montrent comment intégrer un flow ou un paywall créé dans l’Adapty Flow & Paywall Builder.
Pour afficher un flow ou un paywall créé dans l’Adapty Flow & Paywall Builder dans votre application, il vous suffit de :
Récupérer le flow ou le paywall : Obtenez-le depuis Adapty.
Affichez-le et Adapty gère les achats pour vous : Intégrez la vue dans votre app.
Gérer les actions des boutons : Associez les interactions utilisateur aux réponses de votre app. Par exemple, ouvrir des liens ou fermer le paywall lorsque l’utilisateur clique sur un bouton.
Avant de commencer
Avant de commencer, effectuez les étapes suivantes :
Vos flows et paywalls sont associés à des placements configurés dans le tableau de bord. Les placements vous permettent d’afficher différents flows ou paywalls selon les audiences, ou de lancer des tests A/B.
Pour récupérer un flow ou un paywall créé dans l’Adapty Flow & Paywall Builder, vous devez :
Récupérer l’objet flow par l’ID du placement en utilisant la méthode getFlow, puis vérifier s’il contient une configuration de vue.
Récupérer la configuration de vue via la méthode getFlowConfiguration. Elle contient les éléments d’interface et le style nécessaires à l’affichage.
func loadFlow() async { let flow = try await Adapty.getFlow(placementId: "YOUR_PLACEMENT_ID") guard flow.hasViewConfiguration else { print("Flow doesn't have a view configuration") return } flowConfiguration = try await AdaptyUI.getFlowConfiguration(forFlow: flow)}
2. Afficher le flow ou le paywall
Maintenant que vous disposez de la configuration du flow, il suffit d’ajouter quelques lignes pour afficher votre flow ou votre paywall.
Avec SwiftUI, lors de l’affichage du flow, vous devez également gérer les événements. didFinishPurchase, didFailPurchase, didFinishRestore, didFailRestore et didReceiveError sont obligatoires. Pour les tests, vous pouvez simplement copier le code de l’extrait ci-dessous pour enregistrer ces événements.
Tip
Le flow ne se ferme pas automatiquement après un achat réussi. Dans didFinishPurchase, définissez votre binding de présentation sur false pour le fermer, ou ne faites rien pour laisser le flow continuer vers ses écrans suivants.
.flow( isPresented: $flowPresented, flowConfiguration: flowConfiguration, didFinishPurchase: { product, purchaseResult in print("Purchase finished successfully") flowPresented = false // or do nothing to let the flow continue }, didFailPurchase: { product, error in print("Purchase failed: \(error)") }, didFinishRestore: { profile in print("Restore finished successfully") }, didFailRestore: { error in print("Restore failed: \(error)") }, didReceiveError: { error in flowPresented = false print("Flow error: \(error)") })
Implémentez AdaptyFlowControllerDelegate pour gérer les événements. Au minimum, implémentez les quatre méthodes sans implémentation par défaut. Notez que le contrôleur ne se ferme pas automatiquement après un achat réussi — fermez-le dans didFinishPurchase, ou ne faites rien pour laisser le flow continuer vers ses écrans suivants :
Pour plus de détails sur la façon d’afficher un flow ou un paywall, consultez notre guide.
3. Gérer les actions des boutons
Lorsque les utilisateurs cliquent sur des boutons, le SDK iOS gère automatiquement les achats, la restauration, la fermeture de l’écran et l’ouverture des liens.
Cependant, d’autres boutons ont des IDs personnalisés ou prédéfinis et nécessitent une gestion des actions dans votre code. Vous pouvez également souhaiter remplacer leur comportement par défaut.
Par exemple, voici comment gérer le bouton de fermeture. Avec UIKit, le SDK ferme automatiquement le contrôleur quand .close se déclenche — ne le surchargez que si vous souhaitez un comportement personnalisé. Avec SwiftUI, vous devez vous-même définir votre binding isPresented à false.
Tip
Consultez nos guides pour gérer les actions et les événements des boutons.
.flow( isPresented: $flowPresented, flowConfiguration: flowConfiguration, didPerformAction: { action in switch action { case .close: flowPresented = false // dismiss the flow when the user taps close default: break } }, didFinishPurchase: { product, purchaseResult in flowPresented = false }, didFailPurchase: { product, error in /* handle the error */ }, didFinishRestore: { profile in /* check access level and dismiss */ }, didFailRestore: { error in /* handle the error */ }, didReceiveError: { error in flowPresented = false })
Des questions ou des problèmes ? Consultez notre forum d’assistance où vous trouverez des réponses aux questions fréquentes ou pourrez poser les vôtres. Notre équipe et notre communauté sont là pour vous aider !
Votre flow ou paywall est prêt à être affiché dans l’app. Testez vos achats en mode sandbox pour vous assurer de pouvoir effectuer un achat test.
Ensuite, vous devez vérifier le niveau d’accès des utilisateurs pour vous assurer d’afficher un paywall ou de donner accès aux fonctionnalités payantes aux bons utilisateurs.
Exemple complet
Voici comment toutes les étapes de ce guide peuvent être intégrées dans votre application.
struct ContentView: View { @State private var flowPresented = false @State private var flowConfiguration: AdaptyUI.FlowConfiguration? @State private var isLoading = false @State private var hasInitialized = false var body: some View { VStack { if isLoading { ProgressView("Loading...") } else { Text("Your App Content") } } .task { guard !hasInitialized else { return } await initializeFlow() hasInitialized = true } .flow( isPresented: $flowPresented, flowConfiguration: flowConfiguration, didPerformAction: { action in switch action { case .close: flowPresented = false default: break } }, didFinishPurchase: { product, purchaseResult in print("Purchase finished successfully") flowPresented = false // or do nothing to let the flow continue }, didFailPurchase: { product, error in print("Purchase failed: \(error)") }, didFinishRestore: { profile in print("Restore finished successfully") }, didFailRestore: { error in print("Restore failed: \(error)") }, didReceiveError: { error in print("Flow error: \(error)") flowPresented = false } ) } private func initializeFlow() async { isLoading = true defer { isLoading = false } await loadFlow() flowPresented = true } private func loadFlow() async { do { let flow = try await Adapty.getFlow(placementId: "YOUR_PLACEMENT_ID") guard flow.hasViewConfiguration else { print("Flow doesn't have a view configuration") return } flowConfiguration = try await AdaptyUI.getFlowConfiguration(forFlow: flow) } catch { print("Failed to load: \(error)") } }}