---
title: "Включение покупок в кастомном пейволе в iOS SDK"
description: "Интегрируйте Adapty SDK в свои кастомные iOS пейволы для поддержки встроенных покупок."
---

В этом гайде описана интеграция Adapty в кастомные пейволы. Вы сохраняете полный контроль над реализацией пейвола, а SDK Adapty берёт на себя загрузку продуктов, обработку новых покупок и восстановление предыдущих.
:::important
**Этот гайд предназначен для разработчиков, которые реализуют пользовательские пейволы.** Если вы хотите самый простой способ подключить покупки, воспользуйтесь [Adapty Flow Builder](ios-quickstart-paywalls). С Flow Builder вы создаёте флоу в визуальном редакторе без кода, Adapty автоматически берёт на себя всю логику покупок, а тестировать разные дизайны можно без повторной публикации приложения.
:::
## Перед началом работы \{#before-you-start\}

### Настройка продуктов \{#set-up-products\}

Чтобы подключить встроенные покупки, нужно разобраться в трёх ключевых понятиях:
- [**Продукты**](product) – всё, что пользователи могут купить (подписки, расходуемые покупки, пожизненный доступ)
- [**Пейволы**](paywalls) – конфигурации, определяющие, какие продукты предлагать. В Adapty пейволы — единственный способ получить продукты, но такой подход позволяет менять продукты, цены и офферы без изменений в коде приложения.
- [**Плейсменты**](placements) – где и когда показывать пейволы в приложении (например, `main`, `onboarding`, `settings`). Вы настраиваете пейволы для плейсментов в дашборде, а затем запрашиваете их по ID плейсмента в коде. Это упрощает проведение A/B-тестов и показ разных пейволов разным пользователям.
Убедитесь, что вы разобрались с этими концепциями, даже если используете собственный пейвол. По сути, это просто способ управлять продуктами, которые вы продаёте в приложении.

Чтобы реализовать собственный пейвол, нужно создать **пейвол** и добавить его в **плейсмент**. Это позволит вам получать свои продукты. Чтобы понять, что нужно сделать в дашборде, следуйте quickstart-гайду [здесь](quickstart).
### Управление пользователями \{#manage-users\}

Вы можете работать как с backend-аутентификацией на вашей стороне, так и без неё.

Однако Adapty SDK по-разному обрабатывает анонимных и идентифицированных пользователей. Прочитайте [гайд по идентификации](ios-quickstart-identify), чтобы разобраться в особенностях и правильно работать с пользователями.

## Шаг 1. Получите продукты \{#step-1-get-products\}

Чтобы получить продукты для вашего кастомного пейвола, нужно:

1. Получить объект `flow`, передав ID [плейсмента](placements) в метод `getFlow`.
2. Получить массив продуктов для этого флоу с помощью метода `getPaywallProducts`.

<Tabs groupId="current-os" queryString>

<TabItem value="swift" label="Swift" default>
```swift

func loadPaywall() async {
    do {
        let flow = try await Adapty.getFlow(placementId: "YOUR_PLACEMENT_ID")
        let products = try await Adapty.getPaywallProducts(flow: flow)

        // Use products to build your custom paywall UI
    } catch {
        // Handle the error
    }
}
```
</TabItem>

<TabItem value="swift-callback" label="Swift-Callback" default>
```swift

func loadPaywall() {
    Adapty.getFlow(placementId: "YOUR_PLACEMENT_ID") { result in
        switch result {
        case let .success(flow):
            Adapty.getPaywallProducts(flow: flow) { result in
                switch result {
                case let .success(products):
                    // Use products to build your custom paywall UI
                case let .failure(error):
                    // Handle the error
                }
            }
        case let .failure(error):
            // Handle the error
        }
    }
}
```
</TabItem>
</Tabs>
## Шаг 2. Обработка покупок \{#step-2-accept-purchases\}

Когда пользователь нажимает на продукт в вашем кастомном пейволе, вызовите метод `makePurchase` с выбранным продуктом. Это запустит процесс покупки и вернёт обновлённый профиль.

<Tabs groupId="current-os" queryString>

<TabItem value="swift" label="Swift" default>
```swift

func purchaseProduct(_ product: AdaptyPaywallProduct) async {
    do {
        let purchaseResult = try await Adapty.makePurchase(product: product)
        
        switch purchaseResult {
        case .userCancelled:
            // Пользователь отменил покупку
            break
        case .pending:
            // Покупка ожидает подтверждения (например, требуется разрешение родителей)
            break
        case let .success(profile, transaction):
            // Покупка успешна, профиль обновлён
            break
        }
    } catch {
        // Обработка ошибки
    }
}
```
</TabItem>
<TabItem value="swift-callback" label="Swift-Callback" default>
```swift

func purchaseProduct(_ product: AdaptyPaywallProduct) {
    Adapty.makePurchase(product: product) { result in
        switch result {
        case let .success(purchaseResult):
            switch purchaseResult {
            case .userCancelled:
                // Пользователь отменил покупку
                break
            case .pending:
                // Покупка ожидает подтверждения (например, ожидает родительского одобрения)
                break
            case let .success(profile, transaction):
                // Покупка успешна, профиль обновлён
                break
            }
        case let .failure(error):
            // Обработка ошибки
        }
    }
}
```
</TabItem>
</Tabs>
## Шаг 3. Восстановление покупок \{#step-3-restore-purchases\}

Apple требует, чтобы все приложения с подписками предоставляли пользователям возможность восстановить свои покупки. Хотя покупки восстанавливаются автоматически при входе в систему через Apple ID, вы всё равно обязаны добавить кнопку восстановления в своё приложение.

Вызывайте метод `restorePurchases`, когда пользователь нажимает на кнопку восстановления. Это синхронизирует историю покупок с Adapty и вернёт обновлённый профиль.

<Tabs groupId="current-os" queryString>

<TabItem value="swift" label="Swift" default>
```swift

func restorePurchases() async {
    do {
        let profile = try await Adapty.restorePurchases()
        // Restore successful, profile updated
    } catch {
        // Handle the error
    }
}
```
</TabItem>

<TabItem value="swift-callback" label="Swift-Callback" default>
```swift

func restorePurchases() {
    Adapty.restorePurchases { result in
        switch result {
        case let .success(profile):
            // Восстановление прошло успешно, профиль обновлён
        case let .failure(error):
            // Обработка ошибки
        }
    }
}
```
</TabItem>
</Tabs>
## Следующие шаги \{#next-steps\}

:::tip
Есть вопросы или возникли проблемы? Загляните на наш [форум поддержки](https://adapty.featurebase.app/), где можно найти ответы на распространённые вопросы или задать свой. Наша команда и сообщество всегда готовы помочь!
:::

Ваш пейвол готов к отображению в приложении. [Протестируйте покупки в режиме песочницы](test-purchases-in-sandbox), чтобы убедиться, что вы можете выполнить тестовую покупку через пейвол.

Затем [проверьте, совершили ли пользователи покупку](ios-check-subscription-status), чтобы решить, показывать пейвол или предоставить доступ к платным функциям.