Передача данных во флоу в Unity SDK

Кастомный тег — это пользовательская переменная со значением из вашего приложения. После того как вы выбираете Value comes from outside the app в настройках переменной, приложение может задавать её значение через Adapty SDK. Например, текстовый элемент содержит «Coins:» и кастомный тег. Если приложение передаёт «120» для этого тега, пользователи видят «Coins: 120».

Прежде чем начать

Вам необходим Adapty SDK версии 4 или выше. Версии ниже v4 не отображают флоу.

Добавьте пользовательские теги во флоу

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

  1. Создайте кастомный тег для каждого значения, которое передаёт ваше приложение.

    Форма создания переменной с именем, описанием, типом значения String и начальным значением
  2. Вставьте каждый тег в текстовый элемент.

  3. Запишите полное имя каждого тега, включая его группу. Именно под этим именем код вашего приложения передаёт каждое значение. Например, если группа user содержит тег streak, полное имя тега — user.streak.

    Вкладка Custom в выпадающем списке Add variable с тегом streak в группе user

Передача пользовательских значений тегов

Передайте значения вашего приложения в метод SetCustomTags объекта AdaptyUICreateFlowViewParameters в виде словаря строк, например Dictionary<string, string>, и вызовите AdaptyUI.CreateFlowView с этим объектом:

  • Каждый ключ — это полное имя пользовательского тега, например user.streak.
  • Каждое значение — строка, которую пользователи видят вместо тега.
  • Каждое значение должно быть читаемым для человека, например «1 250», а не «1250.0». Adapty не форматирует и не переводит его.

SDK считывает значения один раз — при создании представления, поэтому они не изменяются, пока флоу открыт.

var parameters = new AdaptyUICreateFlowViewParameters()
    .SetCustomTags(new Dictionary<string, string> {
        { "username", "DragonSlayer42" },
        { "coins", "1,250" }
    });

AdaptyUI.CreateFlowView(flow, parameters, (view, error) => {
    if (error != null) {
        // handle the error
        return;
    }

    // present the view
});

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

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

Что видят пользователи при отсутствии значения

Пользователи видят Начальное значение пользовательского тега как резервное в следующих случаях:

  • Ваше приложение не передаёт никакого значения для тега.
  • Пользователь не обновил приложение до версии, которая передаёт это значение.
  • Имя в коде вашего приложения не совпадает с полным именем тега, включая регистр букв.
  • Другой пользовательский тег в том же текстовом элементе не имеет значения. В этом случае каждый пользовательский тег в этом текстовом элементе показывает своё начальное значение.

Чтобы ничего не отображалось вместо тега, передайте пустую строку. Adapty считает пустую строку значением, поэтому резервный вариант не показывается.

Пример: показ ИМТ на основе ответов в онбординге

Флоу может собирать ответы пользователей, а кастомный тег — показывать значение из вашего приложения. Объедините эти возможности, чтобы показывать пользователям результат, который приложение вычисляет на основе их ответов: оценку, рекомендованный план или метрику здоровья:

  1. Флоу собирает ответы и передаёт их в ваше приложение.
  2. Приложение вычисляет результат.
  3. Приложение передаёт результат в следующий флоу в виде значения кастомного тега.

В этом примере онбординг-флоу собирает вес и рост пользователя. Когда пользователь закрывает онбординг-флоу после последнего экрана, приложение вычисляет индекс массы тела (ИМТ). Затем открывается пейвол-флоу, который показывает этот ИМТ.

Настройка флоу

  1. Создайте два флоу: онбординг-флоу, собирающий вес и рост пользователя, и флоу-пейвол, показывающий его ИМТ.

  2. Добавьте два поля Number в онбординг-флоу:

    • Одно для веса в килограммах с Element ID weight.
    • Одно для роста в сантиметрах с Element ID height.

    Для обоих полей установите Format в значение Integer. Поле отправляет значение как текст, точно так, как его ввёл пользователь, а пример кода не воспринимает «70.5» и «70,5» одинаково. Целые числа не содержат разделителя дробной части, поэтому код читает их одинаково в любой локали.

  3. Чтобы убедиться, что приложение получает оба значения, завершите онбординг-флоу экраном без полей ввода. На этом экране добавьте кнопку с действием Close flow. Поля отправляют свои значения при потере фокуса или при переходе пользователя на другой экран. Действие Close flow не отправляет их. Пример кода открывает пейвол только в том случае, если пользователь добрался до последнего экрана.

  4. В флоу-пейволе создайте кастомный тег с именем bmi. В поле Initial value введите тире (—). Пользователь увидит тире, если приложение не передало значение ИМТ.

  5. Добавьте текстовый элемент со словами «Your BMI:» в флоу-пейвол. После этих слов вставьте кастомный тег bmi.

  6. Добавьте онбординг-флоу в плейсмент, например onboarding. Добавьте флоу-пейвол в плейсмент с ID bmi_paywall. Код из раздела Pass the BMI to the paywall получает пейвол по этому ID.

