# 配信ロジックについて

## 1. アプリ内埋め込み (Embeddable Experiment)

{% hint style="info" icon="lightbulb-exclamation-on" %}
アプリのネイティブレイアウト内に特定のUIを動的に挿入するコンポーネントです
{% endhint %}

#### 表示タイミング

* Viewの初期化時
  * 実装された `NubrickEmbedding` ウィジェット（Flutter等）やViewがレンダリングされるタイミングで評価・表示されます
* 暗黙的なトリガー
  * 特定のイベント発火を待つのではなく、その「場所（ID）」に到達したことが表示のトリガーとなります

#### トリガーの仕組み

* 埋め込みID (Embedding ID): コード内に埋め込まれた固有のIDをキーとして、管理画面上の設定と紐付けます
* トリガー設定の不要性: オーバーレイと異なり、明示的なイベント（アプリ起動等）の設定は不要です。特定の画面表示＝表示タイミングとなります

#### 配信プロセスの詳細

1. Context Resolution
   * SDKが保持している現在の `User Properties`（`setProperties`で注入された値）を読み込みます
2. Targeting Evaluation
   * 管理画面で定義された対象ユーザー条件とプロパティを照合します
   * 注意：埋め込みの場合、条件指定は `set_properties` による属性ベースのみとなります。
3. Conflict Resolution (優先度判定)
   * 同一の埋め込みIDに対して、条件を満たす複数のエクスペリメントが存在する場合、設定された 「優先度（Priority）」が最も高いもの を1つ選出します
4. &#x20;Resource Fetch & Render

   * 選出されたエクスペリメントの構成JSONを取得し、ネイティブUIとして描写します

## 2. オーバーレイ表示 (In-App Messaging / Product Tour)

{% hint style="info" icon="lightbulb-exclamation-on" %}
特定のユーザーアクションや状態変化に応じて、オーバーレイで表示されるコンポーネントです
{% endhint %}

#### 表示タイミング

* イベントドリブン
  * アプリ起動、バックグラウンド復帰、または `NubrickDispatcher` によって明示的に送信されたカスタムイベント（例：`purchase_completed`）の発生直後に評価されます

#### トリガーの仕組み

* &#x20;イベントトリガー
  * デフォルトイベント：アプリ起動、初回起動、バックグラウンド復帰
  * カスタムイベント：SDKを通じて任意に定義・発火させたイベント、SDKのAPIを経由して発火させたイベント
* 頻度制御 (Frequency Control)
  * 「毎回」「1回のみ」「1日1回」「n日に1回」といった表示回数制限を、端末内のローカルDB（履歴データ）を用いて判定します

#### 配信プロセスの詳細

1. Event Capture
   * `NubrickDispatcher` がイベントを検知し、当該イベントに紐づく全ての Modal/Tour の構成（Config）をロードします
2. Multilayer Filtering
   * 属性フィルタ: `setProperties` の値がターゲットセグメントに合致するか判定
   * スケジュールフィルタ: 現在のデバイス時刻が、配信期間（開始・終了）およびカスタムスケジュール（曜日・時間帯）内か判定
   * 頻度フィルタ: 過去のインプレッションログに基づき、頻度設定を逸脱していないか判定
3. Priority Evaluation
   * フィルタを通過した候補が複数ある場合、優先度が最も高いもの を選出します（Flutterの場合、ツールチップも同様のロジックで評価されます）
4. Execution

   * 条件に合致したJSONファイルを取得し、最前面のレイヤーに表示を実行します
