---
title: "Отображение флоу и пейволов — iOS"
description: "Отображение флоу и пейволов для пользователей в iOS-приложении."
---

<MethodPromo method="getFlow" label="Отображение флоу и пейволов" />

Если вы создали флоу или пейвол, вам не нужно беспокоиться об их отрисовке в коде мобильного приложения — всё, что должно быть показано и как именно, уже содержится внутри самого флоу или пейвола.

Чтобы получить объект `AdaptyUI.FlowConfiguration`, используемый ниже, см. [Получение флоу и пейволов](get-pb-paywalls).

## Отображение флоу и пейволов в SwiftUI \{#present-flows-and-paywalls-in-swiftui\}

### Отображение в виде модального окна \{#present-as-a-modal-view\}

Чтобы отобразить флоу или пейвол на экране устройства в виде модального окна, используйте модификатор `.flow` в SwiftUI. Минимальный вызов требует `isPresented`, `flowConfiguration` и пяти обязательных колбэков:
```swift showLineNumbers title="SwiftUI"
.flow(
    isPresented: $flowPresented,
    flowConfiguration: <AdaptyUI.FlowConfiguration>,
    didFinishPurchase: { _, _ in /* dismiss, or do nothing to let the flow continue */ },
    didFailPurchase: { _, _ in /* handle the error */ },
    didFinishRestore: { _ in /* check access level and dismiss */ },
    didFailRestore: { _ in /* handle the error */ },
    didReceiveError: { _ in flowPresented = false }
)
```

Для более тонкого управления добавьте необязательные колбэки, например `didPerformAction`, для обработки нажатий на кнопки:
```swift showLineNumbers title="SwiftUI"
@State var flowPresented = false // ensure that you manage this variable state and set it to `true` at the moment you want to show the flow or paywall

var body: some View {
  Text("Hello, AdaptyUI!")
      .flow(
          isPresented: $flowPresented,
          flowConfiguration: <AdaptyUI.FlowConfiguration>,
          didPerformAction: { action in
              switch action {
                  case .close:
                      flowPresented = false
                  default:
                      // Handle other actions
                      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 }
      )
}
```

Parameters:
| Параметр               | Обязательный | Описание                                                                                                                                                                                                                                                                   |
|:-----------------------|:-------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **isPresented**        | обязательный | Привязка, управляющая отображением флоу или пейвола.                                                                                                                                                                                                                       |
| **flowConfiguration**  | обязательный | Объект `AdaptyUI.FlowConfiguration`, содержащий визуальные данные флоу или пейвола. Используйте метод `AdaptyUI.getFlowConfiguration(forFlow:)`. Подробнее см. в разделе [Получение флоу и пейволов](get-pb-paywalls).                                                      |
| **didFinishPurchase**  | обязательный | Вызывается при успешном завершении `Adapty.makePurchase()`. Флоу не закрывается автоматически — здесь нужно установить привязку представления в `false` или оставить всё как есть, чтобы флоу продолжил работу после покупки.                                               |
| **didFailPurchase**    | обязательный | Вызывается при ошибке `Adapty.makePurchase()`.                                                                                                                                                                                                                             |
| **didFinishRestore**   | обязательный | Вызывается при успешном завершении `Adapty.restorePurchases()`.                                                                                                                                                                                                            |
| **didFailRestore**     | обязательный | Вызывается при ошибке `Adapty.restorePurchases()`.                                                                                                                                                                                                                         |
| **didReceiveError**    | обязательный | Вызывается при ошибке рендеринга или ошибке выполнения в скрипте флоу (например, исключение JavaScript, код `AdaptyUIError` `4105`). При ошибках рендеринга [обратитесь в поддержку Adapty](mailto:support@adapty.io).                                                     |
| **fullScreen**         | необязательный | Определяет, отображается ли флоу или пейвол в полноэкранном режиме или как sheet. По умолчанию `true`.                                                                                                                                                                    |
| **didAppear**          | необязательный | Вызывается, когда флоу или пейвол был показан.                                                                                                                                                                                                                             |
| **didDisappear**       | необязательный | Вызывается, когда флоу или пейвол был закрыт.                                                                                                                                                                                                                              |
| **didPerformAction**   | необязательный | Вызывается при нажатии пользователем на кнопку. Два идентификатора действий предопределены: `close` и `openURL`; остальные задаются в билдере.                                                                                                                              |
| **didSelectProduct**   | необязательный | Вызывается, когда пользователь или система выбирает продукт для покупки.                                                                                                                                                                                                   |
| **didStartPurchase**   | необязательный | Вызывается, когда пользователь начинает процесс покупки.                                                                                                                                                                                                                   |
| **didFinishWebPaymentNavigation** | необязательный | Вызывается по завершении навигации при веб-оплате.                                                                                                                                                                                                          |
| **didStartRestore**    | необязательный | Вызывается, когда пользователь начинает процесс восстановления покупок.                                                                                                                                                                                                    |
| **didFailLoadingProducts** | необязательный | Вызывается при ошибках загрузки продуктов. Верните `true`, чтобы повторить загрузку.                                                                                                                                                                                  |
| **didPartiallyLoadProducts** | необязательный | Вызывается при частичной загрузке продуктов.                                                                                                                                                                                                                         |
| **showAlertItem**      | необязательный | Привязка, управляющая отображением элементов предупреждения поверх флоу или пейвола.                                                                                                                                                                                       |
| **showAlertBuilder**   | необязательный | Функция для рендеринга представления предупреждения.                                                                                                                                                                                                                       |
| **placeholderBuilder** | необязательный | Функция для рендеринга placeholder-представления во время загрузки флоу или пейвола. По умолчанию используется `ProgressView`.                                                                                                                                             |
Подробнее о параметрах см. в разделе [iOS — Обработка событий](ios-handling-events).
### Представление в виде немодального окна \{#present-as-a-non-modal-view\}

