# 抖音小游戏模块

# 1. 接入说明

# 1.1 谁来接入此文档

接入SDK的开发人员。

# 1.2 注意事项

# 2. 接入步骤

# 2.1 导入Unity SDK 资源文件

导入SDK资源文件

# 2.2 添加宏定义

Unity工程的Player Settings中,配置 Scripting Define Symbols 添加 DOUYIN_MINIGAME_SDK

添加DOUYIN_MINIGAME_SDK

# 2.3 导出抖音小游戏工程

根据指引导出抖音小游戏工程

导出抖音小游戏工程

导出的抖音小程序示例

导出的抖音小程序示例

# 3. 功能调用

# 3.1 设置游戏参数

需要在游戏初始化,调用其他SDK接口前调用

string param = DHSDKHelper.DHJsonParam.Builder()
             .put("login", "https://sz-sdk-login-cn.sztemp.com")       // 必传,登录服务接口地址
             .put("pay", "https://sz-sdk-pay-cn.sztemp.com")     //必传,支付服务接口地址
             .put("log", "https://sz-ups-sdk-log-cn.sztemp.com")      // 必传,数据上报服务接口地址
             .put("errorLog", "https://sz-ups-sdk-error-cn.sztemp.com")        // 必传,日志上报服务接口地址
             .put("subscribe", "")        // 必传,订阅消息服务接口地址
             .put("gameAppId", "wx123456789")     // 必传,游戏在抖音侧的 AppID;可登录《抖音开放平台控制台》后台,进入"开发 > 开发设置"栏目中查看
             .put("appId", "1234567890")     // 必传,小游戏的 AppID(于SDK平台注册小游戏时生成的ID)
             .put("appVersion", "1.0.0")     // 必传,小游戏的版本号
             .put("packageName", "com.dianhun.demo")     // 必传,小游戏的包名
             .put("channel", "3438")     // 必传,渠道ID,默认固定传 3438
             .put("mainChannel", "100774")     // 必传,推广主渠道ID,默认固定传 100774
             .put("secondChannel", "100775")                 //必传,推广次渠道ID,默认固定传 100775
             .put("heartbeatEnable", "true")                 //选传,true,false是否开启心跳数据上报,若开启,则SDK将每隔一分钟向服务器发送一条心跳数据
             .put("reyunAppKey", "")     // 选传,小游戏的热云 AppKey(于热云广告监测平台创建产品时生成的AppKey)
             .put("gravityEngineAccessToken", "")     //选传,小游戏的引力引擎 Access Token(于引力引擎控制台创建产品时生成的Access Token)
             .put("gravityEngineDebug", "true")     //选传,显式开启或关闭引力引擎数据上报的调试模式,默认根据小游戏当前的体验环境自动设置,正式版下为 false,开发版或体验版下为 true;开启调试模式后,可以在引力控制台>设置>元数据>事件流中查看实
             .put("gravityEnginePayEventEnable", "true")     //选传,引力引擎付费事件是否采用客户端上报,默认采用(注意,若引力引擎付费事件上报采用服务端上报,请务必将此参数设为 false,并于SDK中台系统配置服务端上报相关参数,否则可能导致双端付费事件上报丢失或重复!!!)
             .toJson();
DHSDKHelper.setHostPlatformParam(param);

# 3.2 初始化

SDK初始化接口,在游戏初始化,设置游戏参数接口调用后调用,必须初始化完毕,才能调用后续登录,支付等接口

初始化接口调用:

DHSDKHelper.init(mUnionSdkCallback);

在回调方法里面处理初始化结果:

public void onDHSDKResult(int requestCode, int resultCode, String resultData)
        {
            if (resultCode == DHSDKHelper.DHSDKConst.RET_OK)
            {
                // 所有接口成功返回调用逻辑
                if (requestCode == DHSDKHelper.DHSDKConst.REQ_INIT)
                {
                    // 初始化成功 返回调用
                    Debug.Log("初始化成功");

                }
            }
            else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL)
            {

                // 所有接口失败返回调用逻辑  所有失败信息请游戏接入方测试时log打印记录并反馈给sdk方  方便排查问题

                if (requestCode == DHSDKHelper.DHSDKConst.REQ_INIT)
                {

                    // 初始化失败调用  返回信息数据可能游戏接入方看不懂  打印log 反馈给sdk处理者即可

                }
            }
        }

# 3.3 登录

用于执行SDK登录流程

注意:流程上要求需先执行SDK登录,再显示游戏服列表及"开始游戏"按钮,当玩家点击"开始游戏"后再触发后续游戏服登录及创角;如游戏本身并无游戏服列表选择界面或"开始游戏"按钮,此注意事项可忽略!

调用登录接口:

DHSDKHelper.login(mUnionSdkCallback);

登录回调:

        public void onDHSDKResult(int requestCode, int resultCode, String resultData)
        {
            if (resultCode == DHSDKHelper.DHSDKConst.RET_OK)
            {
                // 所有接口成功返回调用逻辑
                if (requestCode == DHSDKHelper.DHSDKConst.REQ_LOGIN)
                {

                    /**
                      登录成功后  返回调用
                      json 数据格式
                      loginType: 用户授权登录类型
                      token:c73a482021af4888ba1ea66176ae56c7
                      accountId:1381307270  账号id
                      accountName:guest@1381307270  账号名

                    */

                    Debug.Log("login:" + resultData);

                    //  sdk登录成功后 需要游戏服务端做校验 详细校验过程 请查看服务端文档登录校验说明
                    // 当前返回的是sdk测试环境的账号数据  如果游戏服务端去sdk服务端验证账号和token数据请到测试环境验证

                    var loginJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("loginJson:" + loginJson.ToString());

                    string logintype = loginJson["loginType"].ToString();
                    string Token = loginJson["token"].ToString();
                    string region = loginJson["region"].ToString();
                    string sign = loginJson["sign"].ToString();
                    uid = loginJson["accountId"].ToString();
                    uname = loginJson["accountName"].ToString();
                    string accountView = loginJson["accountView"].ToString();
                    var userExtraInfo = loginJson["userExtraInfo"];
                    string openId = userExtraInfo["openId"].ToString();
                }
            }
            else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL)
            {

                // 所有接口失败返回调用逻辑  所有失败信息请游戏接入方测试时log打印记录并反馈给sdk方  方便排查问题

                if (requestCode == DHSDKHelper.DHSDKConst.REQ_LOGIN)
                {
                    //登录失败
                }
            }
        }

# 3.4 获取用户信息

用于获取抖音用户的个人信息,如昵称、头像等。

注意:

  • 一般通过此服务获取抖音用户的昵称、头像,用来作为玩家在游戏内的昵称、头像,如果无此需求,此服务可不对接!
  • 若传递了 withRealNameAuthenticationInfo 参数,则要求用户客户端基础库版本不低于 1.80.0;若低于该版本,调用本接口将中断用户当前操作并弹出升级提示,不会报错!

调用接口:

string param = DHSDKHelper.DHJsonParam.Builder()
   .put("withCredentials", "true")  //选传,是否需要返回敏感数据
   .put("withRealNameAuthenticationInfo", "true")     //选传,是否需要返回用户实名认证状态
   .toJson();
DHSDKHelper.getUserInfo(param,mUnionSdkCallback);

接口回调:

public void onDHSDKResult(int requestCode, int resultCode, String resultData)
        {
            if (resultCode == DHSDKHelper.DHSDKConst.RET_OK)
            {
                // 所有接口成功返回调用逻辑
                if (requestCode == DHSDKHelper.DHSDKConst.REQ_GET_USERINFO)
                {

                    /**
                      获取用户信息成功后  返回调用
                      具体用户信息可参考官方文档
                      https://developer.open-douyin.com/docs/resource/zh-CN/mini-game/develop/api/open-capacity/user-information/info/tt-get-user-info
                    */

                    Debug.Log("user info:" + resultData);

                    var userInfoJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("userInfoJson:" + userInfoJson.ToString());

                }
            }
            else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL)
            {

                // 所有接口失败返回调用逻辑  所有失败信息请游戏接入方测试时log打印记录并反馈给sdk方  方便排查问题

                if (requestCode == DHSDKHelper.DHSDKConst.REQ_GET_USERINFO)
                {
                    //获取用户信息返回失败
                }
            }
        }

具体用户信息可参考官方文档:tt.getUserInfo (opens new window)

# 3.5 支付

抖音小游戏提供虚拟充值的能力,用户可以在游戏内下单,进行游戏内道具的购买。本文主要对游戏内的支付能力进行简单概述说明。

支付方式 在不同的设备环境中,因相关策略限制,SDK实现支付能力的方式有所区别,如下所示:

虚拟支付 利用 tt.requestGamePayment() 接口发起抖音虚拟支付,并直接购买游戏内服务或道具,适用于 Android 设备

钻石兑换 利用 tt.openAwemeCustomerService() 接口发起抖音钻石支付,购买抖音钻石;“钻石”是抖音平台向用户提供的,用于在抖音平台上进行相关消费的虚拟道具,用户可以使用钻石兑换游戏中的服务或道具,适用于 iOS 设备;使用钻石兑换能力需要登录《抖音开放平台控制台》进行开通,详情请参考《钻石兑换功能》文档说明

游戏客户端在接入SDK支付接口时,无需关心用户所处的设备环境,SDK将在内部自行识别并选择相应的支付方式以发起支付。

注意:接入支付相关能力前,需先完成IM客服能力接入,确保及时处理用户反馈,保证用户体验!

调用支付接口:

DHSDKHelper.DHSDKPayInfo payInfo = new DHSDKHelper.DHSDKPayInfo();
payInfo.AreaId = "100"; //选传,游戏大区ID,若游戏无大区概念,可不填,默认值为 1,表示初始大区编号
payInfo.AreaName = "1"; //选传,游戏大区名称,若游戏无大区概念,可不填,默认值为 1
payInfo.RoleId = "1"; //选传,角色ID,若游戏无角色概念,可不填,默认值同 accountId 账号ID
payInfo.RoleName = "1"; //选传,角色昵称
payInfo.RoleLevel = "1"; //选传,角色等级,若游戏无角色及等级概念,可填关卡等级或不填,默认值为 1
payInfo.Rate = "10";  //必传,游戏币兑换汇率,用于计算游戏币购买数量;例如:后台配置为 1:10,则 rate 为 10,表示1人民币=10游戏币;可登录《抖音开放平台控制台》后台,进入“商业化 > 虚拟支付 > 支付设置 > 基础信息 > 货币汇率”栏目中查看
payInfo.ItemId = "123"; //必传,商品ID
payInfo.ItemName = "goods"; //必传,商品名称
payInfo.ItemNum = "1"; //选传,商品数量,默认值为 1
payInfo.ItemPrice = "600"; //必传,商品单价,单位为分,请注意换算!!!
payInfo.Currency = "CNY"; //选传,货币类型,默认为 CNY
payInfo.Memo = ""; //选传,透传参数
payInfo.Remark = ""; //选传,备用透传参数

