Включение покупок с помощью 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. См. статью. |
Шаги ниже показывают, как реализовать флоу, созданное в Adapty Flow Builder.
Если вы предпочитаете создавать UI пейвола самостоятельно, см. Реализация пейволов вручную.
Чтобы отобразить флоу, созданное в Adapty Flow Builder, в коде приложения вам нужно только:
- Получить флоу: Запросите его из Adapty.
- Отобразить его, и Adapty возьмёт на себя обработку покупок: Покажите экран в приложении.
- Обработать действия кнопок: Свяжите действия пользователя с реакцией вашего приложения на них. Например, откройте ссылки или закройте флоу при нажатии кнопок.
Перед началом работы
Перед началом работы выполните следующие шаги:
- Подключите приложение к App Store и/или Google Play в дашборде Adapty.
- Создайте продукты в Adapty.
- Создайте флоу и добавьте в него продукты.
- Создайте плейсмент и добавьте в него флоу.
- Установите и активируйте SDK в коде приложения.
Самый быстрый способ выполнить эти шаги — следовать краткому руководству или создать флоу и плейсменты с помощью Developer CLI.
1. Получите флоу
Ваши флоу привязаны к плейсментам, настроенным в дашборде. Плейсменты позволяют показывать разные флоу для разных аудиторий или запускать A/B-тесты.
Чтобы получить флоу, созданный в Adapty Flow Builder, нужно:
-
Получить объект
flowпо ID плейсмента с помощью методаGetFlow. -
Создать представление флоу с помощью метода
CreateFlowView. Представление содержит элементы интерфейса и стили, необходимые для отображения флоу. Если для флоу не настроено представление,CreateFlowViewвернёт ошибку — обработайте её в коллбэке.
Чтобы отобразить экран, необходимо включить переключатель 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
});
});
Это руководство по быстрому старту содержит минимальную конфигурацию, необходимую для отображения флоу. Подробности о расширенной настройке см. в нашем гайде по получению флоу.
2. Отображение флоу
Теперь, когда у вас есть представление флоу, достаточно добавить несколько строк, чтобы отобразить его.
Для отображения флоу используйте метод view.Present() на объекте view, созданном методом CreateFlowView. Каждый view можно использовать только один раз: после закрытия вызовите CreateFlowView снова, чтобы отобразить флоу ещё раз.
view.Present((error) => {
// handle the error
});
Подробнее о том, как отображать флоу, читайте в нашем гайде.
3. Обработка нажатий кнопок
Когда пользователи нажимают кнопки во флоу, Unity SDK автоматически обрабатывает покупки и восстановление. Однако у других кнопок есть пользовательские или предустановленные ID, и действия для них нужно обрабатывать в коде.
Например, во флоу, скорее всего, есть кнопка закрытия и ссылки для открытия (например, условия использования и политика конфиденциальности). Чтобы обрабатывать эти действия, ваш класс должен реализовывать интерфейс IAdaptyFlowsEventsListener и зарегистрироваться как слушатель.
Обратите внимание, что флоу остаётся открытым после успешной покупки. Если вы хотите закрыть его после завершения покупки, закройте экран в обратном вызове FlowViewDidFinishPurchase.
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);
}
}
}
Следующие шаги
Есть вопросы или возникли проблемы? Загляните на наш форум поддержки, где можно найти ответы на распространённые вопросы или задать свой. Наша команда и сообщество всегда готовы помочь!
Ваш флоу готов к отображению в приложении. Протестируйте покупки в песочнице 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();
}
}