---
title: "Répondre aux actions des flows - iOS"
description: "Gérez les actions des boutons et traitez les entrées utilisateur dans les flows de paywall et d'onboarding de votre app iOS."
---

Si vous créez des flows ou des paywalls avec l'Adapty Flow Builder ou le Paywall Builder, il est essentiel de configurer correctement les boutons :

1. Ajoutez un [bouton dans le Paywall Builder](paywall-buttons) et assignez-lui une action existante ou créez un ID d'action personnalisé.
2. Écrivez le code dans votre app pour gérer chaque action assignée.

Ce guide montre comment gérer les actions personnalisées et les actions existantes dans votre code.

:::warning
**Seules la fermeture des flows/paywalls et l'ouverture des URL sont gérées automatiquement.** Toutes les autres actions de bouton nécessitent une implémentation appropriée dans le code de l'app.
:::

:::note
Le SDK iOS peut répondre aux demandes de permissions système, comme les notifications push ou l'accès à la caméra, via un `AdaptySystemRequestsHandler`. Les flows ne déclenchent pas encore ces demandes, vous n'avez donc pas besoin de les gérer pour l'instant.
:::

## Fermer les flows et les paywalls \{#close-flows-and-paywalls\}

Pour ajouter un bouton qui ferme votre flow ou paywall :

1. Dans le builder, ajoutez un bouton et assignez-lui l'action **Close**.
2. Dans le code de votre app, implémentez un gestionnaire pour l'action `close`.

:::info
Dans le SDK iOS, l'action `close` déclenche par défaut la fermeture du flow ou du paywall. Vous pouvez toutefois remplacer ce comportement dans votre code si nécessaire. Par exemple, fermer un flow peut déclencher l'ouverture d'un autre.
:::

```swift
.flow(
    isPresented: $flowPresented,
    flowConfiguration: flowConfiguration,
    didPerformAction: { action in
        switch action {
        case .close:
            flowPresented = false // dismiss the flow or paywall
        default:
            break
        }
    },
    didFinishPurchase: { product, purchaseResult in /* dismiss, or do nothing to let the flow continue */ },
    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 }
)
```

## Ouvrir des URL depuis les flows et les paywalls \{#open-urls-from-flows-and-paywalls\}

