# Unity App-Push統合
# FCM統合
# 1.1 "Push ID" を送信
- TEのログインまたはアカウント切り替え後に、FCMのTokenをアップロードしてください。
//TE SDK 初期化
ThinkingAnalyticsAPI.StartThinkingAnalytics("APP_ID", "SERVER_URL");
//アカウントID設定
ThinkingAnalyticsAPI.Login("ACCOUNT_ID");
//FCM tokenをTEに送信
Firebase.Messaging.FirebaseMessaging.GetTokenAsync().ContinueWith(task => {
    var result = task.Result;
    ThinkingAnalyticsAPI.UserSet(new Dictionary<string, object>() { 
        { "fcm_token", task.Result } 
    });
});
- FCM Token変更時,ユーザープロパティも同時変更:
private void Start()
{
    // FCM token更新委託イベントの登録
    Firebase.Messaging.FirebaseMessaging.TokenReceived += OnTokenReceived;
    Firebase.Messaging.FirebaseMessaging.MessageReceived += OnMessageReceived;
}
public void OnTokenReceived(object sender, Firebase.Messaging.TokenReceivedEventArgs token)
{
    //FCM tokenをTEに送信
    ThinkingAnalyticsAPI.UserSet(new Dictionary<string, object>() { 
        { "fcm_token", token.Token } 
    });
}
# 1.2. プッシュのクリックイベントを収集
ユーザーがプッシュをクリックしたときにプッシュクリックイベントをアップロードし、onCreateまたはonNewIntentでプッシュパラメーターを取得することができます。
private void Start()
{
    // FCM メッセージ委託イベントの登録
    Firebase.Messaging.FirebaseMessaging.MessageReceived += OnMessageReceived;
}
public void OnMessageReceived(object sender, Firebase.Messaging.MessageReceivedEventArgs e)
{
    // プッシュイベント送信 (TETrackMessageReceivedを参照)
    this.TETrackMessageReceived(e.Message.Data);
}
# 1.3. プッシュメッセージ処理
- 通常パラメータ:handleTEPushActionメソッドを呼び出します。
- 通過パラメータ:handleTEPassThroughActionメソッドを呼び出します。
private void Start()
{
    // FCM メッセージ委託イベントの登録
    Firebase.Messaging.FirebaseMessaging.MessageReceived += OnMessageReceived;
}
public void OnMessageReceived(object sender, Firebase.Messaging.MessageReceivedEventArgs e)
{
    //一般パラメータ (TEHandlePushActionを参照)
    this.TEHandlePushAction(e.Message.Data);
    //パススルーパラメータ
    this.TEHandlePassThroughAction(e.Message.Data);
}
# 付録:
# クライアントが受け取ったプッシュパラメータの例
{
    "te_extras": {
        //プッシュクリックのジャンプ方法
        "ops_loading_type": "OPEN_APP",
        //パススルーパラメータ
        "passthrough_params": {
                "param1": "abc",
                "param2": 101,
                "param3": [{
                        "subText1": "xyz",
                        "subText2": 2
                }]
        },
        //TEエンゲージチャネルの受信プロパティ
        "#ops_receipt_properties": {
                "ops_task_id": "0082",
                "ops_project_id": 1,
                "ops_task_instance_id": "0082_20230331",
                "ops_push_language": "default",
                "ops_task_exec_detail_id": "55"
        }
    }
}
# TETrackMessageReceived
private void TETrackMessageReceived(IDictionary<string, string> data)
{
    //FCM message を TE システムに
    Dictionary<string, object> te_extras = ThinkingAnalytics.Utils.TD_MiniJSON.Deserialize(data["te_extras"]);
    Dictionary<string, object> properties = new Dictionary<string, object>();
    if (te_extras.ContainsKey("#ops_receipt_properties"))
    {
        properties.Add("#ops_receipt_properties", te_extras["#ops_receipt_properties"]);
    }
    ThinkingAnalytics.ThinkingAnalyticsAPI.Track("ops_push_click", properties);
    ThinkingAnalytics.ThinkingAnalyticsAPI.Flush();
}
# TEHandlePushAction
private void TEHandlePushAction(IDictionary<string, string> data)
{
    Dictionary<string, object> te_extras = ThinkingAnalytics.Utils.TD_MiniJSON.Deserialize(data["te_extras"]);
    string type = te_extras["ops_loading_type"].ToString();
    if ("OPEN_APP".Equals(type))
    {
        // TODO アプリのメッセージを開く処理 →Appを起動してください
    }
    else if ("OPEN_URL".Equals(type))
    {
        string url = te_extras["ops_url"].ToString();
        if (!string.IsNullOrEmpty(url))
        {
            // TODO URLを処理する →URLの処理をしてください
        }
    }
    else if ("CUSTOMIZED".Equals(type))
    {
        string custom = te_extras["ops_customized"].ToString();
        if (!string.IsNullOrEmpty(custom))
        {
            // TODO カスタムメッセージを処理 → カスタムメッセージを処理してください
        }
    }
}
# TEHandlePassThroughAction
private void TEHandlePassThroughAction(IDictionary<string, string> data)
{
    Dictionary<string, object> te_extras = ThinkingAnalytics.Utils.TD_MiniJSON.Deserialize(data["te_extras"]);
    string params = te_extras["passthrough_params"].ToString();
    //paramsはパラメータをパススルーします。次に具体的な業務ロジックを実装します。
}