DHSDKHelper.pay(payInfo, mUnionSdkCallback);

支付回调:

注意:支付回调仅表示当前接口调用成功,不代表用户实际完成了支付流程,支付且发货成功应以游戏服务端下发通知为准

public void onDHSDKResult(int requestCode, int resultCode, String resultData)
        {
            if (resultCode == DHSDKHelper.DHSDKConst.RET_OK)
            {
                // 所有接口成功返回调用逻辑
                if (requestCode == DHSDKHelper.DHSDKConst.REQ_PAY)
                {

                    /**  
                      支付成功  
                    */

                    Debug.Log("pay info:" + resultData);

                   

                }
            }
            else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL)
            {

                // 所有接口失败返回调用逻辑  所有失败信息请游戏接入方测试时log打印记录并反馈给sdk方  方便排查问题

                if (requestCode == DHSDKHelper.DHSDKConst.REQ_PAY)
                {
                    //支付失败
                }
            }
        }

# 3.6 广告

当前SDK支持在游戏内创建并嵌入激励视频广告,接入之前需登录《抖音开放平台控制台》 (opens new window)后台,进入“商业化 > 流量主”,新建“激励广告”并获取广告位ID。

可在游戏初始化后调用创建广告接口,提前拉取广告,每个广告单元只需创建一次即可,后续可多次拉取和播放广告,创建时会自动拉取一次广告视频。

# 3.6.1 创建激励视频广告实例

用于在小游戏内创建并嵌入激励视频广告。

//创建广告实例,可以创建多个广告实例,使用adUnitId 来判断区分
        Dictionary<string, string> adInfo = DHSDKHelper.DHParam.Builder()
            .put("adUnitId", "asdcv123123")  //必传,广告位ID
            .put("event_type", "createAd")  // 必传,createAd 创建广告实例,loadAd 加载广告,couldPlayAd 是否可以播放  playAd 播放广告
            .put("adPlatform", "douyin")  //选传,广告平台
            .put("adPosition", "")  //选传,广告展示位置,预留参数,有就填写
            .toDictionary();

        DHSDKHelper.playAd(adInfo, mUnionSdkCallback);

# 3.6.2 加载广告视频

用于加载激励视频广告;一般情况下,创建广告后,广告数据会默认加载一次,如果拉取失败,可在适当位置重新加载。

//加载广告,根据广告id找到对应广告实例
        Dictionary<string, string> adInfo2 = DHSDKHelper.DHParam.Builder()
            .put("adUnitId", "asdcv123123")  //必传,广告位ID
            .put("event_type", "loadAd")  // 必传,createAd 创建广告实例,loadAd 加载广告,couldPlayAd 是否可以播放  playAd 播放广告
            .toDictionary();

        DHSDKHelper.playAd(adInfo2, mUnionSdkCallback);

# 3.6.3 判断是否能播放广告

判断广告单元id对应的广告实例是否创建好

//判断是否能播放广告,根据广告id找到对应广告实例
        Dictionary<string, string> adInfo3 = DHSDKHelper.DHParam.Builder()
            .put("adUnitId", "asdcv123123")  //必传,广告位ID
            .put("event_type", "couldPlayAd")  // 必传,createAd 创建广告实例,loadAd 加载广告,couldPlayAd 是否可以播放  playAd 播放广告
            .toDictionary();

        DHSDKHelper.playAd(adInfo3, mUnionSdkCallback);

# 3.6.4 播放广告

如果广告准备完毕,则可播放广告视频:

//播放广告,根据广告id找到对应广告实例
        Dictionary<string, string> adInfo4 = DHSDKHelper.DHParam.Builder()
            .put("adUnitId", "asdcv123123")  //必传,广告位ID
            .put("event_type", "playAd")  // 必传,createAd 创建广告实例,loadAd 加载广告,couldPlayAd 是否可以播放  playAd 播放广告
            .put("adPosition", "")  //选传,广告展示位置,预留参数,有就填写
            .toDictionary();

        DHSDKHelper.playAd(adInfo4, mUnionSdkCallback);

# 3.6.5 广告回调接口

public void onDHSDKResult(int requestCode, int resultCode, String resultData)
        {
            if (resultCode == DHSDKHelper.DHSDKConst.RET_OK)
            {
                // 所有接口成功返回调用逻辑
                if (requestCode == DHSDKHelper.DHSDKConst.REQ_AD_READY)
                {

                    //广告准备完毕,可根据adunityId获取对应的广告实例

                    Debug.Log("ad info:" + resultData);
                    var adJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("adJson:" + adJson.ToString());

                    string adUnityId = adJson["adUnitId"].ToString();


                }
                else if (requestCode == DHSDKHelper.DHSDKConst.REQ_AD)
                {
                    //广告播放成功,可根据adunityId获取对应的广告实例

                    Debug.Log("ad info:" + resultData);
                    var adJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("adJson:" + adJson.ToString());

                    string adUnityId = adJson["adUnitId"].ToString();
                }
                else if(requestCode == DHSDKHelper.DHSDKConst.REQ_AD_LOAD)
                {
                    //广告加载成功,可根据adunityId获取对应的广告实例

                    Debug.Log("ad info:" + resultData);
                    var adJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("adJson:" + adJson.ToString());

                    string adUnityId = adJson["adUnitId"].ToString();
                }
else if (requestCode == DHSDKHelper.DHSDKConst.REQ_AD_CLOSE)
                {
                    var adJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("loginJson:" + adJson.ToString());

                    string adUnityId = adJson["adUnitId"].ToString();

                }

            }
            else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL)
            {

                // 所有接口失败返回调用逻辑  所有失败信息请游戏接入方测试时log打印记录并反馈给sdk方  方便排查问题

                if (requestCode == DHSDKHelper.DHSDKConst.REQ_AD_READY)
                {

                    //广告尚未准备好,可根据adunityId获取对应的广告实例

                    Debug.Log("ad info:" + resultData);
                    var adJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("adJson:" + adJson.ToString());

                    string adUnityId = adJson["adUnitId"].ToString();



                }
                else if (requestCode == DHSDKHelper.DHSDKConst.REQ_AD)
                {
                    //广告播放失败,可根据adunityId获取对应的广告实例

                    Debug.Log("ad info:" + resultData);
                    var adJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("adJson:" + adJson.ToString());

                    string adUnityId = adJson["adUnitId"].ToString();
                }
                else if (requestCode == DHSDKHelper.DHSDKConst.REQ_AD_LOAD)
                {
                    //广告加载失败,可根据adunityId获取对应的广告实例

                    Debug.Log("ad info:" + resultData);
                    var adJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("adJson:" + adJson.ToString());

                    string adUnityId = adJson["adUnitId"].ToString();
                }
            }
        }

# 3.7 数据统计相关接口

用于上报并记录用户在游戏内的行为日志&事件(如:启动、登录、充值等行为),方便观察数据的变化、快速定位问题的根源,以及追踪程序执行的过程等。 主要上报接口如下

# 3.7.1 流程统计上报

用于上报并记录用户在游戏内的行为日志&事件(如:启动、登录、充值等行为),方便观察数据的变化、快速定位问题的根源,以及追踪程序执行的过程等。

上报相关流程统计数据(行为日志),在SDK初始化完成后即可调用 调用接口:

Dictionary<string, string> logParamsDic = new Dictionary<string, string>();
logParamsDic.Add("logLevel", "d"); // 必传,// 日志类型;d 用于标记普通日志,e 用于标记异常日志
logParamsDic.Add("logContent", ""); //必传,日志内容,可以是描述文本或JSON字符串等任意字符串,如程序执行错误信息或网络请求响应信息等
logParamsDic.Add("key", "value"); //宣传,自定义事件,可由运营提供

string eventId = "100100::SDK_CLIENT_LAUNCH"; //必传,事件ID
DHSDKHelper.track(eventId, logParamsDic);

# 3.7.2. 自定义事件上报

上报其它自定义事件(除启动、登录、充值等行为以外的自定义事件,如角色升级等);自定义事件的名称、参数无固定格式,非必接,请结合游戏业务需要或运营需求自行上报

调用接口:

Dictionary<string, string> cusParamsDic = new Dictionary<string, string>();
 cusParamsDic.Add("eventName", "levelUp"); // 必传, 自定义事件名称;如这里的 levelUp 代表角色升级事件

 cusParamsDic.Add("eventObj", ""); //选传,事件操作对象,如果是按钮点击事件,则对应按钮ID
 cusParamsDic.Add("eventResult", ""); //选传,事件操作结果,如果是按钮点击事件,则返回按钮点击的结果,例如跳转至另一个页面,则填写结果页ID
 cusParamsDic.Add("eventCode", ""); //选传,事件操作原因 code 码
 cusParamsDic.Add("statMode", "1"); //选传,数据统计方式:1 代表按 eventName+eventObj+eventCode 聚合后统计人数次数,2 代表按 eventName+eventObj+eventCode 取每个用户最新记录,然后统计人数次数
 cusParamsDic.Add("extendParamJson", ""); //选传, 扩展参数,格式为JSON字符串
 cusParamsDic.Add("areaId", ""); //选传,游戏大区ID,若游戏无大区概念,可不填,默认值为 1,表示初始大区编号
 cusParamsDic.Add("roleId", ""); //选传,角色ID,若游戏无角色概念,可不填,默认值同 accountId 账号ID

 string cusEventId = "custom"; //必传, 固定为custom,无需修改
 DHSDKHelper.track(cusEventId, cusParamsDic);

# 3.7.3. 启动场景数据上报

上报抖音启动场景数据;一般在接入了抖音《推荐流直出游戏能力》,且用户从推荐流进入游戏,并在游戏场景加载完成,达到可交互状态时需要接入(此时场景ID sceneId 固定传入 7001)。

调用接口:

Dictionary<string, string> sceneParamsDic = new Dictionary<string, string>();
sceneParamsDic.Add("sceneId", "7001"); // 必传, 场景ID,如这里的7001,表示游戏场景加载完成,达到用户可交互状态;可登录抖音开放平台控制台,进入“数据 > 性能分析 > 启动性能 > 启动场景配置”模块,添加游戏的自定义启动场景,游戏每次启动只可以上报一次
sceneParamsDic.Add("costTime", "1000"); //必传,场景耗时,单位ms
sceneParamsDic.Add("dimension", "{\"d1\":\"2.1.0\"}"); //选传,josn字符串字典格式,dimension为自定义维度数据
sceneParamsDic.Add("metric", "{\"m1\":\"546\"}"); //选传,metric为自定义指标数据