Вы также можете представлять флоу и пейволы как пункты навигации или встроенные представления в навигационном флоу вашего приложения. Используйте `AdaptyFlowView` непосредственно в SwiftUI-представлениях:
```swift showLineNumbers title="SwiftUI"
AdaptyFlowView(
    flowConfiguration: <AdaptyUI.FlowConfiguration>,
    didFinishPurchase: { product, purchaseResult in
        // Dismiss the view, or do nothing to let the flow continue
    },
    didFailPurchase: { product, error in
        // Handle purchase failure
    },
    didFinishRestore: { profile in
        // Handle successful restore
    },
    didFailRestore: { error in
        // Handle restore failure
    },
    didReceiveError: { error in
        // Handle the error (rendering or JS exception from the flow script).
    }
)
```

## Отображение флоу и пейволов в UIKit \{#present-flows-and-paywalls-in-uikit\}

Чтобы отобразить флоу или пейвол на экране устройства, выполните следующие шаги:

1. Инициализируйте визуальный флоу, который хотите отобразить, с помощью метода `AdaptyUI.flowController(with:delegate:)`:

     ```swift showLineNumbers title="Swift"
     import AdaptyUI

     let visualFlow = try AdaptyUI.flowController(
         with: <AdaptyUI.FlowConfiguration>,
         delegate: <AdaptyFlowControllerDelegate>
     )
     ```

    Параметры запроса:
| Параметр                 | Обязательный | Описание |
   | :----------------------- | :------- | :---------- |
   | **flowConfiguration**    | required | Объект `AdaptyUI.FlowConfiguration`, содержащий визуальные детали флоу или пейвола. Используйте метод `AdaptyUI.getFlowConfiguration(forFlow:)`. Подробнее — в разделе [Получение флоу и пейволов](get-pb-paywalls). |
   | **delegate**             | required | `AdaptyFlowControllerDelegate` для прослушивания событий флоу и пейвола. Подробнее — в разделе [Обработка событий флоу и пейвола](ios-handling-events). |

    Возвращает:
| Объект                  | Описание                                                 |
   | :---------------------- | :------------------------------------------------------- |
   | **AdaptyFlowController** | Объект, представляющий запрошенный флоу или экран пейвола. |

