Включение покупок с помощью Flow Builder в Unity SDK

Этот гайд использует API Adapty Unity SDK v4 (beta). Если вы используете v3, обратитесь к гайду по миграции за соответствующими названиями методов.

Чтобы подключить встроенные покупки, нужно разобраться в трёх ключевых концепциях:

  • Products – всё, что пользователи могут купить (подписки, расходуемые покупки, пожизненный доступ)
  • Flows – последовательности экранов, которые представляют продукты пользователям, созданные в конструкторе флоу без кода. SDK получает их с помощью GetFlow. Если вы предпочитаете строить UI в собственном коде, используйте пейвол — см. Реализация пейволов вручную.
  • Placements – где и когда в приложении показываются флоу (например, main, onboarding, settings). Вы привязываете флоу к плейсментам в дашборде, а затем запрашиваете их по ID плейсмента в коде. Это упрощает проведение A/B-тестов и показ разных флоу разным пользователям.

Adapty предлагает три способа включить покупки в приложении. Выберите подходящий в зависимости от требований вашего приложения:

РеализацияСложностьКогда использовать
Adapty Flow Builder✅ ЛегкоВы создаёте полноценный, готовый к покупкам флоу в no-code конструкторе. Adapty автоматически отображает его и берёт на себя весь сложный процесс покупки, валидацию чеков и управление подписками.
Вручную созданные пейволы🟡 СреднеВы реализуете UI пейвола в коде своего приложения, но всё равно получаете объект флоу от Adapty, чтобы сохранить гибкость в управлении продуктами. См. гайд.
Режим наблюдателя🔴 СложноУ вас уже есть собственная инфраструктура обработки покупок, и вы хотите продолжать её использовать. Обратите внимание, что режим наблюдателя имеет ограничения в Adapty. См. статью.
Important

Шаги ниже показывают, как реализовать флоу, созданное в Adapty Flow Builder.

Если вы предпочитаете создавать UI пейвола самостоятельно, см. Реализация пейволов вручную.

Чтобы отобразить флоу, созданное в Adapty Flow Builder, в коде приложения вам нужно только:

  1. Получить флоу: Запросите его из Adapty.
  2. Отобразить его, и Adapty возьмёт на себя обработку покупок: Покажите экран в приложении.
  3. Обработать действия кнопок: Свяжите действия пользователя с реакцией вашего приложения на них. Например, откройте ссылки или закройте флоу при нажатии кнопок.

Перед началом работы

Перед началом работы выполните следующие шаги:

  1. Подключите приложение к App Store и/или Google Play в дашборде Adapty.
  2. Создайте продукты в Adapty.
  3. Создайте флоу и добавьте в него продукты.
  4. Создайте плейсмент и добавьте в него флоу.
  5. Установите и активируйте SDK в коде приложения.
Tip

Самый быстрый способ выполнить эти шаги — следовать краткому руководству или создать флоу и плейсменты с помощью Developer CLI.

1. Получите флоу

Ваши флоу привязаны к плейсментам, настроенным в дашборде. Плейсменты позволяют показывать разные флоу для разных аудиторий или запускать A/B-тесты.

Чтобы получить флоу, созданный в Adapty Flow Builder, нужно:

  1. Получить объект flow по ID плейсмента с помощью метода GetFlow.

  2. Создать представление флоу с помощью метода CreateFlowView. Представление содержит элементы интерфейса и стили, необходимые для отображения флоу. Если для флоу не настроено представление, CreateFlowView вернёт ошибку — обработайте её в коллбэке.

Important

Чтобы отобразить экран, необходимо включить переключатель Show on device в Flow Builder. В противном случае CreateFlowView вернёт ошибку, и флоу не будет показан.

Adapty.GetFlow("YOUR_PLACEMENT_ID", (flow, error) => {
    if (error != null) {
        // handle the error
        return;
    }

    // Create the flow view
    AdaptyUI.CreateFlowView(flow, (view, error) => {
        if (error != null) {
            // the flow has no view configured, or view creation failed
            return;
        }

        // view - the flow view ready to be presented
    });
});
Info

Это руководство по быстрому старту содержит минимальную конфигурацию, необходимую для отображения флоу. Подробности о расширенной настройке см. в нашем гайде по получению флоу.

2. Отображение флоу

Теперь, когда у вас есть представление флоу, достаточно добавить несколько строк, чтобы отобразить его.

Для отображения флоу используйте метод view.Present() на объекте view, созданном методом CreateFlowView. Каждый view можно использовать только один раз: после закрытия вызовите CreateFlowView снова, чтобы отобразить флоу ещё раз.

view.Present((error) => {
    // handle the error
});
Info

Подробнее о том, как отображать флоу, читайте в нашем гайде.

3. Обработка нажатий кнопок

Когда пользователи нажимают кнопки во флоу, Unity SDK автоматически обрабатывает покупки и восстановление. Однако у других кнопок есть пользовательские или предустановленные ID, и действия для них нужно обрабатывать в коде.

Например, во флоу, скорее всего, есть кнопка закрытия и ссылки для открытия (например, условия использования и политика конфиденциальности). Чтобы обрабатывать эти действия, ваш класс должен реализовывать интерфейс IAdaptyFlowsEventsListener и зарегистрироваться как слушатель.

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

Tip