string sceneEventId = "scene"; //必传, scene,无需修改
DHSDKHelper.track(sceneEventId, sceneParamsDic);


# 3.7.4. 角色信息上报(SDK内部统计使用)

当有用户登录游戏服成功、创角成功、角色升级(如游戏无角色等级概念,则为关卡等级)时,均需调用此接口进行数据上报。

调用接口:

Dictionary<string, string> roleInfoParamsDic = new Dictionary<string, string>();
roleInfoParamsDic.Add("type", "LOGIN_GAME"); // 必传,上报类型 LOGIN_GAME - 登录游戏服 CREATE_ROLE - 创角 LEVEL_UP - 升级
roleInfoParamsDic.Add("areaId", "100"); //选传,游戏大区ID,若游戏无大区概念,可不填,默认值为 1,表示初始大区编号
roleInfoParamsDic.Add("areaName", ""); //选传,游戏大区名称
roleInfoParamsDic.Add("roleId", "123123"); //必传,角色ID,若游戏无角色概念,可不填,默认值同 accountId 账号ID
roleInfoParamsDic.Add("roleName", "abc"); //必传,角色名称
roleInfoParamsDic.Add("roleLevel", "1"); //必传,角色等级,若游戏无角色及等级概念,可填关卡等级或不填,默认值为 1
roleInfoParamsDic.Add("roleVipLevel", "1"); //选传,角色VIP等级
roleInfoParamsDic.Add("itemId", ""); //商品ID,仅在 type 为 PAY_SUCCESS 时必填!
roleInfoParamsDic.Add("itemName", ""); //商品名称,仅在 type 为 PAY_SUCCESS 时必填!
roleInfoParamsDic.Add("orderId", ""); //订单唯一编号,仅在 type 为 PAY_SUCCESS 时必填!
roleInfoParamsDic.Add("orderPrice", ""); //商品总价,即实际支付价格,单位为分!仅在 type 为 PAY_SUCCESS 时必填!
roleInfoParamsDic.Add("currency", "CNY"); //货币类型,仅在 type 为 PAY_SUCCESS 时选填! CNY - 人民币 USD - 美元
roleInfoParamsDic.Add("payType", ""); //支付方式,仅在 type 为 PAY_SUCCESS 时选填! weixinpay - 微信支付 alipay - 支付宝 yeepay - 易宝支付 unionpay - 银联
DHSDKHelper.gameRoleInfoUpload(roleInfoParamsDic);



# 3.8 查询接口

用户获取登录后用户信息,系统信息等参数

示例如下:

string version = DHSDKHelper.query("version"); //SDK的版本号,如 1.0.0
Debug.Log("version:" + version);
string system = DHSDKHelper.query("system");   //系统信息,详情请参考 wx.getSystemInfoSync() 接口文档
string platform = DHSDKHelper.query("system.platform"); //客户端设备类型 android - Android微信 ios - iOS微信 windows - Windows微信 mac - macOS微信 devtools - 微信开发者工具
Debug.Log("platform:" + platform);
string networkType = DHSDKHelper.query("networkType");  //网络类型,详情请参考 wx.getNetworkType() 接口文档
string deviceId = DHSDKHelper.query("deviceId");  //设备唯一标识(注意,因小游戏客户端SDK无法获取真实的设备唯一标识,故使用一个32位随机字符串作为设备唯一标识,并存储于客户端缓存中;后续进入小游戏,若有缓存则从缓存中获取,无缓存则重新生成并存入缓存;因此无法确保设备唯一标识的准确性)
string deviceOS = DHSDKHelper.query("deviceOS");  //设备类型,如minigame_android、minigame_ios、minigame_devtools等
string launchOptions = DHSDKHelper.query("launchOptions");  //小游戏的启动参数,详情请参考 wx.getLaunchOptionsSync() 接口文档
string gameAppId = DHSDKHelper.query("gameAppId");   //小游戏的 AppID(于微信公众平台注册小游戏时生成的ID)
string appId = DHSDKHelper.query("appId");   //小游戏的 AppID(于SDK平台注册小游戏时生成的ID)
string appName = DHSDKHelper.query("packageName");    //小游戏的应用包名,如 com.dianhun.abc
string appVersion = DHSDKHelper.query("appVersion");   //小游戏的版本号,如 2.0.4.10
string channel = DHSDKHelper.query("channel");    //渠道ID,如 1389
string mainChannel = DHSDKHelper.query("mainChannel");   //推广主渠道ID,如 100708
string secondChannel = DHSDKHelper.query("secondChannel");  //推广次渠道ID,如 100709
string userInfo = DHSDKHelper.query("userInfo");  //用户信息,仅在授权登录成功后可读
string loginType = DHSDKHelper.query("userInfo.loginType");  //用户授权登录类型
string token = DHSDKHelper.query("userInfo.token");   //用户授权登录Token
string sign = DHSDKHelper.query("userInfo.sign");   //签名(本地验签使用)
string region = DHSDKHelper.query("userInfo.region");   //所属地区,1 表示中国大陆,0 表示港澳台及海外
string loginTimestamp = DHSDKHelper.query("userInfo.loginTimestamp");   //登录时间,秒级时间戳
string expireTimestamp = DHSDKHelper.query("userInfo.expireTimestamp");   //登录态过期时间,秒级时间戳
string accountView = DHSDKHelper.query("userInfo.accountView");   //账号缩略
Debug.Log("token:" + token);
string account = DHSDKHelper.query("userInfo.accountName");   //用户账号
string accountId = DHSDKHelper.query("userInfo.accountId");  //用户账号ID
string openId = DHSDKHelper.query("userInfo.userExtraInfo.openId");   //用户抖音唯一标识(openId)
string userName = DHSDKHelper.query("userInfo.userExtraInfo.userName");   //用户在抖音侧的账号名称
string avatar = DHSDKHelper.query("userInfo.userExtraInfo.avatar");   //用户在抖音侧的头像
string nickName = DHSDKHelper.query("userInfo.userExtraInfo.nickName");   //用户在抖音侧的昵称

# 3.9 客服

当前SDK提供两种方式接入客服会话功能:抖音&抖音Lite内客服和其他宿主客服,可通过以下接口区分宿主环境:

string appName = DHSDKHelper.query("system.appName");

抖音&抖音Lite内客服:

当前支持的客服类型包括:

调用接口:

//抖音内直接打开客服
//抖音内直接打开客服
 Dictionary<string, string> paramsDic = new Dictionary<string, string>();
 paramsDic.Add("type", "1"); //选传,客服类型:1 - 小6客服(推荐)2 - 抖音IM客服(仅支持抖音)
 paramsDic.Add("action", "douyin"); //必传,douyin:抖音内直接打开客服  createBtn:其它宿主平台创建客服按钮,show:显示客服按钮,hide:隐藏客服按钮,destroy:销毁客服按钮
 paramsDic.Add("sessionFrom", ""); //选传,保留字段,暂时可以不填
 DHSDKHelper.showFAQ(paramsDic,mUnionSdkCallback);

其他宿主内客服:

用于在游戏内创建小6客服按钮,并在点击时跳转至小6客服页面,全app通用;管理员可登录《抖音小6客服》 (opens new window)后台查看或回复用户咨询的内容;使用前需开通并配置相关客服账号,关于其能力介绍、接入指南等更多内容请阅读小6客服消息能力(全app通用) (opens new window)文档说明。

调用接口:

//其他宿主平台创建客服按钮
Dictionary<string, string> paramsDic2 = new Dictionary<string, string>();
paramsDic.Add("type", "text"); //// 必传,按钮类型 text - 文本按钮,允许自定义背景色及文本 image - 图片按钮,仅允许设置背景贴图,背景贴图会直接拉伸至按钮的宽高
paramsDic.Add("action", "createBtn"); //必传,douyin:抖音内直接打开客服  createBtn:其它宿主平台创建客服按钮,show:显示客服按钮,hide:隐藏客服按钮,destroy:销毁客服按钮
paramsDic.Add("text", ""); //选传,文本按钮的文本,仅当 type 为 text 时有效
paramsDic.Add("image", ""); //选传,图片按钮的背景图片,仅当 type 为 image 时有效
paramsDic.Add("top", "376"); //必传,按钮左上角纵坐标
paramsDic.Add("left", "100"); //必传,按钮左上角横坐标
paramsDic.Add("width", "100"); //必传,按钮宽度
paramsDic.Add("height", "32"); //必传,按钮高度
paramsDic.Add("backgroundColor", "#07c160"); //选传,按钮背景颜色,格式为 6 位 16 进制数
paramsDic.Add("borderWidth", "0"); //选传,按钮边框宽度
paramsDic.Add("borderColor", "#07c160"); //选传,按钮边框颜色,格式为 6 位 16 进制数
paramsDic.Add("borderRadius", "0"); //选传,按钮边框圆角
paramsDic.Add("textColor", "#ffffff"); //选传,按钮文本颜色,格式为 6 位 16 进制数
paramsDic.Add("fontSize", "12"); //选传,按钮文本字号
paramsDic.Add("textAlign", "center"); //选传,按钮文本水平居中方式left - 居左 center - 居中 right - 居右
paramsDic.Add("lineHeight", "32"); //选传,按钮文本行高

DHSDKHelper.showFAQ(paramsDic2,mUnionSdkCallback);

回调:

public void onDHSDKResult(int requestCode, int resultCode, String resultData)
        {
            if (resultCode == DHSDKHelper.DHSDKConst.RET_OK)
            {
                // 所有接口成功返回调用逻辑
                if (requestCode == DHSDKHelper.DHSDKConst.REQ_SERVICE)
                {
                    Debug.Log("打开客服成功");
                }
            }
            else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL)
            {

                // 所有接口失败返回调用逻辑  所有失败信息请游戏接入方测试时log打印记录并反馈给sdk方  方便排查问题

                if (requestCode == DHSDKHelper.DHSDKConst.REQ_SERVICE)
                {

                    Debug.Log("打开客服失败");
                }
            }
        }


处理创建的客服按钮:

//处理创建的客服按钮
 Dictionary<string, string> paramsDic3 = new Dictionary<string, string>();
 paramsDic.Add("action", "destroy"); //必传,show:显示客服按钮,hide:隐藏客服按钮,destroy:销毁客服按钮
 DHSDKHelper.showFAQ(paramsDic3,mUnionSdkCallback);

# 3.10 分享

# 3.10.1 启用转发或分享按钮(被动分享)

用于启用游戏右上角•••菜单中的分享按钮,并同步设置其点击时的分享参数;建议在SDK初始化完成后立即调用此接口进行设置。