2. После того как объект успешно создан, его можно отобразить на экране устройства:

   ```swift showLineNumbers title="Swift"
   present(visualFlow, animated: true)
   ```

:::tip
Хотите увидеть реальный пример интеграции Adapty SDK в мобильное приложение? Ознакомьтесь с нашими [примерами приложений](sample-apps), которые демонстрируют полную настройку: отображение пейволов, совершение покупок и другой базовый функционал.

:::

---

> [!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.

Если вы настроили пейвол с помощью Paywall Builder, вам не нужно беспокоиться о его рендеринге в коде мобильного приложения для отображения пользователю. Такой пейвол содержит как то, что должно быть показано, так и то, как именно это должно отображаться.
Чтобы получить объект `AdaptyUI.PaywallConfiguration`, используемый ниже, см. раздел [Получение пейволов Paywall Builder и их конфигурации](get-pb-paywalls).
## Отображение пейволов в SwiftUI \{#present-paywalls-in-swiftui\}

### Отображение в виде модального окна \{#present-as-a-modal-view\}

Чтобы отобразить визуальный пейвол на экране устройства в виде модального окна, используйте модификатор `.paywall` в SwiftUI:
```swift showLineNumbers title="SwiftUI"
@State var paywallPresented = false // ensure that you manage this variable state and set it to `true` at the moment you want to show the paywall

var body: some View {
  Text("Hello, AdaptyUI!")
      .paywall(
          isPresented: $paywallPresented,
          paywallConfiguration: <AdaptyUI.PaywallConfiguration>,
          didPerformAction: { action in
              switch action {
                  case .close:
                      paywallPresented = false
                  default:
                      // Handle other actions
                      break
              }
          },
          didFinishPurchase: { product, profile in paywallPresented = false },
          didFailPurchase: { product, error in /* handle the error */ },
          didFinishRestore: { profile in /* check access level and dismiss */  },
          didFailRestore: { error in /* handle the error */ },
          didFailRendering: { error in paywallPresented = false }
      )
}
```

Parameters:
| Параметр                          | Обязателен | Описание                                                                                                                                                                                                                                                                                                                                     |
|:----------------------------------|:-----------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **isPresented**                   | обязателен | Биндинг, управляющий отображением экрана пейвола.                                                                                                                                                                                                                                                                                            |
| **paywallConfiguration**          | обязателен | Объект `AdaptyUI.PaywallConfiguration`, содержащий визуальные параметры пейвола. Используйте метод `AdaptyUI.paywallConfiguration(for:products:viewConfiguration:observerModeResolver:tagResolver:timerResolver:)`. Подробнее см. в разделе [Получение пейволов Paywall Builder и их конфигурации](get-pb-paywalls). |
| **didFailPurchase**               | обязателен | Вызывается при ошибке `Adapty.makePurchase()`.                                                                                                                                                                                                                                                                                               |
| **didFinishRestore**              | обязателен | Вызывается при успешном завершении `Adapty.restorePurchases()`.                                                                                                                                                                                                                                                                              |
| **didFailRestore**                | обязателен | Вызывается при ошибке `Adapty.restorePurchases()`.                                                                                                                                                                                                                                                                                           |
| **didFailRendering**              | обязателен | Вызывается при ошибке рендеринга интерфейса. В этом случае [обратитесь в поддержку Adapty](mailto:support@adapty.io).                                                                                                                                                                                                                        |
| **fullScreen**                    | опционален | Определяет, отображается ли пейвол в полноэкранном режиме или как модальное окно. По умолчанию `true`.                                                                                                                                                                                                                                       |
| **didAppear**                     | опционален | Вызывается, когда представление пейвола было показано.                                                                                                                                                                                                                                                                                       |
| **didDisappear**                  | опционален | Вызывается, когда представление пейвола было скрыто.                                                                                                                                                                                                                                                                                         |
| **didPerformAction**              | опционален | Вызывается при нажатии пользователем кнопки. У разных кнопок разные идентификаторы действий. Два идентификатора заданы заранее: `close` и `openURL`; остальные — пользовательские и задаются в билдере.                                                                                                                                       |
| **didSelectProduct**              | опционален | Вызывается, если продукт был выбран для покупки (пользователем или системой).                                                                                                                                                                                                                                                                |
| **didStartPurchase**              | опционален | Вызывается, когда пользователь начинает процесс покупки.                                                                                                                                                                                                                                                                                     |
| **didFinishPurchase**             | опционален | Вызывается при успешном завершении `Adapty.makePurchase()`.                                                                                                                                                                                                                                                                                  |
| **didFinishWebPaymentNavigation** | опционален | Вызывается при завершении навигации веб-платежа.                                                                                                                                                                                                                                                                                             |
| **didStartRestore**               | опционален | Вызывается, когда пользователь начинает процесс восстановления покупок.                                                                                                                                                                                                                                                                      |
| **didFailLoadingProducts**        | опционален | Вызывается при ошибках загрузки продуктов. Верните `true`, чтобы повторить загрузку.                                                                                                                                                                                                                                                         |
| **didPartiallyLoadProducts**      | опционален | Вызывается, когда продукты загружены частично.                                                                                                                                                                                                                                                                                               |
| **showAlertItem**                 | опционален | Биндинг, управляющий отображением элементов алерта поверх пейвола.                                                                                                                                                                                                                                                                           |
| **showAlertBuilder**              | опционален | Функция для рендеринга представления алерта.                                                                                                                                                                                                                                                                                                 |
| **placeholderBuilder**            | опционален | Функция для рендеринга представления-заглушки, пока пейвол загружается.                                                                                                                                                                                                                                                                      |
Подробнее о параметрах см. в разделе [iOS — Обработка событий](ios-handling-events).
### Отображение в виде немодального представления \{#present-as-a-non-modal-view\}

Пейволы также можно встраивать как навигационные экраны или встроенные представления в навигационный флоу вашего приложения. Используйте `AdaptyPaywallView` напрямую в SwiftUI-представлениях:
```swift showLineNumbers title="SwiftUI"
AdaptyPaywallView(
    paywallConfiguration: <AdaptyUI.PaywallConfiguration>,
    didFailPurchase: { product, error in
        // Handle purchase failure
    },
    didFinishRestore: { profile in
        // Handle successful restore
    },
    didFailRestore: { error in
        // Handle restore failure
    },
    didFailRendering: { error in
        // Handle rendering error
    }
)
```

## Отображение пейволов в UIKit \{#present-paywalls-in-uikit\}

Чтобы отобразить визуальный пейвол на экране устройства, выполните следующие шаги:

1. Инициализируйте визуальный пейвол, который хотите отобразить, с помощью метода `.paywallController(for:products:viewConfiguration:delegate:)`:

     ```swift showLineNumbers title="Swift"
     import AdaptyUI

     let visualPaywall = AdaptyUI.paywallController(
         with: <paywall configuration object>,
         delegate: <AdaptyPaywallControllerDelegate>
     )
     ```

    Параметры запроса:
| Параметр                | Наличие | Описание |
   | :----------------------- | :------- | :---------- |
   | **paywall configuration**         | required | Объект `AdaptyUI.PaywallConfiguration`, содержащий визуальные детали пейвола. Используйте метод `AdaptyUI.getPaywallConfiguration(forPaywall:locale:)`. Подробнее см. в разделе [Получение пейволов Paywall Builder и их конфигурации](get-pb-paywalls). |
   | **delegate**            | required | `AdaptyPaywallControllerDelegate` для обработки событий пейвола. Подробнее см. в разделе [Обработка событий пейвола](ios-handling-events). |
Возвращает:

    | Объект                  | Описание                                          |
    | :---------------------- | :--------------------------------------------------- |
    | **AdaptyPaywallController** | Объект, представляющий запрошенный экран пейвола |

2. После успешного создания объекта его можно отобразить на экране устройства:

   ```swift showLineNumbers title="Swift"
   present(visualPaywall, animated: true)
   ```

:::tip
Хотите увидеть реальный пример интеграции Adapty SDK в мобильное приложение? Посмотрите наши [примеры приложений](sample-apps) — они демонстрируют полную настройку, включая отображение пейволов, совершение покупок и другие базовые функции.

:::

---