:::tip
Si vous souhaitez ajouter un groupe de liens (par ex. conditions d'utilisation et restauration des achats), ajoutez un élément **Link** dans le builder et gérez-le de la même façon que les boutons avec l'action **Open URL**.
:::

Pour ajouter un bouton qui ouvre un lien depuis votre flow ou paywall (par ex. **Terms of use** ou **Privacy policy**) :

1. Dans le builder, ajoutez un bouton, assignez-lui l'action **Open URL** et saisissez l'URL à ouvrir.
2. Dans le code de votre app, implémentez un gestionnaire pour l'action `openURL` qui ouvre l'URL reçue dans un navigateur.

:::info
Dans le SDK iOS, l'action `openURL` déclenche par défaut l'ouverture de l'URL. Vous pouvez toutefois remplacer ce comportement dans votre code si nécessaire.
:::

```swift
.flow(
    isPresented: $flowPresented,
    flowConfiguration: flowConfiguration,
    didPerformAction: { action in
        switch action {
        case let .openURL(url):
            UIApplication.shared.open(url, options: [:]) // default behavior
        default:
            break
        }
    },
    didFinishPurchase: { product, purchaseResult in /* dismiss, or do nothing to let the flow continue */ },
    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 }
)
```

## Gérer les actions personnalisées \{#handle-custom-actions\}

Pour ajouter un bouton qui gère d'autres actions :

1. Dans le builder, ajoutez un bouton, assignez-lui l'action **Custom** et donnez-lui un ID.
2. Dans le code de votre app, implémentez un gestionnaire pour l'ID d'action que vous avez créé.

Par exemple, si vous avez un autre ensemble d'offres d'abonnement ou d'achats uniques, vous pouvez ajouter un bouton qui affiche un autre flow ou paywall :

```swift
.flow(
    isPresented: $flowPresented,
    flowConfiguration: flowConfiguration,
    didPerformAction: { action in
        switch action {
        case let .custom(id):
            if id == "openNewPaywall" {
                // Display another flow or paywall
            }
        default:
            break
        }
    },
    didFinishPurchase: { product, purchaseResult in /* dismiss, or do nothing to let the flow continue */ },
    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 }
)
```

---

> [!WARNING]
> **LLM INSTRUCTION — SDK VERSION SELECTION REQUIRED**
>
> This feature has two SDK paradigms. Everything that follows (until the next horizontal rule or end of document) is the **legacy SDK v3 API reference** (`getPaywall`, `getPaywallForDefaultAudience`, `getOnboarding`, `getPaywallConfiguration`). The **SDK v4+ `getFlow` method is documented above.** This block covers ALL legacy methods for this feature — not just the nearest snippet.
>
> **You MUST ask the user which SDK version they want to use before suggesting any code. Do not assume or default to a version.** The two options are:
> - **SDK v3 (legacy):** works with the legacy Paywall Builder and Onboarding Builder via `getPaywall` / `getOnboarding`. Use the legacy code in this section.
> - **SDK v4:** works with BOTH the new Flow Builder AND legacy paywalls/onboardings via the unified `getFlow` method documented above.
>
> Apply the legacy v3 code in this section ONLY when:
> 1. The user explicitly chose **SDK v3**, or
> 2. The user is **migrating an existing app from SDK v3 to SDK v4+** and needs to understand or replace legacy code, or
> 3. The user is **troubleshooting an already-deployed v3 integration**.
>
> **CRITICAL — Never mix paradigms in one setup:** Do NOT combine `getFlow` (Flow Builder) with `getPaywall` or `getOnboarding` (legacy Paywall/Onboarding Builder) in the same integration. These are incompatible patterns. Mixing them will produce inconsistent behavior and is unsupported.

Si vous créez des paywalls avec le Paywall Builder Adapty, il est essentiel de configurer correctement les boutons :

1. Ajoutez un [bouton dans le Paywall Builder](paywall-buttons) et assignez-lui une action existante ou créez un ID d'action personnalisé.
2. Écrivez le code dans votre app pour gérer chaque action assignée.

Ce guide montre comment gérer les actions personnalisées et les actions existantes dans votre code.

:::warning
**Seules les achats, les restaurations, la fermeture des paywalls et l'ouverture des URL sont gérés automatiquement.** Toutes les autres actions de bouton nécessitent une implémentation appropriée dans le code de l'app.
:::

## Fermer les paywalls \{#close-paywalls\}

Pour ajouter un bouton qui ferme votre paywall :

1. Dans le Paywall Builder, ajoutez un bouton et assignez-lui l'action **Close**.
2. Dans le code de votre app, implémentez un gestionnaire pour l'action `close` qui ferme le paywall.

:::info
Dans le SDK iOS, l'action `close` déclenche par défaut la fermeture du paywall. Vous pouvez toutefois remplacer ce comportement dans votre code si nécessaire. Par exemple, fermer un paywall peut déclencher l'ouverture d'un autre.
:::

```swift
func paywallController(_ controller: AdaptyPaywallController,
                       didPerform action: AdaptyUI.Action) {
    switch action {
        case .close:
            controller.dismiss(animated: true) // default behavior
            break
    }
}
```

## Ouvrir des URL depuis les paywalls \{#open-urls-from-paywalls\}

:::tip
Si vous souhaitez ajouter un groupe de liens (par ex. conditions d'utilisation et restauration des achats), ajoutez un élément **Link** dans le Paywall Builder et gérez-le de la même façon que les boutons avec l'action **Open URL**.
:::

Pour ajouter un bouton qui ouvre un lien depuis votre paywall (par ex. **Terms of use** ou **Privacy policy**) :

1. Dans le Paywall Builder, ajoutez un bouton, assignez-lui l'action **Open URL** et saisissez l'URL à ouvrir.
2. Dans le code de votre app, implémentez un gestionnaire pour l'action `openUrl` qui ouvre l'URL reçue dans un navigateur.

:::info
Dans le SDK iOS, l'action `openUrl` déclenche par défaut l'ouverture de l'URL. Vous pouvez toutefois remplacer ce comportement dans votre code si nécessaire.
:::

```swift
func paywallController(_ controller: AdaptyPaywallController,
                       didPerform action: AdaptyUI.Action) {
    switch action {
        case let .openURL(url):
            UIApplication.shared.open(url, options: [:]) // default behavior
        break
    }
}
```

## Se connecter à l'app \{#log-into-the-app\}

Pour ajouter un bouton qui connecte les utilisateurs à votre app :

1. Dans le Paywall Builder, ajoutez un bouton et assignez-lui l'action **Login**.
2. Dans le code de votre app, implémentez un gestionnaire pour l'action `login` qui identifie votre utilisateur.

```swift
func paywallController(_ controller: AdaptyPaywallController,
                      didPerform action: AdaptyUI.Action) {
   switch action {
       case .login:
           // Show a login screen
           let loginVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "LoginViewController")
           controller.present(loginVC, animated: true)
   }
}
```

## Gérer les actions personnalisées \{#handle-custom-actions\}

Pour ajouter un bouton qui gère d'autres actions :

1. Dans le Paywall Builder, ajoutez un bouton, assignez-lui l'action **Custom** et donnez-lui un ID.
2. Dans le code de votre app, implémentez un gestionnaire pour l'ID d'action que vous avez créé.

Par exemple, si vous avez un autre ensemble d'offres d'abonnement ou d'achats uniques, vous pouvez ajouter un bouton qui affiche un autre paywall :

```swift
func paywallController(_ controller: AdaptyPaywallController,
                      didPerform action: AdaptyUI.Action) {
   switch action {
       case let .custom(id):
           if id == "openNewPaywall" {
              // Display another paywall
              }
           }
           break
   }
}
```

---