调用接口:

DHSDKHelper.DHSDKShareContent miniContent = new DHSDKHelper.DHSDKShareContent();
 miniContent.Type = DHSDKHelper.DHSDKShareType.shareType_minigame_set;
 miniContent.Platform = DHSDKHelper.DHSDKSharePlatform.Platform_MiniGame;
 miniContent.Title = "分享标题"; //选填,分享时显示的标题,不填时默认使用当前游戏的名称
 miniContent.ImageUrl = "";  //选填,分享时显示的图片链接,可以是网络图片路径,或本地图片文件路径,亦或相对代码包根目录的图片文件路径,建议长宽比为 5:4,不填时默认使用当前游戏的ICON图标
 miniContent.Desc = "";  //选填,分享时显示的描述文案,不填时默认使用当前游戏的简介
 miniContent.Query = "{\"param1\":\"value1\"}"; //选填,分享时携带的额外参数;点击分享消息进入游戏后,json字符串格式
 DHSDKHelper.share(miniContent, mUnionSdkCallback);

# 3.10.2 主动分享

用于主动拉起抖音发布器进行分享,亦或邀请好友、分享录屏等。

调用接口:

DHSDKHelper.DHSDKShareContent miniContent = new DHSDKHelper.DHSDKShareContent();
miniContent.Type = DHSDKHelper.DHSDKShareType.shareType_minigame_share;
miniContent.Platform = DHSDKHelper.DHSDKSharePlatform.Platform_MiniGame;
miniContent.Title = "分享标题"; //选填,分享时显示的标题,不填时默认使用当前游戏的名称
miniContent.ImageUrl = "";  //选填,分享时显示的图片链接,可以是网络图片路径,或本地图片文件路径,亦或相对代码包根目录的图片文件路径,建议长宽比为 5:4,不填时默认使用当前游戏的ICON图标
miniContent.Desc = "";  //选填,分享时显示的描述文案,不填时默认使用当前游戏的简介
miniContent.Query = "{\"param1\":\"value1\"}"; //选填,分享时携带的额外参数;点击分享消息进入游戏后,json字符串格式
miniContent.Channel = ""; //选填,转发内容类型,为空字符串或者不传时,使用默认分享方式;详情请参考 ShareParam 说明invite - 拉起邀请面板分享游戏给好友 video - 分享视频内容 picture - 发布图文内容,内容由接口参数直接传入 article - 发布图文内容 token - 口令分享,生成一串特定的字符串文本
miniContent.Extra = "{\"param1\":\"value1\"}"; //选填,附加信息,json字符串,仅当 channel 为 video 或 picture 时有效;详情请参考 ShareParam 说明
miniContent.TemplateId = ""; //选填,分享素材模板ID,指定通过抖音开放平台审核通过的 templateId 来选择分享内容
DHSDKHelper.share(miniContent, mUnionSdkCallback);

//当 channel 为 video 时,可以通过 extra 设置以下附加信息:
// 选项     类型 必填  默认值 说明
//withVideoId string     否--  是否支持跳转到播放页, 以及支持获取视频信息等接口;为 true 时会在 success 回调中带上 videoId
//videoPath   string 否   --视频地址,用于分享一个本地视频;如果不传入 videoPath,则会拉起摄像头拍摄界面
//videoTopics     array 否   --视频话题(仅抖音支持),目前由 hashtag_list 代替,即将废弃;为保证兼容性,建议同时设置 hashtag_list
//createChallenge string     否   false   是否分享为挑战视频(仅头条支持)
//video_title     string 否   ""  生成输入的默认文案
//hashtag_list    array 否   --视频话题,字符串中间包含空格会取第一个空格前内容作为话题(仅抖音支持)
//videoTag    string 否   --分享视频的标签,可以结合获取抖音视频排行榜使用
//defaultBgm  string 否   --抖音PGC音乐的短链(仅抖音支持,需要基础库版本大于 1.90),形如https://v.douyin.com/JmcxWo8/,参考抖音小游戏录屏带配乐能力
//cutTemplateId   string 否   --抖音上可用的剪映模板ID, 参考录屏添加剪映视频模板能力
//abortWhenCutTemplateUnavailable     string 否   false   剪映模板不可用或者剪映模板ID无效的时候是否直接回调失败

//当 channel 为 picture 时,可以通过 extra 设置以下附加信息:
//选项 类型  必填 默认值     说明
//picturePath     string[] 是   --发布的图片地址,仅支持本地图片路径(即游戏包内路径和 ttfile:// 路径)
//contentTitle    string 否   --作品标题
//contentDescription  string 否   --作品描述信息
//hashtag_list array   否--  视频话题,字符串中间包含空格会取第一个空格前内容作为话题(仅抖音支持)

# 3.11 游戏对局回放

# 3.11.1 录制游戏画面

游戏对局回放是一组录制游戏画面来生成对局回放,并可以将对局回放分享给朋友的API,收到分享链接的抖音用户可点击链接查看回放,或进入游戏等。

注意,该能力暂不支持使用抖音开发者工具调试,请使用真机预览测试!

录制视频相关接口:

//创建全局单例录制器
        string param = DHSDKHelper.DHJsonParam.Builder()
            .put("action", "create")       // 必传,操作字段
            .toJson();
        DHSDKHelper.gameRecord(param, mUnionSdkCallback);
        //监听录制开始事件,回调函数被执行时表示录制已开始
        string param = DHSDKHelper.DHJsonParam.Builder()
            .put("action", "onStart")       // 必传,操作字段
            .toJson();
        DHSDKHelper.gameRecord(param, mUnionSdkCallback);
        //监听录制结束事件,回调函数被执行时表示录制已完成
        string param = DHSDKHelper.DHJsonParam.Builder()
            .put("action", "onStop")       // 必传,操作字段
            .toJson();
        DHSDKHelper.gameRecord(param, mUnionSdkCallback);
        //监听录制暂停事件,回调函数被执行时表示录制已暂停
        string param = DHSDKHelper.DHJsonParam.Builder()
            .put("action", "onPause")       // 必传,操作字段
            .toJson();
        DHSDKHelper.gameRecord(param, mUnionSdkCallback);
        //监听录制恢复事件,回调函数被执行时表示录制已恢复
        string param = DHSDKHelper.DHJsonParam.Builder()
            .put("action", "onResume")       // 必传,操作字段
            .toJson();
        DHSDKHelper.gameRecord(param, mUnionSdkCallback);
        //监听录制中断开始事件,回调函数被执行时表示中断开始
        string param = DHSDKHelper.DHJsonParam.Builder()
            .put("action", "onInterruptionBegin")       // 必传,操作字段
            .toJson();
        DHSDKHelper.gameRecord(param, mUnionSdkCallback);
        //监听录制中断结束事件,回调函数被执行时表示录制中断结束
        string param = DHSDKHelper.DHJsonParam.Builder()
            .put("action", "onInterruptionEnd")       // 必传,操作字段
            .toJson();
        DHSDKHelper.gameRecord(param, mUnionSdkCallback);
        //监听录制错误事件,回调函数被执行时表示获取错误信息
        string param = DHSDKHelper.DHJsonParam.Builder()
            .put("action", "onError")       // 必传,操作字段
            .toJson();
        DHSDKHelper.gameRecord(param, mUnionSdkCallback);
        //开始录制
        string param = DHSDKHelper.DHJsonParam.Builder()
            .put("action", "start")       // 必传,操作字段
            .put("duration", "10")       // 选传,视频时长限制,单位为秒;最小值 3,最大值 300,到达指定时长后不会再录制,但仍然需要手动调用 stop 来结束录制
            .put("isMarkOpen", "true")       // 选传,是否添加水印,会在录制出来的视频上添加默认水印,目前不支持自定义水印图案;用户客户端基础库版本不低于 1.69.0 时支持
            .put("locTop", "0")       // 选传,水印距离屏幕上边界的位置,单位为 dp;用户客户端基础库版本不低于 1.69.0 时支持
            .put("locLeft", "0")       // 选传,水印距离屏幕左边界的位置,单位为 dp;用户客户端基础库版本不低于 1.69.0 时支持
            .put("frameRate", "30")       // 选传,设置录制帧率,对于性能较差的手机可以调低参数以降低录制性能消耗;用户客户端基础库版本不低于 1.80.0 时支持
            .toJson();
        DHSDKHelper.gameRecord(param, mUnionSdkCallback);
        //暂停录制
        string param = DHSDKHelper.DHJsonParam.Builder()
            .put("action", "pause")       // 必传,操作字段
            .toJson();
        DHSDKHelper.gameRecord(param, mUnionSdkCallback);
        //恢复录制
        string param = DHSDKHelper.DHJsonParam.Builder()
            .put("action", "resume")       // 必传,操作字段
            .toJson();
        DHSDKHelper.gameRecord(param, mUnionSdkCallback);
        //结束录制
        string param = DHSDKHelper.DHJsonParam.Builder()
            .put("action", "stop")       // 必传,操作字段
            .toJson();
        DHSDKHelper.gameRecord(param, mUnionSdkCallback);
        //记录精彩的视频片段
        //记录精彩的视频片段,调用时必须是正在录制,以调用时的录制时刻为基准,指定前 x 秒,后 y 秒为将要裁剪的片段,可以多次调用,记录不同时刻;在结束录制时,可以调用 clipVideo 接口剪辑并合成记录的片段
        string param = DHSDKHelper.DHJsonParam.Builder()
            .put("action", "recordClip")       // 必传,操作字段
            .put("timeRange", "")       // 选传,数组的值表示记录这一时刻的前后时间段内的视频,单位为秒,是一个二维数组json字符串,单位毫秒,内部都是字符串,如 "["["1000", "3000"]", "["4000", "5000"]"] "
            .toJson();
        DHSDKHelper.gameRecord(param, mUnionSdkCallback);
        //剪辑精彩的视频片段
        string param = DHSDKHelper.DHJsonParam.Builder()
            .put("action", "clipVideo")       // 必传,操作字段
            .put("timeRange", "")       // 选传,裁剪的范围,用法含义与recordClip接口中的 timeRange 完全相同,只是记录时相对的当前时刻规定为录制结束时刻,是一个二维数组json字符串,单位毫秒,内部都是字符串,如 "["["1000", "3000"]", "["4000", "5000"]"] "
            .put("clipRange", "")       // 选传,指定要裁剪的范围,数组中每一项为调用recordClip接口得到返回值,是一个二维数组json字符串,单位毫秒,内部都是字符串,如 "["["1000", "3000"]", "["4000", "5000"]"] "
            .toJson();
        DHSDKHelper.gameRecord(param, mUnionSdkCallback);
        //获取水印宽高
        string param = DHSDKHelper.DHJsonParam.Builder()
            .put("action", "getMark")       // 必传,操作字段
            .toJson();
        DHSDKHelper.gameRecord(param, mUnionSdkCallback);

