Unity SDKでフローにデータを渡す

カスタムタグとは、アプリから値を渡すカスタム変数です。変数の設定で Value comes from outside the app を選択すると、Adapty SDKを通じてアプリ側から値を設定できます。たとえば、テキスト要素に「Coins:」とカスタムタグが含まれている場合、アプリが「120」を渡すと、ユーザーには「Coins: 120」と表示されます。

始める前に

Adapty SDK v4 以降が必要です。v4 より前のバージョンではフローが表示されません。

フローにカスタムタグを追加する

アプリの値をフローで表示するには、ビルダーでカスタムタグを設定します。

  1. アプリが渡す各値に対してカスタムタグを作成します。

    名前、説明、String値タイプ、および初期値を含む変数作成フォーム
  2. 各タグをテキスト要素に挿入します。

  3. グループ名を含む各タグのフルネームを確認してください。アプリのコードはこの名前で各値を渡します。たとえば、user グループに streak タグが含まれている場合、タグのフルネームは user.streak となります。

    streakタグがuserグループ内にある、変数追加ドロップダウンのカスタムタブ

カスタムタグの値を渡す

アプリの値を AdaptyUICreateFlowViewParameters オブジェクトの SetCustomTags メソッドに、Dictionary<string, string> などの文字列から文字列へのディクショナリとして渡し、そのオブジェクトを指定して AdaptyUI.CreateFlowView を呼び出します。

  • 各キーは user.streak のようなカスタムタグのフルネームです。
  • 各値は、タグの代わりにユーザーが見る文字列です。
  • 各値は「1250.0」ではなく「1,250」のように、人が読める形式でなければなりません。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 モバイルアプリはカスタムタグの値を設定しません。

アプリがすでに旧ペイウォールビルダーのペイウォールにカスタムタグ値を設定している場合は、フローにおけるカスタムタグの違いを確認してください。

値が設定されていない場合にユーザーに表示されるもの

以下の場合、ユーザーにはカスタムタグの初期値がフォールバックとして表示されます。

  • アプリがそのタグに値を渡していない場合。
  • ユーザーがアプリを値を渡すバージョンにアップデートしていない場合。
  • アプリのコード内の名前が、大文字・小文字を含めタグのフルネームと一致していない場合。
  • 同じテキスト要素内の別のカスタムタグに値がない場合。その場合、そのテキスト要素内のすべてのカスタムタグが初期値を表示します。

タグの位置に何も表示しないようにするには、空の文字列を渡してください。Adapty は空の文字列を値として扱うため、フォールバックは表示されません。

オンボーディングの回答からBMIを表示する例

フローはユーザーから回答を収集でき、カスタムタグはアプリの値を表示できます。この2つを組み合わせることで、スコア、おすすめプラン、健康指標など、回答からアプリが計算した結果をユーザーに表示できます:

  1. フローが回答を収集し、アプリに送信します。
  2. アプリが結果を計算します。
  3. アプリが次のフローにカスタムタグの値として結果を渡します。

この例では、オンボーディングフローがユーザーの体重と身長を収集します。ユーザーがオンボーディングフローの最後の画面を閉じると、アプリがBMI(ボディマス指数)を計算します。そして、BMIを表示するペイウォールフローを開きます。

フローを設定する

  1. 2つのフローを作成します: ユーザーの体重と身長を収集するオンボーディングフローと、BMIを表示するペイウォールフローです。

  2. オンボーディングフローに2つのNumber入力を追加します:

    • 体重(キログラム)用。Element IDをweightに設定します。
    • 身長(センチメートル)用。Element IDをheightに設定します。

    両方の入力で、FormatをIntegerに設定します。入力はユーザーが入力した通りのテキストとして値を送信するため、サンプルコードは”70.5”と”70,5”を同じように読み取りません。整数には小数点区切り文字がないため、すべてのロケールで同じように読み取られます。

  3. アプリが両方の値を確実に受け取れるよう、オンボーディングフローを入力のない画面で終了させます。その画面に、Close flowアクションを持つボタンを追加します。入力はフォーカスを失ったとき、またはユーザーが別の画面に移動したときに値を送信します。Close flowアクションは値を送信しません。サンプルコードは、ユーザーが最後の画面に到達した場合にのみペイウォールを開きます。

  4. ペイウォールフローで、bmiという名前のカスタムタグを作成します。Initial valueフィールドにダッシュ(—)を入力します。アプリがBMIを渡さない場合、ユーザーにはダッシュが表示されます。

  5. ペイウォールフローに「Your BMI:」という文字列を含むテキスト要素を追加します。この文字列の後に、bmiカスタムタグを挿入します。

  6. オンボーディングフローをonboardingなどのプレースメントに追加します。ペイウォールフローをID bmi_paywallのプレースメントに追加します。BMIをペイウォールに渡すのコードは、このIDでペイウォールを取得します。

ペイウォールにBMIを渡す

オンボーディングフローの flow_user_input イベントから体重と身長を取得する方法については、フローからのデータを処理するを参照してください。ユーザーが最後の画面に到達したことを確認するには、is_last_screen が true に設定された flow_screen_showed イベントを監視します。詳細はフロー画面の表示をトラッキングするを参照してください。その画面の後にユーザーがオンボーディングフローを閉じたら、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” となります。

BMIをユーザープロファイルに保存する

BMIに基づいて異なるフローをユーザーに表示するには、BMIをプロファイルのカスタム属性として保存します。Adapty ダッシュボードで、キー bmi を持つ Number タイプのカスタム属性を作成します。その後、この属性から作成したオーディエンスに各フローを表示します。

FlowViewDidDisappear 内で、bmi を計算する行の直後に Adapty.UpdateProfile メソッドを呼び出します。セグメントがBMIをしきい値と比較できるよう、フォーマット済みの文字列ではなく double 型の値を渡してください。

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

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