Читайте наши гайды о том, как обрабатывать действия и события кнопок.

public class YourClass : MonoBehaviour, IAdaptyFlowsEventsListener
{
    void Start()
    {
        // Register this class as the flows events listener
        Adapty.SetFlowsEventsListener(this);
    }

    // IAdaptyFlowsEventsListener method - handles button actions
    public void FlowViewDidPerformAction(
        AdaptyUIFlowView view,
        AdaptyUIUserAction action
    ) {
        switch (action.Type) {
            case AdaptyUIUserActionType.Close:
                view.Dismiss(null);
                break;
            case AdaptyUIUserActionType.OpenUrl:
                AdaptyUI.OpenUrl(action.Value, AdaptyWebPresentation.ExternalBrowser, null);
                break;
            default:
                break;
        }
    }

    // IAdaptyFlowsEventsListener method - dismiss the flow after a purchase
    public void FlowViewDidFinishPurchase(
        AdaptyUIFlowView view,
        AdaptyPaywallProduct product,
        AdaptyPurchaseResult purchasedResult
    ) {
        if (purchasedResult.Type != AdaptyPurchaseResultType.UserCancelled) {
            view.Dismiss(null);
        }
    }
}

Следующие шаги

Tip

Есть вопросы или возникли проблемы? Загляните на наш форум поддержки, где можно найти ответы на распространённые вопросы или задать свой. Наша команда и сообщество всегда готовы помочь!

Ваш флоу готов к отображению в приложении. Протестируйте покупки в песочнице App Store или в Google Play Store, чтобы убедиться, что тестовая покупка из флоу проходит успешно.

Теперь вам нужно проверить уровень доступа пользователей, чтобы показывать флоу или открывать доступ к платным функциям только нужным пользователям.

Полный пример

Вот как все эти шаги можно интегрировать в приложение вместе.

using System;
using System.Collections.Generic;
using UnityEngine;
using AdaptySDK;

public class FlowManager : MonoBehaviour, IAdaptyFlowsEventsListener
{
    [SerializeField] private string placementId = "YOUR_PLACEMENT_ID";

    void Start()
    {
        // Register for flow events
        Adapty.SetFlowsEventsListener(this);
        GetAndDisplayFlow();
    }

    private void GetAndDisplayFlow()
    {
        Adapty.GetFlow(placementId, (flow, error) => {
            if (error != null) {
                Debug.LogError("Error getting flow: " + error.Message);
                return;
            }

            CreateAndPresentFlowView(flow);
        });
    }

    private void CreateAndPresentFlowView(AdaptyFlow flow)
    {
        AdaptyUI.CreateFlowView(flow, (view, error) => {
            if (error != null) {
                // the flow has no view configured — use custom logic
                Debug.LogError("Error creating flow view: " + error.Message);
                return;
            }

            view.Present((presentError) => {
                if (presentError != null) {
                    Debug.LogError("Error presenting flow: " + presentError.Message);
                    return;
                }

                Debug.Log("Flow presented successfully");
            });
        });
    }

    // IAdaptyFlowsEventsListener implementation
    public void FlowViewDidPerformAction(
        AdaptyUIFlowView view,
        AdaptyUIUserAction action
    ) {
        switch (action.Type) {
            case AdaptyUIUserActionType.Close:
                Debug.Log("Close button pressed");
                view.Dismiss(null);
                break;
            case AdaptyUIUserActionType.OpenUrl:
                AdaptyUI.OpenUrl(action.Value, AdaptyWebPresentation.ExternalBrowser, null);
                break;
            default:
                break;
        }
    }

    public void FlowViewDidFinishPurchase(
        AdaptyUIFlowView view,
        AdaptyPaywallProduct product,
        AdaptyPurchaseResult purchasedResult
    ) {
        if (purchasedResult.Type != AdaptyPurchaseResultType.UserCancelled) {
            view.Dismiss(null);
        }
    }

    // Required interface methods (implement as needed)
    public void FlowViewDidAppear(AdaptyUIFlowView view) { }
    public void FlowViewDidDisappear(AdaptyUIFlowView view) { }
    public void FlowViewDidSelectProduct(AdaptyUIFlowView view, string productId) { }
    public void FlowViewDidStartPurchase(AdaptyUIFlowView view, AdaptyPaywallProduct product) { }
    public void FlowViewDidFailPurchase(AdaptyUIFlowView view, AdaptyPaywallProduct product, AdaptyError error) { }
    public void FlowViewDidStartRestore(AdaptyUIFlowView view) { }
    public void FlowViewDidFinishRestore(AdaptyUIFlowView view, AdaptyProfile profile) { }
    public void FlowViewDidFailRestore(AdaptyUIFlowView view, AdaptyError error) { }
    public void FlowViewDidReceiveError(AdaptyUIFlowView view, AdaptyError error) { }
    public void FlowViewDidFailLoadingProducts(AdaptyUIFlowView view, AdaptyError error) { }
    public void FlowViewDidFinishWebPaymentNavigation(AdaptyUIFlowView view, AdaptyPaywallProduct product, AdaptyError error) { }
    public void FlowViewDidReceiveAnalyticEvent(AdaptyUIFlowView view, string name, IDictionary<string, object> @params) { }

    public void ShowFlow()
    {
        GetAndDisplayFlow();
    }
}