回调:

public void onDHSDKResult(int requestCode, int resultCode, String resultData)
        {
            if (resultCode == DHSDKHelper.DHSDKConst.RET_OK)
            {
                // 所有接口成功返回调用逻辑
                if (requestCode == DHSDKHelper.DHSDKConst.REQ_GAME_RECORD)
                {
                    Debug.Log("录制视频操作成功");
                    var recordJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("recordJson:" + recordJson.ToString());

                    string action = recordJson["action"].ToString();
                    /*
                    action事件名称
                    
                    create - 创建录制器成功事件
                    onStart - 录制开始事件
                    onPause - 录制暂停事件
                    onResume - 录制恢复事件
                    onStop - 录制结束事件
                    onInterruptionBegin - 录制中断开始事件
                    onInterruptionEnd - 录制中断结束事件
                    onError - 错误事件
                    recordClip - 记录精彩的视频片段回调
                    clipVideo - 剪辑精彩的视频片段回调
                    getMark - 获取水印宽高回调
                    */
                    if(action == "stop")
                    {
                        string duration = recordJson["videoPath"].ToString();//录屏文件的临时路径
                    }
                    else if(action == "recordClip")
                    {
                        string index = recordJson["index"].ToString();//裁剪片段的唯一索引,用于clipVideo接口调用时指定裁剪拼接顺序
                    }
                    else if(action == "error")
                    {
                        string message = recordJson["errMsg"].ToString();//录屏的错误信息

                    }
                    else if(action == "clipVideo")
                    {
                        string videoPath = recordJson["videoPath"].ToString();//剪辑的视频地址

                    }
                    else if(action == "getMark")
                    {
                        string markWidth = recordJson["markWidth"].ToString();//水印的宽度;用户客户端基础库版本不低于 1.69.0 时支持
                        string markHeight = recordJson["markHeight"].ToString();//水印的高度;用户客户端基础库版本不低于 1.69.0 时支持
                    }

                }
}        
            else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL)
            {

                // 所有接口失败返回调用逻辑  所有失败信息请游戏接入方测试时log打印记录并反馈给sdk方  方便排查问题

                if (requestCode == DHSDKHelper.DHSDKConst.REQ_GAME_RECORD)
                {
                    Debug.Log("录制视频失败");
                    var recordJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("recordJson:" + recordJson.ToString());

                    string action = recordJson["action"].ToString();
                    /*
                    action事件名称

                    create - 创建录制器成功事件
                    onStart - 录制开始事件
                    onPause - 录制暂停事件
                    onResume - 录制恢复事件
                    onStop - 录制结束事件
                    onInterruptionBegin - 录制中断开始事件
                    onInterruptionEnd - 录制中断结束事件
                    onError - 错误事件
                    recordClip - 记录精彩的视频片段回调
                    clipVideo - 剪辑精彩的视频片段回调
                    getMark - 获取水印宽高回调
                    */
                }
           }


# 3.11.2 分享对局回放

游戏对局回放的分享可以通过调用接口 DHSDKHelper.gameRecordShare 触发。

分享回放

string shareParam = DHSDKHelper.DHJsonParam.Builder()
    .put("title", "标题")       // 选传,分享时显示的标题
    .put("desc", "内容")       // 选传,分享时显示的描述文案
    .put("query", "")      // 选传,分享时携带的额外参数;点击分享消息进入游戏后,可通过 DHSDKHelper.query("launchOptions")方法 或调用抖音原生方法 tt.getLaunchOptionsSync() 获取该信息
    .put("videoTitle", "")      // 选传,默认的输入文案
    .put("templateId", "")      // 选传,分享文案模板ID,通过指定该参数来选择分享文案,文案内容需在抖音开放平台设置且通过审核
    .put("videoPath", "")      // 必传,视频地址,分享一个本地视频;其值可在onStop(录制结束事件的回调函数中获取
    .put("videoTopics", "")      // 选传,视频话题,字符串中间包含空格会取第一个空格前的内容作为话题(仅抖音支持),是一个二维数组json字符串,
    .put("videoTag", "")       // 选传,视频标签,可以结合获取抖音视频排行榜使用
    .put("videoBgm", "")      // 选传,抖音PGC音乐的短链(仅抖音支持,需要基础库版本大于 1.90.0),形如https://v.douyin.com/JmcxWo8/,参考抖音小游戏录屏带配乐能力
    .toJson();
DHSDKHelper.gameRecordShare(shareParam, mUnionSdkCallback);

回调:

public void onDHSDKResult(int requestCode, int resultCode, String resultData)
        {
            if (resultCode == DHSDKHelper.DHSDKConst.RET_OK)
            {
                // 所有接口成功返回调用逻辑
                if (requestCode == DHSDKHelper.DHSDKConst.REQ_GAME_RECORD_SHARE)
                {
                    Debug.Log("录制视频分享成功");
                    var recordJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("recordJson:" + recordJson.ToString());
                } 
}          
            else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL)
            {

                // 所有接口失败返回调用逻辑  所有失败信息请游戏接入方测试时log打印记录并反馈给sdk方  方便排查问题

                if (requestCode == DHSDKHelper.DHSDKConst.REQ_GAME_RECORD_SHARE)
                {
                    Debug.Log("录制视频分享失败");
                    var recordJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("recordJson:" + recordJson.ToString());                
}
            }
        }

# 3.12 侧边栏复访能力

随着抖音小游戏复访能力的完善,抖音首页侧边栏日活持续增高,平台推荐开发者均接入抖音首页侧边栏复访教育,引导用户从首页侧边栏进入游戏,养成打开抖音 > 打开首页侧边栏 > 快速访问游戏的心智,大幅提升次留、7留。

此能力已于2023年11月24日起开启「必接审核」,未接入该能力的游戏在「新游首发」或「版本更新」环节会有「拒审」风险,为避免影响游戏上线&更新节奏,同时也为了提升游戏留存,请务必接入此能力,感谢您的配合!

# 3.12.1 判断是否支持跳转至侧边栏

用于判断当前宿主环境是否支持跳转至某个游戏入口场景,目前仅支持「侧边栏」场景。

string sceneParamStr = DHSDKHelper.DHJsonParam.Builder()  
            .put("action", "checkScene")     // 必传,类型 checkScene - 判断是否支持跳转至侧边栏 navigateToScene - 跳转至侧边栏
            .put("scene", "sidebar")        //选传,待确认的入口场景,目前仅支持 sidebar 侧边栏
            .toJson();    
    DHSDKHelper.scene(sceneParamStr,mUnionSdkCallback);

回调:

public void onDHSDKResult(int requestCode, int resultCode, String resultData)
        {
            if (resultCode == DHSDKHelper.DHSDKConst.RET_OK)
            {
                // 所有接口成功返回调用逻辑
                if (requestCode == DHSDKHelper.DHSDKConst.REQ_SCENE)
                {
                    var sceneJson = LitJson.JSON.Parse(resultData);

                    Debug.Log("sceneJson:" + resultData);

                    /*  
                     action 事件名称

                    checkScene – 判断是否支持跳转侧边栏
                    navigateToScene – 跳转至侧边栏
                    */ 
                    var action = sceneJson["action"].toString();
                    if(action == "checkScene"){
                        string isExist = secneJson["data"] ["isExist"].toString();// 是否支持 true:支持  false:不支持
}

                }
            }
            else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL)
            {

                // 所有接口失败返回调用逻辑  所有失败信息请游戏接入方测试时log打印记录并反馈给sdk方  方便排查问题

                if (requestCode == DHSDKHelper.DHSDKConst.REQ_SCENE)
                {

                    
                }
            }
        }

# 3.12.2 跳转至侧边栏

用于跳转至某个游戏入口场景,目前仅支持「侧边栏」场景。

string sceneParamStr = DHSDKHelper.DHJsonParam.Builder()  
            .put("action", "navigateToScene")     // 必传,类型 checkScene - 判断是否支持跳转至侧边栏 navigateToScene - 跳转至侧边栏
            .put("scene", "sidebar")        //选传,待确认的入口场景,目前仅支持 sidebar 侧边栏
            .toJson();    
    DHSDKHelper.scene(sceneParamStr,mUnionSdkCallback);


回调:

public void onDHSDKResult(int requestCode, int resultCode, String resultData)
        {
            if (resultCode == DHSDKHelper.DHSDKConst.RET_OK)
            {
                // 所有接口成功返回调用逻辑
                if (requestCode == DHSDKHelper.DHSDKConst.REQ_SCENE)
                {
                    var sceneJson = LitJson.JSON.Parse(resultData);

                    Debug.Log("sceneJson:" + resultData);

                    /*  
                     action 事件名称

                    checkScene – 判断是否支持跳转侧边栏
                    navigateToScene – 跳转至侧边栏
                    */ 
                    var action = sceneJson["action"];
                    if(action == "navigateToScene"){
                        //跳转成功
}

                }
            }
            else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL)
            {

                // 所有接口失败返回调用逻辑  所有失败信息请游戏接入方测试时log打印记录并反馈给sdk方  方便排查问题

                if (requestCode == DHSDKHelper.DHSDKConst.REQ_SCENE)
                {

                    
                }
            }
        }

# 3.13 推荐流游戏直出能力

推荐流游戏直出能力(即直玩能力)是一种通过游戏内的关键信息,在抖音推荐流提醒用户别错过关键信息的触达能力。

• 以游戏内的高价值信息为深度玩家的召回抓手,使用游戏进程中的不同场景掉落的重点信息进行触达召回;

• 通过预加载能力,实现抖音推荐流无缝进入游戏的体验,将预加载完成的游戏在推荐流中分发给符合条件的用户。

推荐流游戏直出能力分为"获客版"和"复访版"两种模式,具体接入方案请参考:

# 3.13.1 查阅直玩订阅状态

用于查询用户直玩订阅的授权状态。

string jsonStr = DHSDKHelper.DHJsonParam.Builder()              
   .put("type", "play")  //必传,订阅Feed流的类型,目前仅支持 play 直玩场景
   .put("allScene", "true")  //选传,是否为全场景订阅
   .put("scene", "1")  //选传,订阅的场景ID(非全场景下必传)1 - 离线收益场景 2 - 体力恢复场景 3 - 重要事件掉落
   .toJson(); 
string jsonParamStr = DHSDKHelper.DHJsonParam.Builder()
   .put("pluginName", "tools")
   .put("pluginType", "platform")
   .put("methodName", "checkFeedSubscribeStatus")
   .put("methodParam", jsonStr)   
   .toJson();    
