menu
Is this helpful?

# Unity推送集成文档

# 一、FCM推送

# 1.1 上报 "推送 ID"

  • 在调用 TE Login 或者切换账号之后上传 FCM 的 Token。
//TE SDK 初始化
TDAnalytics.Init("APPID", "SERVER");
//设置账号 ID
TDAnalytics.Login("ACCOUNT_ID");
//上报 FCM token 到 TE 系统
Firebase.Messaging.FirebaseMessaging.GetTokenAsync().ContinueWith(task => {
    var result = task.Result;
    TDAnalytics.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 系统
    TDAnalytics.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参见附录)
    if (e.Message.Data.ContainsKey("te_extras"))
    {
        object v = json["te_extras"];
        this.TETrackMessageReceived((IDictionary<string, string>)v);
    }
}

# 1.3. 处理推送消息

建议以下两种方案二选一。

  • 普通参数:调用TEHandlePushAction方法。
  • 透传参数:调用TEHandlePassThroughAction方法。
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);
}

# 二、极光推送

WARNING

极光推送官网暂未提供 Unity 插件,可以参考极光维护的开源插件:JPush Unity Plugin (opens new window)。以下内容均在 JPush Unity Plugin (opens new window) 基础上实现。

# 1.1 上报 "推送 ID"

  • 在调用 TE Login 或者切换账号之后上传极光的 Registration ID。
//TE SDK 初始化
TDAnalytics.Init("APPID", "SERVER");
//设置账号 ID
TDAnalytics.Login("ACCOUNT_ID");
//上报 JPush Registration ID 到 TE 系统
string jiguangId = JPushBinding.GetRegistrationId();
TDAnalytics.UserSet(new Dictionary<string, object>() { 
    { "jiguang_id", jiguangId } 
});
  • 在极光的 OnGetRegistrationId 接口中上传极光的 Registration ID。
void OnGetRegistrationId(string result)
{
    //上报 JPush Registration ID 到 TE 系统
    TDAnalytics.UserSet(new Dictionary<string, object>() { 
        { "jiguang_id", jiguangId } 
    });
}

# 2.2. 采集推送点击事件

void OnReceiveNotification(string jsonStr)
{
    IDictionary<string, object> json = ThinkingData.Analytics.Utils.TDMiniJson.Deserialize(jsonStr);
    if (json.ContainsKey("te_extras"))
    {
        object v = json["te_extras"];
        this.TETrackMessageReceived((IDictionary<string, string>)v);
    }
}

# 2.3. 处理推送消息

建议以下两种方案二选一。

  • 普通参数:调用TEHandlePushAction方法。
  • 透传参数:调用TEHandlePassThroughAction方法。
void OnOpenNotification(string jsonStr)
{
    Debug.Log("recv---openNotification---" + jsonStr);
    IDictionary<string, object> json = ThinkingData.Analytics.Utils.TDMiniJson.Deserialize(jsonStr);
    if (json.ContainsKey("extras"))
    {
        object v = json["extras"];
        //如果处理普通参数 调用如下方法
        this.TEHandlePushAction((IDictionary<string, string>)v);
        //如果处理透传参数 调用如下方法
        this.TEHandlePassThroughAction((IDictionary<string, string>)v);
    }
}

# 附录

# 客户端收到推送参数示例

以下仅展示客户端收到的扩展字段参数

{
    "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 = ThinkingData.Analytics.Utils.TDMiniJson.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"]);
    }
    TDAnalytics.Track("ops_push_click", properties);
    TDAnalytics.Flush();
}

# TEHandlePushAction

private void TEHandlePushAction(IDictionary<string, string> data)
{
    Dictionary<string, object> te_extras = ThinkingData.Analytics.Utils.TDMiniJson.Deserialize(data["te_extras"]);
    string type = te_extras["ops_loading_type"].ToString();
    if ("OPEN_APP".Equals(type))
    {
        // 处理打开 App 消息,--> 请启动 App
    }
    else if ("OPEN_URL".Equals(type))
    {
        string url = te_extras["ops_url"].ToString();
        if (!string.IsNullOrEmpty(url))
        {
            // 处理打开 URL 消息,--> 请处理 URL
        }
    }
    else if ("CUSTOMIZED".Equals(type))
    {
        string custom = te_extras["ops_customized"].ToString();
        if (!string.IsNullOrEmpty(custom))
        {
            // 处理自定义消息,--> 请处理自定义消息
        }
    }
}

# TEHandlePassThroughAction

private void TEHandlePassThroughAction(IDictionary<string, string> data)
{
    Dictionary<string, object> te_extras = ThinkingData.Analytics.Utils.TDMiniJson.Deserialize(data["te_extras"]);
    string params = te_extras["passthrough_params"].ToString();
    //params为透传参数,接下来是实现具体的业务逻辑
}