Передайте BMI на пейвол

Соберите вес и рост из событий flow_user_input флоу онбординга, как описано в Обработка данных из флоу. Чтобы узнать, что пользователь дошёл до последнего экрана, отслеживайте событие flow_screen_showed с is_last_screen равным true, как описано в Отслеживание просмотров экранов флоу. Когда пользователь закроет флоу онбординга после этого экрана, вычислите BMI. Затем создайте представление пейвола и передайте BMI для кастомного тега bmi.

Реализуйте следующие методы в листенере, который вы регистрируете через Adapty.SetFlowsEventsListener. Метод FlowViewDidDisappear срабатывает только после того, как ваше приложение закрывает флоу онбординга, поэтому листенер также должен обрабатывать действие Close flow, как описано в Закрытие флоу и пейволов:

private readonly Dictionary<string, string> bodyAnswers = new Dictionary<string, string>();
private bool reachedLastScreen;

public void FlowViewDidReceiveAnalyticEvent(
    AdaptyUIFlowView view,
    string name,
    IReadOnlyDictionary<string, object> parameters
) {
    if (name == "flow_screen_showed") {
        if (parameters.TryGetValue("is_last_screen", out var lastScreen)
            && lastScreen is bool isLast && isLast) {
            reachedLastScreen = true;
        }
        return;
    }
    if (name != "flow_user_input") return;
    if (!parameters.TryGetValue("value", out var raw) || !(raw is string value)) return;

    if (!parameters.TryGetValue("element_id", out var idRaw) || !(idRaw is string elementId)) return;

    bodyAnswers[elementId] = value;
}

public void FlowViewDidDisappear(AdaptyUIFlowView view) {
    // The listener receives events from every flow. Reset `bodyAnswers` and
    // `reachedLastScreen` whenever a flow disappears, so that the paywall
    // doesn't open again when the user closes it.
    var answers = new Dictionary<string, string>(bodyAnswers);
    var finished = reachedLastScreen;
    bodyAnswers.Clear();
    reachedLastScreen = false;

    // Number inputs send their values as strings.
    if (!finished) return;
    if (!answers.TryGetValue("weight", out var weightText)
        || !double.TryParse(weightText, out var weight)) return;
    if (!answers.TryGetValue("height", out var heightText)
        || !double.TryParse(heightText, out var height)
        || height <= 0) return;

    var heightInMeters = height / 100;
    var bmi = weight / (heightInMeters * heightInMeters);
    ShowBmiPaywall(bmi.ToString("0.0"));
}

private void ShowBmiPaywall(string bmi) {
    Adapty.GetFlow("bmi_paywall", (flow, flowError) => {
        if (flowError != null) {
            // handle the error
            return;
        }

        var parameters = new AdaptyUICreateFlowViewParameters()
            .SetCustomTags(new Dictionary<string, string> { { "bmi", bmi } });

        AdaptyUI.CreateFlowView(flow, parameters, (view, viewError) => {
            if (viewError != null) {
                // handle the error
                return;
            }

            view.Present((presentError) => {
                if (presentError != null) {
                    // handle the error
                }
            });
        });
    });
}

ToString("0.0") использует разделитель дробной части текущей культуры: “22.7” для английской и “22,7” для немецкой.

Сохранение ИМТ в профиль пользователя

Чтобы показывать пользователям разные флоу на основе их ИМТ, сохраните его как пользовательский атрибут профиля. В дашборде Adapty создайте числовой (Number) пользовательский атрибут с ключом bmi. Затем показывайте каждый флоу аудитории, сформированной на основе этого атрибута.

Вызовите метод Adapty.UpdateProfile в FlowViewDidDisappear, сразу после строки, вычисляющей bmi. Передайте именно double, а не отформатированную строку — это позволит сегменту сравнивать ИМТ с пороговым значением:

var parameters = new AdaptyProfileParameters.Builder()
    .SetCustomDoubleAttribute("bmi", bmi)
    .Build();

Adapty.UpdateProfile(parameters, (error) => {
    if (error != null) {
        // handle the error
    }
});