DHSDKHelper.exec(jsonParamStr, mUnionSdkCallback);

回调:

public void onDHSDKResult(int requestCode, int resultCode, String resultData)
        {
            if (resultCode == DHSDKHelper.DHSDKConst.RET_OK)
            {
                // 所有接口成功返回调用逻辑
                if (requestCode == DHSDKHelper.DHSDKConst.REQ_EXEC)
                {

                    var execJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("execJson:" + execJson.ToString());

                    string event_type = execJson["methodName"].ToString();
                    /*
                    event_type事件名称
                    
                    checkFeedSubscribeStatus - 查阅直玩订阅状态

                    */
                    if (event_type == "checkFeedSubscribeStatus")
{
    string status = execJson["data"]["status"].ToString(); //是否已订阅,ture:是  false:否
}

                }            
}
            else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL)
            {

                // 所有接口失败返回调用逻辑  所有失败信息请游戏接入方测试时log打印记录并反馈给sdk方  方便排查问题

                if (requestCode == DHSDKHelper.DHSDKConst.REQ_EXEC)
                {

                    var execJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("execJson:" + execJson.ToString());

                    string event_type = execJson["methodName"].ToString();
                    
                    if (event_type == "checkFeedSubscribeStatus")
{
    
}

                }        


                }           
 }
        }


# 3.13.2 订阅直玩

用于向用户请求授权,允许游戏在满足一定的条件后出现在Feed流中。

直玩订阅能力仅支持抖音、抖音Lite,且必须在登录后才能调用;本接口存在频控限制,需要注意调用场景和频率。

string jsonStr = DHSDKHelper.DHJsonParam.Builder()
    .put("type", "play")  //必传,订阅Feed流的类型,目前仅支持 play 直玩场景
    .put("allScene", "true")  //选传,是否为全场景订阅
    .put("scene", "1")  //选传,订阅的场景ID(非全场景下必传)1 - 离线收益场景 2 - 体力恢复场景 3 - 重要事件掉落
    .put("contentIds", "[\"123456\",\"234567\"]")  //选传,自定义提醒文案的 contentId 数组json字符串(非全场景下必传);contentId 在抖音开放平台控制台申请开通直玩能力后可获取
    .toJson();
 string jsonParamStr = DHSDKHelper.DHJsonParam.Builder()
    .put("pluginName", "tools")
    .put("pluginType", "platform")
    .put("methodName", "subscribeFeedMessage")
    .put("methodParam", jsonStr)
    .toJson();
 DHSDKHelper.exec(jsonParamStr, mUnionSdkCallback);

回调:

public void onDHSDKResult(int requestCode, int resultCode, String resultData)
        {
            if (resultCode == DHSDKHelper.DHSDKConst.RET_OK)
            {
                // 所有接口成功返回调用逻辑
                if (requestCode == DHSDKHelper.DHSDKConst.REQ_EXEC)
                {

                    var execJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("execJson:" + execJson.ToString());

                    string event_type = execJson["methodName"].ToString();
                    /*
                    event_type事件名称
                    
                    checkFeedSubscribeStatus - 查阅直玩订阅状态
subscribeFeedMessage - 订阅直玩
                    */
                    if (event_type == "subscribeFeedMessage")
{
    string success = execJson["data"]["success"].ToString(); //是否已订阅,ture:是  false:否
}
                }            
}
            else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL)
            {

                // 所有接口失败返回调用逻辑  所有失败信息请游戏接入方测试时log打印记录并反馈给sdk方  方便排查问题

                if (requestCode == DHSDKHelper.DHSDKConst.REQ_EXEC)
                {

                    var execJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("execJson:" + execJson.ToString());

                    string event_type = execJson["methodName"].ToString();
                    /*
                    event_type事件名称
                    
                    checkFeedSubscribeStatus - 查阅直玩订阅状态
subscribeFeedMessage - 订阅直玩
                    */
                    if(event_type == "subscribeFeedMessage")
{

}

                }           
 }
        }


# 3.13.3 监听进入/退出小游戏事件

用于监听Feed流进入/退出小游戏事件,仅限推荐流游戏直出场景。

直玩订阅能力仅支持抖音、抖音Lite。

string jsonParamStr = DHSDKHelper.DHJsonParam.Builder()
string jsonParamStr = DHSDKHelper.DHJsonParam.Builder()
    .put("pluginName", "tools")
    .put("pluginType", "platform")
    .put("methodName", "onFeedStatusChange")
    .toJson();
 DHSDKHelper.exec(jsonParamStr, mUnionSdkCallback);

回调:

public void onDHSDKResult(int requestCode, int resultCode, String resultData)
        {
            if (resultCode == DHSDKHelper.DHSDKConst.RET_OK)
            {
                // 所有接口成功返回调用逻辑
                if (requestCode == DHSDKHelper.DHSDKConst.REQ_EXEC)
                {

                    var execJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("execJson:" + execJson.ToString());

                    string event_type = execJson["methodName"].ToString();
                    /*
                    event_type事件名称
                    
                    checkFeedSubscribeStatus - 查阅直玩订阅状态
subscribeFeedMessage - 订阅直玩
onFeedStatusChange - 监听进入/退出小游戏事件
                    */
                    if (event_type == "onFeedStatusChange")
                    {
                     string success = execJson["data"]["type"].ToString(); //为 feedEnter 时表示从Feed流进入小游戏,为 feedExit 时表示退出小游戏回到Feed流
                      }                
}            
}
            else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL)
            {

                // 所有接口失败返回调用逻辑  所有失败信息请游戏接入方测试时log打印记录并反馈给sdk方  方便排查问题

                if (requestCode == DHSDKHelper.DHSDKConst.REQ_EXEC)
                {

                    var execJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("execJson:" + execJson.ToString());

                    string event_type = execJson["methodName"].ToString();
                    /*
                    event_type事件名称
                    
                    checkFeedSubscribeStatus - 查阅直玩订阅状态
subscribeFeedMessage - 订阅直玩
onFeedStatusChange - 监听进入/退出小游戏事件
                    */
                    if (event_type == "onFeedStatusChange")
                    {
                    }
                }           
 }
        }

# 3.13.4 取消监听进入/退出小游戏事件

用于取消监听Feed流进入/退出小游戏事件,仅限推荐流游戏直出场景。

直玩订阅能力仅支持抖音、抖音Lite。

string jsonParamStr = DHSDKHelper.DHJsonParam.Builder()
   .put("pluginName", "tools")
   .put("pluginType", "platform")
   .put("methodName", "offFeedStatusChange")
   .toJson();
DHSDKHelper.exec(jsonParamStr, mUnionSdkCallback);

回调:

public void onDHSDKResult(int requestCode, int resultCode, String resultData)
        {
            if (resultCode == DHSDKHelper.DHSDKConst.RET_OK)
            {
                // 所有接口成功返回调用逻辑
                if (requestCode == DHSDKHelper.DHSDKConst.REQ_EXEC)
                {

                    var execJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("execJson:" + execJson.ToString());

                    string event_type = execJson["methodName"].ToString();
                    /*
                    event_type事件名称
                    
                    checkFeedSubscribeStatus - 查阅直玩订阅状态
subscribeFeedMessage - 订阅直玩
onFeedStatusChange - 监听进入/退出小游戏事件
offFeedStatusChange - 退出监听进入/退出小游戏事件                    */
                    if (event_type == "offFeedStatusChange")
 {
     string success = execJson["data"]["type"].ToString(); //为 feedEnter 时表示从Feed流进入小游戏,为 feedExit 时表示退出小游戏回到Feed流
 }                
}            
}
            else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL)
            {

                // 所有接口失败返回调用逻辑  所有失败信息请游戏接入方测试时log打印记录并反馈给sdk方  方便排查问题

                if (requestCode == DHSDKHelper.DHSDKConst.REQ_EXEC)
                {

                    var execJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("execJson:" + execJson.ToString());

                    string event_type = execJson["methodName"].ToString();
                    /*
                    event_type事件名称
                    
                    checkFeedSubscribeStatus - 查阅直玩订阅状态
subscribeFeedMessage - 订阅直玩
onFeedStatusChange - 监听进入/退出小游戏事件
offFeedStatusChange - 退出监听进入/退出小游戏事件
                    */
                    if (event_type == "offFeedStatusChange")
 {
     
 }
                }           
 }
        }

# 3.13.5 获取游戏启动参数

用于获取游戏启动参数、启动场景值,以及自定义信息等,从而判断当前游戏启动是否是推荐流直出场景,并自动加载到相关的游戏场景。

string jsonParamStr = DHSDKHelper.DHJsonParam.Builder()
   .put("pluginName", "tools")
   .put("pluginType", "platform")
   .put("methodName", "getLaunchOptionsSync")
   .toJson();
DHSDKHelper.exec(jsonParamStr, mUnionSdkCallback);

回调:

public void onDHSDKResult(int requestCode, int resultCode, String resultData)
        {
            if (resultCode == DHSDKHelper.DHSDKConst.RET_OK)
            {
                // 所有接口成功返回调用逻辑
                if (requestCode == DHSDKHelper.DHSDKConst.REQ_EXEC)
                {

                    var execJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("execJson:" + execJson.ToString());

                    string event_type = execJson["methodName"].ToString();
                    /*
                    event_type事件名称
                    
                    checkFeedSubscribeStatus - 查阅直玩订阅状态
subscribeFeedMessage - 订阅直玩
onFeedStatusChange - 监听进入/退出小游戏事件
offFeedStatusChange - 退出监听进入/退出小游戏事件 
getLaunchOptionsSync – 获取游戏启动参数
*/
                    if (event_type == "getLaunchOptionsSync")
 {
     string scene = execJson["scene"].ToString(); //启动场景值,推荐流直出场景后四位为3041,例如203041
     string feed_game_scene = execJson["query"]["feed_game_scene"].ToString(); //游戏场景类型:1-离线收益场景;2-体力恢复场景;3-重要事件掉落
string feed_game_content_id = execJson["query"]["feed_game_content_id"].ToString(); //本次启动对应的内容ID
string feed_game_channel = execJson["query"]["feed_game_channel"].ToString(); //渠道表示:1-复访用户;2-获客用户
string feed_game_extra = execJson["query"]["feed_game_extra"].ToString(); //游戏自定义扩展信息,可通过推荐流直出游戏能力SPI接入文档接口的extra字段进行赋值

 }                
}            
}
            else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL)
            {

                // 所有接口失败返回调用逻辑  所有失败信息请游戏接入方测试时log打印记录并反馈给sdk方  方便排查问题

                if (requestCode == DHSDKHelper.DHSDKConst.REQ_EXEC)
                {

                    var execJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("execJson:" + execJson.ToString());

                    string event_type = execJson["methodName"].ToString();
                    /*
                    event_type事件名称
                    
                    checkFeedSubscribeStatus - 查阅直玩订阅状态
subscribeFeedMessage - 订阅直玩
onFeedStatusChange - 监听进入/退出小游戏事件
offFeedStatusChange - 退出监听进入/退出小游戏事件
getLaunchOptionsSync – 获取游戏启动参数
                    */
                    if (event_type == "getLaunchOptionsSync")
 {
     
 }
                }           
 }
        }

# 3.13.6 上报加载完成时机

游戏客户端完成对应游戏场景加载后,需调用此接口进行加载完成事件上报,否则游戏不会在用户的抖音推荐流中展示。

// 上报加载完成时机
 string jsonStr = DHSDKHelper.DHJsonParam.Builder()
.put("sceneId", "7001")  //必传,场景ID,固定为 7001,标识游戏场景加载完成,达到用户可交互状态
.put("costTime", "0")  //选传,场景耗时,单位ms
.put("dimension", "{\"key1\":\"value\"}")  //选传,自定义维度数据,只能传json字符串,且序列化后长度不超过 1024 个字符 
.put("metric", "{\"key1\":\"value\"}")  //选传,自定义指标数据,只能传json字符串,且序列化后长度不超过 1024 个字符 
.toJson();
 string jsonParamStr = DHSDKHelper.DHJsonParam.Builder()
    .put("pluginName", "tools")
    .put("pluginType", "platform")
    .put("methodName", "reportScene")
    .put("methodParam", jsonStr)
    .toJson();
 DHSDKHelper.exec(jsonParamStr, mUnionSdkCallback);

回调:

public void onDHSDKResult(int requestCode, int resultCode, String resultData)
        {
            if (resultCode == DHSDKHelper.DHSDKConst.RET_OK)
            {
                // 所有接口成功返回调用逻辑
                if (requestCode == DHSDKHelper.DHSDKConst.REQ_EXEC)
                {

                    var execJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("execJson:" + execJson.ToString());

                    string event_type = execJson["methodName"].ToString();
                    /*
                    event_type事件名称
                    
                    checkFeedSubscribeStatus - 查阅直玩订阅状态
subscribeFeedMessage - 订阅直玩
onFeedStatusChange - 监听进入/退出小游戏事件
offFeedStatusChange - 退出监听进入/退出小游戏事件 
getLaunchOptionsSync – 获取游戏启动参数
reportScene 上报加载完成时机
*/
                    if (event_type == "reportScene")
 {
     string code = execJson["code"].ToString(); //相应状态码,0:接口调用成功;非0:接口调用失败
     string data = execJson["data"].ToString(); //接口调用成功时返回开发者传入的原始数据,接口调用失败返回null
string message = execJson["message"].ToString(); //接口调用成功或失败对应的描述信息
 }                
}            
}
            else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL)
            {

                // 所有接口失败返回调用逻辑  所有失败信息请游戏接入方测试时log打印记录并反馈给sdk方  方便排查问题

                if (requestCode == DHSDKHelper.DHSDKConst.REQ_EXEC)
                {

                    var execJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("execJson:" + execJson.ToString());

                    string event_type = execJson["methodName"].ToString();
                    /*
                    event_type事件名称
                    
                    checkFeedSubscribeStatus - 查阅直玩订阅状态
subscribeFeedMessage - 订阅直玩
onFeedStatusChange - 监听进入/退出小游戏事件
offFeedStatusChange - 退出监听进入/退出小游戏事件
getLaunchOptionsSync – 获取游戏启动参数
reportScene 上报加载完成时机
                    */
                    if (event_type == "reportScene")
 {
     
 }
                }           
 }
        }

# 3.14 订阅消息

基于抖音的通知渠道,抖音小游戏为开发者提供了可以高效触达用户的订阅消息能力,以便实现服务的闭环并提供更佳的体验。开发者在游戏内,可向用户发起消息订阅。开发者需后台自行记录用户是否订阅成功及订阅成功的次数。

用户在小游戏中订阅指定的消息内容后,开发者可以在后台通过下发消息服务把一条模版消息发送给用户,用户最终在抖音的 “消息-游戏通知” 中收到。

用户成功订阅一次,开发者可在游戏认为场景合适的时机,向该用户发下一条模版消息。

# 3.14.1 一次性订阅消息

用于在游戏内打开一次性订阅消息界面,返回用户订阅消息的操作结果;若用户勾选了订阅面板中的“总是保持以上选择,不再询问”,或是点击了订阅面板中的 “拒绝,不再询问” ,模板消息会被添加到用户的游戏设置页,可通过 sdkInstance.getSetting() 接口获取用户对相关模板消息的订阅状态;当用户成功订阅一次,开发者可在游戏认为场景合适的时机,向该用户下发一条模版消息(了解更多可查看小游戏订阅消息能力介绍)。

string messageParam = DHSDKHelper.DHJsonParam.Builder()
   .put("action", "message")
   .put("tmplIds", "[\"tmpid1\",\"tmpid2\"]")   //必传,需要订阅的消息模板 id 集合,一次调用最多可订阅 3 条消息;可登录《抖音开放平台控制台》后台,进入“运营 > 运营能力 > 订阅消息”栏目中配置及查看一次性订阅消息 id(MSG开头)
   .toJson();
DHSDKHelper.subscribeAction(messageParam, mUnionSdkCallback);

回调:

public void onDHSDKResult(int requestCode, int resultCode, String resultData)
        {
            if (resultCode == DHSDKHelper.DHSDKConst.RET_OK)
            {
                // 所有接口成功返回调用逻辑
                if (requestCode == DHSDKHelper.DHSDKConst.REQ_SUBSCRIBE_ACTION)
                {
                    Debug.Log("订阅操作成功");
                    var subscribeJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("subscribeJson:" + subscribeJson.ToString());
                    string action = subscribeJson["action"].ToString();
                    /*
                    action事件名称

                    message - 一次性订阅消息
                    systemMessage - 系统订阅消息
                    */
                    if (action == "message")
                    {
                        Debug.Log("一次性订阅消息成功");
                        var data = subscribeJson["data"];
                        var TEMPLATE_ID = data["TEMPLATE_ID"];//[TEMPLATE_ID]是动态的键,即模板 id,值包括 accept、reject、ban、filter,其中 accept 表示用户同意订阅该条 id 对应的模板消息,reject 表示用户拒绝订阅该条 id 对应的模板消息,ban 表示已被后台封禁,filter 表示该条 id 对应的模板因为标题同名被后台过滤

                    }
                    else if (action == "subscribeLongestMessage")
                    {
                        Debug.Log("长期订阅消息成功");
                        var data = subscribeJson["data"];
                        var TEMPLATE_ID = data["TEMPLATE_ID"];//[TEMPLATE_ID]是动态的键,即模板 id,值包括 accept、reject、ban、filter,其中 accept 表示用户同意订阅该条 id 对应的模板消息,reject 表示用户拒绝订阅该条 id 对应的模板消息,ban 表示已被后台封禁,filter 表示该条 id
                    }
            
} 
}          
            else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL)
            {

                // 所有接口失败返回调用逻辑  所有失败信息请游戏接入方测试时log打印记录并反馈给sdk方  方便排查问题

                if (requestCode == DHSDKHelper.DHSDKConst.REQ_SUBSCRIBE_ACTION)
                {
                   Debug.Log("订阅操作失败");
                    var subscribeJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("subscribeJson:" + subscribeJson.ToString());
                    string action = subscribeJson["action"].ToString();
                    /*
                    action事件名称

                    message - 一次性订阅消息
                    systemMessage - 系统订阅消息
                    */             
}
            }
        }

# 3.14.2 长期订阅消息

用于在游戏内打开长期订阅消息界面,返回用户订阅消息的操作结果;若用户勾选了订阅面板中的“总是保持以上选择,不再询问”,或是点击了订阅面板中的 “拒绝,不再询问” ,模板消息会被添加到用户的游戏设置页,可通过 sdkInstance.getSetting() 接口获取用户对相关模板消息的订阅状态;当用户成功订阅一次,开发者可长期下发多条消息(了解更多可查看小游戏订阅消息能力介绍)。

接口调用和一次性订阅基本一致,action修改为subscribeLongestMessage即可

string messageParam = DHSDKHelper.DHJsonParam.Builder()
   .put("action", "subscribeLongestMessage")
   .put("tmplIds", "[\"tmpid1\",\"tmpid2\"]")   //必传,需要订阅的消息模板 id 集合,一次调用最多可订阅 3 条消息;可登录《抖音开放平台控制台》后台,进入“运营 > 运营能力 > 订阅消息”栏目中配置及查看一次性订阅消息 id(MSG开头)
   .toJson();
DHSDKHelper.subscribeAction(messageParam, mUnionSdkCallback);

回调和一次性订阅消息一致

# 3.15 添加到桌面

# 3.15.1 判断是否已添加到手机桌面

用于判断小游戏快捷方式是否已添加到手机桌面上

仅支持 Android 设备

string jsonParamStr = DHSDKHelper.DHJsonParam.Builder()
    .put("pluginName", "tools")
    .put("pluginType", "platform")
    .put("methodName", "checkShortcut")
    .toJson();    
DHSDKHelper.exec(jsonParamStr, mUnionSdkCallback);

回调:

public void onDHSDKResult(int requestCode, int resultCode, String resultData)
        {
            if (resultCode == DHSDKHelper.DHSDKConst.RET_OK)
            {
                // 所有接口成功返回调用逻辑
                if (requestCode == DHSDKHelper.DHSDKConst.REQ_EXEC)
                {

                    var execJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("execJson:" + execJson.ToString());

                    string event_type = execJson["methodName"].ToString();
                    /*
                    event_type事件名称
                    
                    checkShortcut - 判断是否已添加到手机桌面

                    */
                    if (event_type == "checkShortcut")
 {
     string exist = execJson["data"]["status"]["exist"].ToString(); //是否已添加到手机桌面上
     string needUpdate = execJson["data"]["status"]["needUpdate"].ToString(); ; //是否需要更新快捷方式
 }
                }            
}
            else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL)
            {

                // 所有接口失败返回调用逻辑  所有失败信息请游戏接入方测试时log打印记录并反馈给sdk方  方便排查问题

                if (requestCode == DHSDKHelper.DHSDKConst.REQ_EXEC)
                {

                    var execJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("execJson:" + execJson.ToString());

                    string event_type = execJson["methodName"].ToString();
                    
                    if (event_type == "checkShortcut")
 {
    
 }
                }        


                }           
 }
        }

# 3.15.2 添加到桌面

用于将小游戏快捷方式添加到手机桌面上

目前仅支持抖音或抖音Lite,请在其它app中做屏蔽

string jsonParamStr = DHSDKHelper.DHJsonParam.Builder()
    .put("pluginName", "tools")
    .put("pluginType", "platform")
    .put("methodName", "addShortcut")
    .toJson();
DHSDKHelper.exec(jsonParamStr, mUnionSdkCallback);

回调:

public void onDHSDKResult(int requestCode, int resultCode, String resultData)
        {
            if (resultCode == DHSDKHelper.DHSDKConst.RET_OK)
            {
                // 所有接口成功返回调用逻辑
                if (requestCode == DHSDKHelper.DHSDKConst.REQ_EXEC)
                {

                    var execJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("execJson:" + execJson.ToString());

                    string event_type = execJson["methodName"].ToString();
                    /*
                    event_type事件名称
                    
                    addShortcut - 添加到桌面                    
*/
                    if(event_type == "addShortcut")
 {

 }                
}            
}
            else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL)
            {

                // 所有接口失败返回调用逻辑  所有失败信息请游戏接入方测试时log打印记录并反馈给sdk方  方便排查问题

                if (requestCode == DHSDKHelper.DHSDKConst.REQ_EXEC)
                {

                    var execJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("execJson:" + execJson.ToString());

                    string event_type = execJson["methodName"].ToString();
                    /*
                    event_type事件名称
                    
                    addShortcut - 添加到桌面     
                    */
                    f(event_type == "addShortcut")
 {

 }                

                }           
 }
        }

# 3.16 清理缓存并重启小游戏

点击弹出确认框,同意后清理缓存并重启微信小游戏。

//清理缓存并重启小游戏
            string jsonStr = DHSDKHelper.DHJsonParam.Builder()              
            .put("title", "提示")  //必传,弹窗标题
            .put("content", "是否清理缓存,并重新启动?")  //必传,弹窗内容
            .put("confirmText", "确认")  //必传 确认按钮文字
            .put("cancelText", "取消")  //必传 取消按钮文字
            .toJson(); 
            string jsonParamStr = DHSDKHelper.DHJsonParam.Builder()
            .put("pluginName", "tools")
            .put("pluginType", "platform")
            .put("methodName", "ClearAndRestart")
            .put("methodParam", jsonStr)   
            .toJson();    
            DHSDKHelper.exec(jsonParamStr, mUnionSdkCallback);

# 3.17 一键加群

抖音一键加群相关接口 调用接口:

//检查是否可用一键加群
        string jsonParamStr = DHSDKHelper.DHJsonParam.Builder()
           .put("pluginName", "tools")
           .put("pluginType", "platform")
           .put("methodName", "checkJoinGroupAvalibale")
           .toJson();
        DHSDKHelper.exec(jsonParamStr, mUnionSdkCallback);
        //获取抖音群信息
        string jsonStr = DHSDKHelper.DHJsonParam.Builder()
           .put("openid", "1234567890")  //必传,创建群的用户openid
           .toJson();
        string jsonParamStr = DHSDKHelper.DHJsonParam.Builder()
           .put("pluginName", "tools")
           .put("pluginType", "platform")
           .put("methodName", "checkGroupInfo")
           .put("methodParam", jsonStr)
           .toJson();
        DHSDKHelper.exec(jsonParamStr, mUnionSdkCallback);
        //一键加群(必须在点击回调中调用)
        string jsonStr = DHSDKHelper.DHJsonParam.Builder()
           .put("openid", "groupid")  //必传,后台创建的群id
           .toJson();
        string jsonParamStr = DHSDKHelper.DHJsonParam.Builder()
           .put("pluginName", "tools")
           .put("pluginType", "platform")
           .put("methodName", "joinGroup")
           .put("methodParam", jsonStr)
           .toJson();
        DHSDKHelper.exec(jsonParamStr, mUnionSdkCallback);

回调:

public void onDHSDKResult(int requestCode, int resultCode, String resultData)
        {
            if (resultCode == DHSDKHelper.DHSDKConst.RET_OK)
            {
                // 所有接口成功返回调用逻辑
                if (requestCode == DHSDKHelper.DHSDKConst.REQ_EXEC)
                {

                    var execJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("execJson:" + execJson.ToString());

                    string event_type = execJson["methodName"].ToString();
                    /*
                    event_type事件名称
                    
                                      
*/
                    if(event_type == "checkJoinGroupAvalibale")
                   {
                         //支持一键加群
                    }                
else if (event_type == "checkGroupInfo")
{
var groupData = execJson["data"];
var groupInfoList = groupData["groupInfoList"];//群聊列表
var groupInfo = groupInfoList[0];//第一个群聊
var group_id = groupInfo[“group_id”].ToString();//群ID
var group_name = groupInfo[“group_name”].ToString();//群名

var exist_num = groupInfo[“exist_num”].ToString();//群现有人数

var max_num = groupInfo[“max_num”].ToString();//群最大支持进入人数

var description = groupInfo[“description”].ToString();//群描述

var entry_limit = groupInfo[“entry_limit”];//群门槛string数组

var status = groupInfo[“status”].ToString();//群状态. 正常: Normal, 封禁: Ban, 已满: Full
var tags = groupInfo[“tags”];//群标签,string数组,如活跃群,群主近期发言

var avatar_uri = groupInfo[“avatar_uri”].ToString();//群头像


}
else if (event_type == "joinGroup")
{
}

}            
}
            else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL)
            {

                // 所有接口失败返回调用逻辑  所有失败信息请游戏接入方测试时log打印记录并反馈给sdk方  方便排查问题

                if (requestCode == DHSDKHelper.DHSDKConst.REQ_EXEC)
                {

                    var execJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("execJson:" + execJson.ToString());

                    string event_type = execJson["methodName"].ToString();
                    /*
                    event_type事件名称
                    
                        
                    */
                    if(event_type == "checkJoinGroupAvalibale")
                   {

                    }                
else if (event_type == "checkGroupInfo")
{
}
else if (event_type == "joinGroup")
{
}

                }           
 }
        }

# 3.18 工会一键加群

抖音工会一键加群相关接口

调用接口:

//检查是否可用工会一键加群
        string jsonParamStr = DHSDKHelper.DHJsonParam.Builder()
           .put("pluginName", "tools")
           .put("pluginType", "platform")
           .put("methodName", "checkJoinUnionGroupAvalibale")
           .toJson();b’b
        DHSDKHelper.exec(jsonParamStr, mUnionSdkCallback);
        //工会一键加群(必须在点击回调中调用)
        string jsonStr = DHSDKHelper.DHJsonParam.Builder()
           .put("openid", "unionId")  //必传,后台创建的工会id
           .toJson();
        string jsonParamStr = DHSDKHelper.DHJsonParam.Builder()
           .put("pluginName", "tools")
           .put("pluginType", "platform")
           .put("methodName", "joinUnionGroup")
           .put("methodParam", jsonStr)
           .toJson();
        DHSDKHelper.exec(jsonParamStr, mUnionSdkCallback);
        //工会绑定群(仅限会长或特定成员)(必须在点击回调中调用)
        string jsonStr = DHSDKHelper.DHJsonParam.Builder()
           .put("openid", "unionId")  //必传,后台创建的工会id
           .toJson();
        string jsonParamStr = DHSDKHelper.DHJsonParam.Builder()
           .put("pluginName", "tools")
           .put("pluginType", "platform")
           .put("methodName", "bindUnionGroup")
           .put("methodParam", jsonStr)
           .toJson();
        DHSDKHelper.exec(jsonParamStr, mUnionSdkCallback);
        //工会解绑群(仅限会长或特定成员)(必须在点击回调中调用)
        string jsonStr = DHSDKHelper.DHJsonParam.Builder()
           .put("openid", "unionId")  //必传,后台创建的工会id
           .toJson();
        string jsonParamStr = DHSDKHelper.DHJsonParam.Builder()
           .put("pluginName", "tools")
           .put("pluginType", "platform")
           .put("methodName", "unbindUnionGroup")
           .put("methodParam", jsonStr)
           .toJson();
        DHSDKHelper.exec(jsonParamStr, mUnionSdkCallback);
        //获取工会信息
        string jsonStr = DHSDKHelper.DHJsonParam.Builder()
           .put("openid", "unionId")  //必传,后台创建的工会id
           .toJson();
        string jsonParamStr = DHSDKHelper.DHJsonParam.Builder()
           .put("pluginName", "tools")
           .put("pluginType", "platform")
           .put("methodName", "getUnionGroupInfo")
           .put("methodParam", jsonStr)
           .toJson();
        DHSDKHelper.exec(jsonParamStr, mUnionSdkCallback);

回调:

public void onDHSDKResult(int requestCode, int resultCode, String resultData)
        {
            if (resultCode == DHSDKHelper.DHSDKConst.RET_OK)
            {
                // 所有接口成功返回调用逻辑
                if (requestCode == DHSDKHelper.DHSDKConst.REQ_EXEC)
                {

                    var execJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("execJson:" + execJson.ToString());

                    string event_type = execJson["methodName"].ToString();
                    /*
                    event_type事件名称
                    
                                      
*/
                    if(event_type == "checkJoinUnionGroupAvalibale")
                   {
                         //支持工会一键加群
                    }                
else if (event_type == "getUnionGroupInfo")
{
//获取公会群信息
var status = execJson["bindStatus"].ToString();//目前公会的绑定状态,true 则公会已绑定,false 则公会未绑定

}
else if (event_type == "joinUnionGroup")
{
//一键加入公会群
}
else if (event_type == "bindUnionGroup")
{
//绑定工会群
}

else if (event_type == "unbindUnionGroup")
{
//解绑工会群
}


}            
}
            else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL)
            {

                // 所有接口失败返回调用逻辑  所有失败信息请游戏接入方测试时log打印记录并反馈给sdk方  方便排查问题

                if (requestCode == DHSDKHelper.DHSDKConst.REQ_EXEC)
                {

                    var execJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("execJson:" + execJson.ToString());

                    string event_type = execJson["methodName"].ToString();
                    /*
                    event_type事件名称
                    
                        
                    */
                    if(event_type == "checkJoinUnionGroupAvalibale")
                   {
                         //不支持工会一键加群
                    }                
else if (event_type == "getUnionGroupInfo")
{
//获取公会群信息
var status = execJson["bindStatus"].ToString();//目前公会的绑定状态,true 则公会已绑定,false 则公会未绑定

}
else if (event_type == "joinUnionGroup")
{
//一键加入公会群
}
else if (event_type == "bindUnionGroup")
{
//绑定工会群
}

else if (event_type == "unbindUnionGroup")
{
//解绑工会群
}

                }           
 }
        }

Last Updated: 2026/5/27 17:24:16