# 接口调用(必接)
统一必接SDK初始化是游戏或应用接入的第一个接口。SDK支持的所有登录、支付、分享等插件都将在初始化时统一初始化。请接入方在初始化成功后进行其他插件接口的调用。
调用代码示例如下:
// 全局回调对象
private static DHUnionSdkCallback mUnionSdkCallback = new DHUnionSdkCallback();
// 调用初始化接口
DHSDKHelper.init(mUnionSdkCallback);
IDHSDKUnityCallback:接入方用于统一接收SDK回调结果,通过onDHSDKResult()
接收回调数据。此回调应尽量只创建一个统一处理所有功能的回调,避免在每个接口中传入不同的回调。
TIP
每个接口传入的回调对象,需要在onDHSDKResult(requestCode, resultCode, resultData)
方法中处理相应的回调码。
全局回调示例如下:
public class DHUnionSdkCallback : DHSDKHelper.IDHSDKUnityCallback
{
public void onDHSDKResult(int requestCode, int resultCode, string resultData)
{
// 游戏优先使用此回调
Debug.Log("request:" + requestCode + ", result:" + resultCode + ", Data:" + resultData);
message("request:" + requestCode + ", result:" + resultCode + ", Data:" + resultData);
switch (requestCode) {
case DHSDKHelper.DHSDKConst.REQ_INIT:
// 初始化
if (resultCode == DHSDKHelper.DHSDKConst.RET_OK) {
// 初始化成功
} else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL) {
// 初始化失败
}
break;
case DHSDKHelper.DHSDKConst.REQ_EXIT:
// 退出游戏
if (resultCode == DHSDKHelper.DHSDKConst.RET_OK) {
// 退出游戏成功
} else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL) {
// 退出游戏失败
}
break;
case DHSDKHelper.DHSDKConst.REQ_PAY:
// 支付结果
if (resultCode == DHSDKHelper.DHSDKConst.RET_OK) {
// 支付结束
} else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL) {
// 支付失败
}
break;
case DHSDKHelper.DHSDKConst.REQ_LOGIN:
// 登录结果
if (resultCode == DHSDKHelper.DHSDKConst.RET_OK) {
// 登录成功
} else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL) {
// 登录失败
}
break;
case DHSDKHelper.DHSDKConst.REQ_LOGIN_OUT:
// 退出登录
if (resultCode == DHSDKHelper.DHSDKConst.RET_OK) {
// 退出登录成功
} else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL) {
// 退出登录失败
}
break;
case 105:
// 屏幕变化
if (resultCode == DHSDKHelper.DHSDKConst.RET_OK) {
// 折叠变化成功
// resultData示例:{"width":1920,"height":1080}
} else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL) {
// 折叠变化失败
}
break;
default:
// 其他结果
break;
}
}
public void onDHSDKResult(string requestCode, int resultCode, string resultData)
{
// 此回调是为解决安卓模型机型上 requestCode 回调总是为0异常
// 此回调只有「安卓」会调用,游戏如果使用此接口需要判断是否是安卓手机,可以使用query接口判断
Debug.Log("request:" + requestCode + ", result:" + resultCode + ", Data:" + resultData);
message("request:" + requestCode + ", result:" + resultCode + ", Data:" + resultData);
}
}
回调参数相应类型如下:
参数 | 类型 | 值 | 说明 |
---|---|---|---|
requestCode | Int | DHSDKConst.REQ_INIT | 初始化 |
DHSDKConst.REQ_EXIT | 退出游戏 | ||
DHSDKConst.REQ_LOGIN | 登录游戏 | ||
DHSDKConst.REQ_LOGIN_OUT | 退出登录 | ||
DHSDKConst.REQ_PAY | 支付 | ||
DHSDKConst.REQ_LINK | 游客账号绑定 | ||
105 | 折叠屏幕变化 | ||
resultCode | Int | DHSDKConst.RET_OK | 成功标志 |
DHSDKConst.RET_FAIL | 失败标志 | ||
resultData | string | 根据不同请求类型返回处理数据 |
# 1、拉起登录(统一必接)统一必接
调用代码示例如下:
DHSDKHelper.login(mUnionSdkCallback);
回调对象示例如下:
public class DHUnionSdkCallback : DHSDKHelper.IDHSDKUnityCallback
{
public void onDHSDKResult(int requestCode, int resultCode, string resultData)
{
switch (requestCode) {
case DHSDKHelper.DHSDKConst.REQ_LOGIN:
// 登录回调
if (resultCode == DHSDKHelper.DHSDKConst.RET_OK) {
// 登录成功
// 数据解析:resultData
} else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL) {
// 登录失败
// 异常描述:resultData
}
break;
default:
// 其他结果
break;
}
}
返回的结果数据示例:
{
"accountName": "131****0130",
"accountId": 1696674719,
"accountView": "131****0130",
"sign": "3edf1c178506041e54bcf58b0ede45e2",
"token": "0e9c17aeeacd4d8abc61ec4261e4cdfb",
"region": 1,
"loginType": 1,
"userExtraInfo": {
"avatar": "",
"nickName": ""
},
"loginTimestamp": 1719763200,
"expireTimestamp": 1720627200
}
参数 | 类型 | 必传字段 | 统一字段 | 说明 |
---|---|---|---|---|
accountName | String | 是 | 是 | 账号名称 |
accountId | int | 是 | 是 | 账号ID,唯一标识 |
accountView | String | 是 | 是 | 账号缩略,用于界面显示,例如顶部登录欢迎弹窗 |
sign | String | 是 | 是 | 登录签名,参考服务器文档 |
token | String | 是 | 是 | 登录令牌,参考服务器文档 |
region | int | 是 | 是 | 所属地区,1 :中国大陆;0 :港澳台及海外 |
loginType | int | 是 | 是 | 登录类型:当值为10时即游客类型,需要调用账号绑定接口。其他类型接入方无需处理,直接传送给服务器 |
userExtraInfo | JsonObject | 是 | 是 | 用户额外信息,接入方一般无需关注 |
loginTimestamp | int | 是 | 是 | 登录时间,秒级时间戳,参考服务器文档 |
expireTimestamp | int | 是 | 是 | 登录失效时间,秒级时间戳,参考服务器文档 |
操作危险
- 不能将accountName或者accountView作为用户的唯一ID,这些通常为账号名称。如果用其作为唯一标识,必将导致串号。
- 不建议游戏在SDK登录成功后长期缓存SDK的账号信息用于再次登录。否则,一旦账号信息过期,可能导致玩家登录验证失败而无法登录,需重启游戏等操作才能解决。
WARNING
SDK登录成功后回调的accountId、token等数据需要游戏服务端进行校验。如校验失败,需调用SDK的logout接口,并根据具体情况重新调用SDK的登录接口,以防止出现持续无法登录的问题。
# 2、账号绑定(海外必接)海外必接
TIP
国内不接入,海外必接,同时请勿在游戏启动时,调用账号绑定接口。
注意
- 登录接口返回的账号类型
loginType
等于10
时,代表该账号是游客账号。游戏可根据需要调用此接口进行账号绑定,以防止游客账号丢失。 - 请勿在SDK登录过程中调用此接口。该接口应在用户已登录状态下,由游戏方在登录界面中显示绑定账号按钮,当用户主动点击该按钮时,才可调用此接口。
调用代码示例如下:
无参数版,弹出绑定列表
/**
* 游客绑定接口,只有国内或者海外游客登录情况下才能调用
* 无参数版本,调用出来的是选择界面,一般接入方没有特别定制要求。默认国内:qq、wechat;海外:facebook、google等。
*/
DHSDKHelper.link(mUnionSdkCallback);
调用代码示例如下:
有参数版,绑定指定的渠道
/**
* 游客绑定接口,只有国内或者海外游客登录情况下才能调用
* 有参数版本,指定绑定第账号渠道,例如facebook、google等。
*/
DHSDKHelper.link("facebook", mUnionSdkCallback);
回调对象示例如下:
public class DHUnionSdkCallback : DHSDKHelper.IDHSDKUnityCallback
{
public void onDHSDKResult(int requestCode, int resultCode, string resultData)
{
switch (requestCode) {
case DHSDKHelper.DHSDKConst.REQ_LINK:
// 绑定回调
if (resultCode == DHSDKHelper.DHSDKConst.RET_OK) {
// 绑定成功
// 数据解析:resultData
} else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL) {
// 绑定失败
// 异常描述:resultData
}
break;
default:
// 其他结果
break;
}
}
绑定成功,回调数据说明如下:
绑定回调数据结构与登录回调数据结构相同,请参考登录接口。
# 3、退出登录(统一必接)统一必接
调用代码示例如下:
DHSDKHelper.logout(mUnionSdkCallback);
回调对象示例如下:
public class DHUnionSdkCallback : DHSDKHelper.IDHSDKUnityCallback
{
public void onDHSDKResult(int requestCode, int resultCode, string resultData)
{
switch (requestCode) {
case DHSDKHelper.DHSDKConst.REQ_LOGIN_OUT:
// 登出回调
if (resultCode == DHSDKHelper.DHSDKConst.RET_OK) {
// 登出成功
} else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL) {
// 登出失败
}
break;
default:
// 其他结果
break;
}
}
# 4、账号切换(统一必接)统一必接
DANGER
- SDK未提供单独的切换账号接口,需要使用拉起登录和退出登录组合实现。
- 接入者在调用登录接口进入游戏后,如果需要使用切换账号功能,应先调用登出接口,之后再调用登录接口,即可完成切换账号功能。
# 5、上报角色(统一必接)统一必接
注意
设置角色数据:在创角、登录、退出、升级时需要调用;请注意:是在触发动作成功后上报。
调用代码示例如下:
string type = "LOGIN_GAME"; //登录游戏
string param = DHSDKHelper.DHJsonParam.Builder()
.put("areaId", "100") // 大区ID。纯数字,若无值则传入"1"
.put("areaName", "国服一区") // 大区名称
.put("roleId", "100002") // 角色ID
.put("roleName", "kraity") // 角色名称
.put("roleLevel", "1") // 角色等级,纯数字
.put("roleVipLevel", "0") // VIP等级,纯数字,若无VIP系统传"0"
.put("partyName", "无") // 角色所属公会,纯文本,无公会系统则传"无"
.put("roleBalance", "0") // 角色虚拟币余额,纯数字,若无值则传入"0"
.put("roleCreateTime", "1583229600") // 游戏角色创建时间,纯数字,时间戳(尽量秒级),若无值则传入"0"
.toJson();
DHSDKHelper.setGameUserInfo(type, param);
上报类型,主要类型示例如下:
type | value |
---|---|
创建角色成功 | CREATE_ROLE |
角色升级成功 | LEVEL_UP |
登录游戏成功 | LOGIN_GAME |
退出游戏成功 | EXIT_GAME |
WARNING
特别注意:创建角色后,上报创角事件的同时还需要上报登录事件。
角色信息,主要参数说明如下:
参数 | 类型 | 必传字段 | 统一字段 | 说明 |
---|---|---|---|---|
areaId | int | 是 | 是 | 大区ID |
areaName | String | 是 | 是 | 大区名称 |
roleId | String | 是 | 是 | 角色ID |
roleName | String | 是 | 是 | 角色名称 |
roleLevel | int | 否 | 是 | 角色等级,城堡等级、钻石等级等 |
roleVipLevel | int | 否 | 是 | VIP等级 |
roleType | String | 否 | 是 | 角色职业 |
rolePower | int | 否 | 是 | 角色战力值 |
partyId | int | 否 | 是 | 角色公会ID |
partyName | String | 否 | 是 | 角色公会名称 |
roleBalance | int | 否 | 是 | 角色虚拟币余额 |
roleCreateTime | int | 是 | 是 | 游戏角色创建时间,秒级时间戳 |
# 6、退出游戏(统一必接)统一必接
调用代码示例如下:
DHSDKHelper.exit(mUnionSdkCallback);
回调对象示例如下:
public class DHUnionSdkCallback : DHSDKHelper.IDHSDKUnityCallback
{
public void onDHSDKResult(int requestCode, int resultCode, string resultData)
{
switch (requestCode) {
case DHSDKHelper.DHSDKConst.REQ_EXIT:
// 退出回调
if (resultCode == DHSDKHelper.DHSDKConst.RET_OK) {
// 许可退出游戏
// 游戏清理资源
// 最后杀死进程
}
break;
default:
// 其他结果
break;
}
}
# 7、拉起支付(统一必接)统一必接
DANGER
游戏在调用支付接口前,必须确保已调用上传角色接口,否则拉起支付时出现异常。
警告
- 单价参数
itemPrice
必须以分为单位。国内为CNY(单位分),海外为USD(单位美分)! - 谷歌订阅的商品道具
itemId
必须以.googlesubs
为后缀(例如com.dh.test.googlesubs),否则无法正常订阅!
调用代码示例如下:
DHSDKHelper.DHSDKPayInfo payInfo = new DHSDKHelper.DHSDKPayInfo();
// 必传参数
payInfo.AccountId = "1696674719"; // 账号ID
payInfo.AccountName = "131****0130"; // 账号名称
payInfo.AreaId = "100"; // 大区ID,重要参数说明:若存在大区概念,正式发布:角色大区ID,测试环境:"100";若不存在大区概念,正式发布:"1",测试环境:"100"。
payInfo.RoleId = "0"; // 角色ID,无值则传`0`,
payInfo.ItemId = "com.dh.test"; // 商品ID,道具商品唯一标识
payInfo.ItemName = "60钻石"; // 商品名称
payInfo.ItemNum = "1"; // 商品数量,一般固定为`1`
payInfo.Currency = "CNY"; // 货币类型,国内为CNY(单位分),海外为USD(单位美分)
payInfo.ItemPrice = "99"; // 商品单价(分),请注意必须以分为单位。国内是CNY(单位分),海外是USD(单位美分)!
// 可选参数
payInfo.Memo = "This is gold"; // 透传参数,支付完成后,服务器回调时将原样返回。请勿使用JSON字符串或JSON对象转换成的字符串。
payInfo.Remark = "This is remark"; // 备用透传参数,若Memo不够用时,可以考虑使用此参数。
DHSDKHelper.pay(payInfo, mUnionSdkCallback);
支付信息,主要参数说明如下:
参数 | 类型 | 必传字段 | 统一字段 | 说明 |
---|---|---|---|---|
AccountId | int | 是 | 是 | 账号ID |
AccountName | String | 否 | 是 | 账号名称 |
AreaId | int | 是 | 是 | 大区ID |
RoleId | String | 是 | 是 | 角色ID,无值则传0 |
ItemId | String | 是 | 是 | 商品ID |
ItemName | String | 是 | 是 | 商品名称 |
ItemNum | int | 是 | 是 | 商品数量,一般固定为1 |
ItemDesc | String | 否 | 是 | 商品描述 |
ItemPrice | int | 是 | 是 | 商品单价(分),请注意必须以分为单位 |
Rate | int | 否 | 是 | 货币兑换比例,1 或10 或100 |
Memo | String | 否 | 是 | 透传参数,支付完成后,服务器回调时将原样返回 |
Remark | String | 否 | 是 | 备用透传参数 |
Currency | String | 是 | 是 | 货币类型,国内为CNY(单位分),海外为USD(单位美分) |
回调对象示例如下:
public class DHUnionSdkCallback : DHSDKHelper.IDHSDKUnityCallback
{
public void onDHSDKResult(int requestCode, int resultCode, string resultData)
{
switch (requestCode) {
case DHSDKHelper.DHSDKConst.REQ_PAY:
// 支付回调
if (resultCode == DHSDKHelper.DHSDKConst.RET_OK) {
// 支付结束
} else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL) {
// 支付失败
}
break;
default:
// 其他结果
break;
}
}
支付结果,回调数据说明如下:
回调数据为文本提示或其他结构,接入方无需解析,也不要直接展示给用户
DANGER
- 拉起支付后,回调结果通过
DHSDKConst.OK
或DHSDKConst.FAIL
可以判断是否完成订单。 DHSDKConst.OK
不代表支付成功,仅表示完整支付流程结束(某些渠道存在延迟或不准情况)。接入方需在本地或服务端验证该笔支付的有效性。
# 8、实名认证(国内)
额外做什么注意什么?
DANGER
SDK防沉迷系统游戏方无需接入回调。新版防沉迷会使用遮罩层拦截并提示,游戏方无需再关注防沉迷回调。
# 9、合规接口(必接)
主要用于国内合规时调用的协议接口,包括:用户协议、隐私协议、儿童隐私保护指引、第三方SDK目录共享清单、个人信息收集清单、个人信息和隐私保护。
其中,第三方SDK目录共享清单、个人信息收集清单和个人信息和隐私保护,必须在产品的二级目录增加入口以进行调用。
# 9.1、账号注销接口(海外必接)
DANGER
- 国内选接,海外必接,SDK的个人信息和隐私保护界面已包含注销入口,游戏可以不单独调用接口进行注销**。
- 该接口用于游戏定制注销按钮时使用,账号注销接口并非退出登录接口,但回调结果和退出登录一致。游戏调用此接口后,SDK会弹出注销确认界面,一旦注销成功,将无法再找回账号。
回调对象示例如下:
string param = DHSDKHelper.DHJsonParam.Builder()
.put("pluginName", "tools") // 固定
.put("pluginType", "platform") // 固定
.put("methodName", "destroyAccount") // 固定
.toJson();
DHSDKHelper.exec(param, mUnionSdkCallback);
回调对象示例如下:
public class DHUnionSdkCallback : DHSDKHelper.IDHSDKUnityCallback
{
public void onDHSDKResult(int requestCode, int resultCode, string resultData)
{
switch (requestCode) {
// 若要区分退出登录还是账号注销
// 调用注销接口时单独创建回调对象来区分!
case DHSDKHelper.DHSDKConst.REQ_LOGIN_OUT:
if (resultCode == DHSDKHelper.DHSDKConst.RET_OK) {
// 注销成功,需要退出登录
} else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL) {
// 注销失败,用户放弃注销
}
break;
default:
// 其他结果
break;
}
}
# 9.2、协议政策接口
用户协议、隐私政策、儿童隐私保护指引和第三方SDK目录共享清单
调用代码示例如下:
string param = DHSDKHelper.DHJsonParam.Builder()
.put("pluginName", "tools") // 固定
.put("pluginType", "platform") // 固定
.put("methodName", "showPolicyDialogByKey") // 固定
.put("methodEvent", "dh_user_server") // 分类,请按照下表指定参数值
.toJson();
DHSDKHelper.exec(param, mUnionSdkCallback);
分类信息,主要参数说明如下:
分类 | 参数值 |
---|---|
网络用户服务协议 | dh_user_server |
网络用户隐私政策 | dh_user_private |
儿童隐私保护指引 | dh_child_private |
第三方SDK目录共享清单 | other_sdk_menu |
# 9.3、信息清单接口
个人信息与隐私保护、个人信息收集清单
TIP
个人信息和隐私保护中包含账号注销功能,需要游戏开发人员针对账号注销回调进行处理,并在登出账号后返回登录页面。请参考账号注销接口的返回结果。
调用代码示例如下:
string methodParam = DHSDKHelper.DHJsonParam.Builder()
.put("areaId", "100") // 大区ID
.put("roleId", "100002") // 角色ID
.toJson();
string param = DHSDKHelper.DHJsonParam.Builder()
.put("pluginName", "tools") // 固定
.put("pluginType", "platform") // 固定
.put("methodName", "showWebviewByKey") // 固定
.put("methodEvent", "personalInformation") // 分类,请按照下表指定参数值
.put("methodParam", methodParam)
.toJson();
DHSDKHelper.exec(param, mUnionSdkCallback);
分类信息,主要参数说明如下:
分类 | 参数值 |
---|---|
个人信息收集清单 | serviceCenter |
个人信息与隐私保护 | personalInformation |
其他信息,主要参数说明如下:
参数 | 类型 | 必传字段 | 统一字段 | 说明 | |
---|---|---|---|---|---|
areaId | int | 是 | 是 | 大区ID | |
roleId | String | 是 | 是 | 角色ID |
# 10、数据统计
上传各种事件到后台进行统计!
DHSDKHelper.track(eventName, eventValue);
# 10.1、流程统计 必接
WARNING
新版多合一接口,包括日志上报、adjust、TikTok、Firebase等平台。
流程统计及日志游戏启动就可以上报,无需调用SDK初始化,其他数据统计使用此接口需要SDK初始化。
TIP
- eventName: 事件ID(运营提供),格式为:
六位数字::字符串
,如:000000::SDK_CLIENT_LAUNCH
- eventValue: 必须包含三个必填字段
(track_platform, log, log_level)
和任意自定义键值对。
调用代码示例如下:
// 事件名称
String eventName = "000000::XXX_XXX_XXX";
// 事件数据:每次调用track时,需创建不同的eventValue。所有参数值类型均为字符串。
Dictionary<string, string> eventValue = new Dictionary<string, string>();
// 必传参数
eventValue.Add("trackPlatform", "log"); // 固定,无需修改
eventValue.Add("logLevel", "d"); // 必填,d:普通日志 or 流程统计;e:异常日志;
eventValue.Add("logContent", "test"); // 必填,自定义日志内容
// 可选参数
eventValue.Add("customKey", "customValue"); // 可选,自定义参数,customKey、customValue均可自定义
DHSDKHelper.track(eventName, eventValue);
参数名称 | 是否必传 | 参数示例 | 参数说明 |
---|---|---|---|
trackPlatform | 是 | log | 固定值,无需修改 |
logLevel | 是 | d | 日志级别,"d" 表示普通日志或流程统计;"e" 表示异常日志 |
logContent | 是 | test | 自定义日志内容 |
# 10.2、新手引导 选接
// 事件名称
string eventName = "guidestep";
// 事件数据:每次调用track时,需创建不同的eventValue。所有参数值类型均为字符串。
Dictionary<string, string> eventValue = new Dictionary<string, string>();
// 必传参数
eventValue.Add("trackPlatform", "dianhun"); // 固定值,无需修改
eventValue.Add("areaId", "1"); // 大区ID,若游戏无大区概念,则填1作为初始大区编号,和游戏服务器日志传值保持一致
eventValue.Add("roleId", "100002"); // 角色ID,游戏内唯一(不同区服之间也不允许重复),建议纯数字。若游戏无角色概念,则填账号ID
eventValue.Add("stepId", "10000"); // 引导步骤ID
eventValue.Add("stepState", "2"); // 引导步骤状态 1:进行中 2:已完成(不含跳过)3:跳过
// 可选参数
eventValue.Add("stepType", "pvp"); // 引导步骤分类
eventValue.Add("roleLevel", "143"); // 角色等级
eventValue.Add("roleVipLevel", "10"); // 角色VIP等级
eventValue.Add("stepParam", "H001"); // 引导步骤参数
eventValue.Add("extendParamJson", "{\"kills\":\"10\",\"deaths\":\"2\",\"assistant\":\"3\"}"); // 扩展参数,JSON格式字符串
DHSDKHelper.track(eventName, eventValue);
# 10.3、按钮日志 选接
// 事件名称
String eventName = "button";
// 事件数据:每次调用track时,需创建不同的eventValue。所有参数值类型均为字符串。
Dictionary<string, string> eventValue = new Dictionary<string, string>();
// 必传参数
eventValue.Add("trackPlatform", "dianhun"); // 固定值,无需修改
eventValue.Add("buttonId", "match_001"); // 按钮ID
// 可选参数
eventValue.Add("buttonType", "match"); // 按钮分类
eventValue.Add("pageId", "main_page"); // 按钮所在界面ID,用于分析用户操作路径
eventValue.Add("eventParam", "10"); // 操作参数,比如是跳转到另外一个页面,就填写结果页ID;匹配按钮则可以填匹配时间
eventValue.Add("areaId", "1"); // 大区ID,若游戏无大区概念,则填1作为初始大区编号,和游戏服务器日志传值保持一致
eventValue.Add("roleId", "100002"); // 角色ID,游戏内唯一(不同区服之间也不允许重复),建议纯数字。若游戏无角色概念,则填账号ID
eventValue.Add("extendParamJson", "{\"online_durt_tot\":\"12020\"}"); // 扩展参数,JSON格式字符串
DHSDKHelper.track(eventName, eventValue);
# 10.4、自定义日志 选接
// 事件名称
String eventName = "custom";
// 事件数据:每次调用track时,需创建不同的eventValue。所有参数值类型均为字符串。
Dictionary<string, string> eventValue = new Dictionary<string, string>();
// 必传参数
eventValue.Add("trackPlatform", "dianhun"); // 固定值,无需修改
eventValue.Add("eventName", "levelUp"); // 自定义的事件名
// 可选参数
eventValue.Add("eventObj", "pay_btn"); // 操作对象,如果是按钮点击事件,则对应按钮ID
eventValue.Add("eventCode", "login"); // 操作原因
eventValue.Add("eventResult", "real_page"); // 操作结果
eventValue.Add("areaId", "1"); // 大区ID,若游戏无大区概念,则填1作为初始大区编号,和游戏服务器日志传值保持一致
eventValue.Add("roleId", "100002"); // 角色ID,游戏内唯一(不同区服之间也不允许重复),建议纯数字。若游戏无角色概念,则填账号ID
eventValue.Add("extendParamJson", "{\"kills\":\"0\",\"deaths\":\"0\",\"assistant\":\"0\"}"); // 扩展参数
DHSDKHelper.track(eventName, eventValue);
# 11、广告接口
TIP
参考初始化文档中设置全局回调
# 11.1、广告是否就绪
注意
播放广告前需要调用此接口获取广告状态,SDK会加载广告物料,请务必接入。
加载回调返回:
DHSDKConst.RET_OK
:可调用播放广告接口DHSDKConst.RET_FAIL
:加载失败或其他,等一会儿再调用广告是否就绪
Dictionary<string, string> adInfo = DHSDKHelper.DHParam.Builder()
.put("adType", "1") // 广告类型,1 : 激励广告,2 : 全屏广告
.put("adUnitId", "0") // 广告位ID,发行若未告知,此处传零即可
.put("methodName", "couldPlayAd") // 方法名称
.toDictionary();
DHSDKHelper.playAd(adInfo, mUnionSdkCallback);
回调对象示例如下:
public class DHUnionSdkCallback : DHSDKHelper.IDHSDKUnityCallback
{
public void onDHSDKResult(int requestCode, int resultCode, string resultData)
{
switch (requestCode) {
case DHSDKHelper.DHSDKConst.REQ_AD_READY:
// 广告就绪结果
// resultData:返回数据是文字提示
if (resultCode == DHSDKHelper.DHSDKConst.RET_OK) {
// 广告就绪成功
} else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL) {
// 广告就绪失败
}
break;
default:
// 其他结果
break;
}
}
# 11.2、执行播放广告
注意
播放广告后无论是否成功,下次播放前需重新再调用广告是否就绪以重新加载物料。
播放回调返回:
DHSDKConst.RET_OK
:广告播放成功DHSDKConst.RET_FAIL
:播放失败或取消
Dictionary<string, string> adInfo = DHSDKHelper.DHParam.Builder()
.put("adType", "1") // 广告类型,1 : 激励广告,2 : 全屏广告
.put("adUnitId", "0") // 广告位ID,发行若未告知,此处传零即可
.put("methodName", "playAd") // 方法名称
.toDictionary();
DHSDKHelper.playAd(adInfo, mUnionSdkCallback);
回调对象示例如下:
public class DHUnionSdkCallback : DHSDKHelper.IDHSDKUnityCallback
{
public void onDHSDKResult(int requestCode, int resultCode, string resultData)
{
switch (requestCode) {
case DHSDKHelper.DHSDKConst.REQ_AD:
// 广告播放结果
// resultData:返回数据是文字提示
if (resultCode == DHSDKHelper.DHSDKConst.RET_OK) {
// 广告播放成功
} else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL) {
// 广告播放失败
}
break;
default:
// 其他结果
break;
}
}
# 12、客服接口
DANGER
调用客服接口前,请先查询是否存在客服SDK,部分渠道要求游戏不能提供客服功能入口。
string faqName = DHSDKHelper.query("dh_faqName");
if (string.IsNullOrEmpty(faqName))
{
// 无客服SDK,接入方须隐藏客服入口
}
else
{
// 存在客服SDK,接入方可显示客服入口
}
调用代码示例如下:
// 客服参数
Dictionary<string, string> params = new Dictionary<string, string>();
// 必传参数
params.Add("areaId", "0"); // 大区ID,若没有就传0,必填
params.Add("roleId", "100002"); // 角色ID,string类型纯数字,必填
params.Add("roleName", "陆之岇"); // 角色ID,string类型纯数字,必填
params.Add("roleLevel", "143"); // 角色等级,string类型纯数字,必填
// 可选参数
// params.Add("uploadsReplayPath", "/yourfilepath.replay"); // 可选参数:上传指定的Replay文件绝对路径
// params.Add("uploadsReplayAlert", "是否上传最近一次录像文件"); // 可选参数:上传指定的Replay文件时的提示文案(必须指定文案)
DHSDKHelper.showFAQ(params);
字段信息,主要参数说明如下:
参数 | 类型 | 必传字段 | 统一字段 | 说明 |
---|---|---|---|---|
areaId | String | 是 | 是 | 大区ID |
roleId | String | 是 | 是 | 角色ID |
roleName | String | 是 | 是 | 角色名称 |
roleLevel | int | 否 | 是 | 角色等级,城堡等级、钻石等级等 |
uploadsReplayPath | int | 否 | 是 | 上传指定的Replay文件绝对路径 |
uploadsReplayAlert | int | 否 | 是 | 上传指定的Replay文件时的提示文案(必须指定文案) |
# 13、推送接口
注意
国内:因国内合规政策原因无法使用推送功能;
海外:默认使用Firebase推送,研发无需额外接入,开放平台打包自动打入,如需定制推送主题可接入如下方法。
# 13.1、订阅推送主题
DANGER
- 国内:因国内合规政策原因无法使用推送功能。
- 海外:默认使用Firebase推送,研发无需额外接入,开放平台打包时会自动包含。如需定制推送主题,可接入如下方法
若需要Firebase推送token,请点击前往:查询配置
// 订阅的主题名称
string alias = "nabo";
DHSDKHelper.setAlias(alias);
# 13.2、取消订阅主题
// 已订阅过的主题名称
string alias = "nabo";
DHSDKHelper.delAlias(alias);
# 14、分享接口
WARNING
参数platform
:指定平台分享,可选参数。
目前可以指定wechat, wechat_circle, qq, qzone
之一,没有对应平台则不需要指定。
调用代码示例如下:
DHSDKHelper.DHSDKShareContent content = new DHSDKHelper.DHSDKShareContent();
// 1、share link
// content.Title = "来《光影对决》跟我一起打爆对面!";
// content.Desc = "我在玩超带感的动漫MOBA,姿势已摆好,来一个会喊666的队友!";
// content.ThumbImage = "/var/mobile/Containers/Data/Application/8A3C7EB1-E592-43ED-A6D2-09C7C989CB35/Documents/imag1.png";//缩略图本地图片文件路径
// content.ThumbImageUrl = "";//缩略图网络图片地址
// content.LinkUrl = " http://m.goodmoba.develop.icodemo.com/app/gy-startgame/?name=20059&type=1&id=20059";
// content.Type = DHSDKHelper.DHSDKShareType.shareType_image;
// content.Platform = DHSDKHelper.DHSDKSharePlatform.Platform_None;
// DHSDKHelper.share (content, mUnionSdkCallback);
// 2、share image
content.Desc = "Description 1";
// content.ThumbImage = "";//缩略图本地图片文件路径
// content.ThumbImageUrl = "";//缩略图网络图片地址
content.Image = "/storage/emulated/0/Download/image.jpg"; //本地图片文件路径
// content.ImageUrl = ""; //网络图片地址
content.Type = DHSDKHelper.DHSDKShareType.shareType_image;
content.Platform = DHSDKHelper.DHSDKSharePlatform.Platform_None;
DHSDKHelper.share(content, mUnionSdkCallback);
回调对象示例如下:
public class DHUnionSdkCallback : DHSDKHelper.IDHSDKUnityCallback
{
public void onDHSDKResult(int requestCode, int resultCode, string resultData)
{
switch (requestCode) {
case DHSDKHelper.DHSDKConst.REQ_SHARE:
// 分享回调
if (resultCode == DHSDKHelper.DHSDKConst.RET_OK) {
// 分享成功
// resultData:文字提示
} else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL) {
// 分享失败
// resultData:错误提示
}
break;
default:
// 其他结果
break;
}
}
# 15、问卷调查
WARNING
腾讯问卷,不分地区
调用代码示例如下:
string methodParam = DHSDKHelper.DHJsonParam.Builder()
.put("surveyId", "0") // 问卷ID
.put("areaId", "100") // 大区ID
.put("roleId", "100002") // 角色ID
.put("roleName", "陆之岇") // 角色昵称
.put("roleLevel", "143") // 角色等级
.put("isLandscape", "0") // "0":竖屏,"1":横屏
.toJson();
string param = DHSDKHelper.DHJsonParam.Builder()
.put("pluginName", "tools") // 固定
.put("pluginType", "platform") // 固定
.put("methodName", "showWebviewByKey") // 固定
.put("methodEvent", "questionnaire") // 固定
.put("methodParam", methodParam)
.toJson();
DHSDKHelper.exec(param, mUnionSdkCallback);
问卷信息,主要参数说明如下:
参数 | 类型 | 必传字段 | 统一字段 | 说明 |
---|---|---|---|---|
surveyId | int | 是 | 是 | 问卷ID |
areaId | int | 是 | 是 | 大区ID |
roleId | String | 是 | 是 | 角色ID |
roleName | String | 是 | 是 | 角色名称 |
roleLevel | int | 否 | 是 | 角色等级,城堡等级、钻石等级等 |
# 16、其他接口
# 16.1、关联手机号
# 16.1.1-1、查询绑定
调用代码示例如下:
string param = DHSDKHelper.DHJsonParam.Builder()
.put("version", 2) // 若不指定则:version=1
// .put("connect", "bind") //(可选)关联角色登录:默认不传该字段,只收集手机号
.toJson();
DHSDKHelper.queryBindPhone(param, mUnionSdkCallback);
回调对象示例如下:
public class DHUnionSdkCallback : DHSDKHelper.IDHSDKUnityCallback
{
public void onDHSDKResult(int requestCode, int resultCode, string resultData)
{
switch (requestCode) {
case DHSDKHelper.DHSDKConst.REQ_QUERY_BIND_PHONE:
// 查询结果
if (resultCode == DHSDKHelper.DHSDKConst.RET_OK) {
// 查询成功
} else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL) {
// 查询失败
}
break;
default:
// 其他结果
break;
}
}
请求成功时,示例如下
{"success":"2", "info":"没有绑定手机号码"}
{"success":"1", "info":"已绑定手机号码", "bindPhone":"131****0130"}
参数 | 类型 | 说明 |
---|---|---|
info | string | 描述结果 |
success | string | 1=已绑定,2=未绑定,其它失败 |
bindPhone | string | 绑定的手机号,131****0130,已绑定时,有此字段 |
# 16.1.1-2、查询是否绑定密保手机
调用代码示例如下:
string param = DHSDKHelper.DHJsonParam.Builder()
.put("version", 2) // 若不指定则:version=1
// .put("connect", "bind") //(可选)关联角色登录:默认不传该字段,只收集手机号
.toJson();
DHSDKHelper.querySecurityBindPhone(param, mUnionSdkCallback);
回调对象示例如下:
public class DHUnionSdkCallback : DHSDKHelper.IDHSDKUnityCallback
{
public void onDHSDKResult(int requestCode, int resultCode, string resultData)
{
switch (requestCode) {
case DHSDKHelper.DHSDKConst.REQ_QUERY_BIND_SECURITY_PHONE:
// 查询结果
if (resultCode == DHSDKHelper.DHSDKConst.RET_OK) {
// 查询成功
} else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL) {
// 查询失败
}
break;
default:
// 其他结果
break;
}
}
请求成功时,示例如下
{"success":"2", "info":"没有绑定密保手机号码"}
{"success":"1", "info":"已绑定密保手机号码"}
参数 | 类型 | 说明 |
---|---|---|
info | string | 描述结果 |
success | string | 1=已绑定,2=未绑定,其它失败 |
# 16.1.2-1、发送短信(需自制界面)
调用代码示例如下:
string param = DHSDKHelper.DHJsonParam.Builder()
.put("mobile", "手机号")
.put("version", 2) // 若不指定则:version=1
// .put("connect", "bind") //(可选)绑定多端互通角色:默认不传该字段,只收集手机号
// .put("month", "1") //(可选)是否月度发送短信验证,1:是,其余:否。是的话可以不传mobile字段
.toJson();
DHSDKHelper.sendSMS(param, mUnionSdkCallback);
回调对象示例如下:
public class DHUnionSdkCallback : DHSDKHelper.IDHSDKUnityCallback
{
public void onDHSDKResult(int requestCode, int resultCode, string resultData)
{
switch (requestCode) {
case DHSDKHelper.DHSDKConst.REQ_SEND_SMS:
// 发送结果
if (resultCode == DHSDKHelper.DHSDKConst.RET_OK) {
// 发送成功
} else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL) {
// 发送失败
}
break;
default:
// 其他结果
break;
}
}
请求成功时,示例如下
{"success":"1", "info":"发送成功"}
{"success":"2", "info":"发送失败"}
参数 | 类型 | 说明 |
---|---|---|
info | string | 描述信息 |
success | string | 1=发送成功,2=发送失败,其它失败 |
# 16.1.2-2、绑定手机号码(需自制界面)
调用代码示例如下:
string param = DHSDKHelper.DHJsonParam.Builder()
.put("code", "验证码")
.put("mobile", "手机号")
.put("version", 2) // 若不指定则:version=1
// .put("connect", "bind") //(可选)绑定多端互通角色:默认不传该字段,只收集手机号
// .put("month", "1") //(可选)是否月度短信验证吗验证,1:是,其余:否。是的话可以不传mobile字段
.toJson();
DHSDKHelper.bindPhone(param, mUnionSdkCallback);
回调对象示例如下:
public class DHUnionSdkCallback : DHSDKHelper.IDHSDKUnityCallback
{
public void onDHSDKResult(int requestCode, int resultCode, string resultData)
{
switch (requestCode) {
case DHSDKHelper.DHSDKConst.REQ_BIND_PHONE:
// 绑定结果
if (resultCode == DHSDKHelper.DHSDKConst.RET_OK) {
// 绑定成功
} else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL) {
// 绑定失败
}
break;
default:
// 其他结果
break;
}
}
请求成功时,示例如下
{"success":"2", "info":"绑定失败"}
{"success":"1", "info":"绑定成功", "bindPhone":"131****0130"}
参数 | 类型 | 说明 |
---|---|---|
info | string | 描述信息 |
success | string | 1=绑定成功,2=绑定失败,其它失败 |
bindPhone | string | 绑定的手机号,例如:131****0130 |
{"success":"2", "info":"绑定失败"}
{"success":"1", "info":"绑定成功", "bindPhone":"131****0130", "bindChange":"0","bindAccount":......}
{"success":"1", "info":"绑定成功", "bindPhone":"131****0130", "bindChange":"1","bindAccount":......}
绑定多端互通角色时有额外字段,游戏可以根据bindChange
判断是否绑定后是新账号。
参数 | 类型 | 说明 |
---|---|---|
bindChange | string | 绑定后是否新号,例如:1,新账号;0,未变动 |
bindAccount | Object | 绑定后账号信息,详细数据结构请参考登录接口 |
# 16.1.2-3、绑定密保手机(需自制界面)
调用代码示例如下:
string param = DHSDKHelper.DHJsonParam.Builder()
.put("version", 2) // 若不指定则:version=1
// .put("connect", "bind") //(可选)绑定多端互通角色:默认不传该字段,只收集手机号
.toJson();
DHSDKHelper.bindSecurityPhone(param, mUnionSdkCallback);
回调对象示例如下:
public class DHUnionSdkCallback : DHSDKHelper.IDHSDKUnityCallback
{
public void onDHSDKResult(int requestCode, int resultCode, string resultData)
{
switch (requestCode) {
case DHSDKHelper.DHSDKConst.REQ_BIND_SECURITY_PHONE:
// 绑定结果
if (resultCode == DHSDKHelper.DHSDKConst.RET_OK) {
// 绑定成功
} else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL) {
// 绑定失败
}
break;
default:
// 其他结果
break;
}
}
请求成功时,示例如下
{"success":"2", "info":"绑定失败"}
{"success":"1", "info":"绑定成功"}
参数 | 类型 | 说明 |
---|---|---|
info | string | 描述信息 |
success | string | 1=绑定成功,2=绑定失败,其它失败 |
# 16.1.3、委托发送、绑定(使用统一界面)
委托使用SDK统一界面,仅包含输入手机号发送验证码、输入验证码绑定手机号,不含查询。
调用代码示例如下:
string param = DHSDKHelper.DHJsonParam.Builder()
.put("version", 2)
// .put("connect", "bind") //(可选)绑定多端互通角色:默认不传该字段,只收集手机号
// .put("security", "1") //(可选)绑定成功后是否绑定密保手机,传1则绑定密保手机
.toJson();
DHSDKHelper.delegateBindPhone(param, mUnionSdkCallback);
回调对象示例如下:
public class DHUnionSdkCallback : DHSDKHelper.IDHSDKUnityCallback
{
public void onDHSDKResult(int requestCode, int resultCode, string resultData)
{
switch (requestCode) {
case DHSDKHelper.DHSDKConst.REQ_BIND_PHONE:
// 绑定结果
if (resultCode == DHSDKHelper.DHSDKConst.RET_OK) {
// 绑定成功
} else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL) {
// 绑定失败
}
break;
default:
// 其他结果
break;
}
}
请求成功时,示例如下
{"success":"2", "info":"绑定失败"}
{"success":"1", "info":"绑定成功", "bindPhone":"131****0130"}
参数 | 类型 | 说明 |
---|---|---|
info | string | 描述信息 |
success | string | 1=绑定成功,2=绑定失败,其它失败 |
bindPhone | string | 绑定的手机号,例如:131****0130 |
绑定多端互通角色时有额外字段,请参考绑定手机号码接口。
参数 | 类型 | 说明 |
---|---|---|
bindChange | string | 绑定后是否新号,例如:1,新账号;0,未变动 |
bindAccount | Object | 绑定后账号信息,详细数据结构请参考登录接口 |
# 16.2、谷歌本地货币查询(选接)
注意
- 本地货币查询接口,海外选接,但谷歌包必接!
- 接入时请特别注意,此接口返回的货币和价格仅用于游戏界面展示。此外,调用支付接口时传入
price
为道具原价(并非是productPrice
),currency
固定是USD
(并非是productCurrency
) - ResultData:返回的JSON是一个包含多个对象的JSON数组。游戏方需要根据
productId
从该数组中搜索对应的JSON对象。如果找到匹配的productId
,则展示对应的价格productPrice
;如果没有匹配到任何JSON对象,则游戏需要展示默认的货币价格。
调用代码示例如下:
List<string> skus = new List<string>();
skus.Add("com.dh.test");
DHSDKHelper.querySkus(skus, mUnionSdkCallback);
回调对象示例如下:
public class DHUnionSdkCallback : DHSDKHelper.IDHSDKUnityCallback
{
public void onDHSDKResult(int requestCode, int resultCode, string resultData)
{
switch (requestCode) {
case DHSDKHelper.DHSDKConst.REQ_SKUS:
// 查询结果
if (resultCode == DHSDKHelper.DHSDKConst.RET_OK) {
// 查询成功
} else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL) {
// 查询失败
}
break;
default:
// 其他结果
break;
}
}
# 16.3、谷歌商店应用评价(选接)
TIP
安卓谷歌包选接!
// unity requestCode = 40
string param = DHSDKHelper.DHJsonParam.Builder()
.put("pluginName", "google")
.put("pluginType", "platform")
.put("methodName", "review")
.toJson();
DHSDKHelper.exec(param, mUnionSdkCallback);
# 16.4、Taptap强制更新接口(选接)
// unity requestCode = 106
string param = DHSDKHelper.DHJsonParam.Builder()
.put("pluginName", "tools")
.put("pluginType", "platform")
.put("methodName", "forceUpdateGame")
.toJson();
DHSDKHelper.exec(param, mUnionSdkCallback);
# 16.5、MTR网络检测
注意
玩家无法连接服务时可调用该接口,正常游戏千万不能调用,否则会带来卡顿。 调用接口之前,游戏最好自定义弹窗提示收集玩家网络信息,可能带来卡顿。玩家同意后再调用
string methodParam = DHSDKHelper.DHJsonParam.Builder()
.put("appId", "") // appId
.put("areaId", "") // 大区ID
.put("roleId", "1") // 角色ID
.put("host", "kat.plus") // 服务器域名,禁止带https或接口路径
.toJson();
string param = DHSDKHelper.DHJsonParam.Builder()
.put("pluginName", "tools") // 固定
.put("pluginType", "platform") // 固定
.put("methodName", "mtr") // 固定
.put("methodEvent", "") // 固定
.put("methodParam", methodParam)
.toJson();
DHSDKHelper.exec(param, mUnionSdkCallback);
# 16.6、邮箱收集
# 16.6.1、创建回调对象
回调对象示例如下:
public class SendEmailSdkCallback : DHSDKHelper.IDHSDKUnityCallback
{
public void onDHSDKResult(int requestCode, int resultCode, string resultData)
{
switch (requestCode) {
case DHSDKHelper.DHSDKConst.REQ_EXEC:
// 执行结果
if (resultCode == DHSDKHelper.DHSDKConst.RET_OK) {
// 成功结果
try {
// {"methodName":"sendemail","data":"设置成功"}
JsonData resultJson = JsonMapper.ToObject(resultData);
if (resultJson.Keys.Contains("methodName")) {
string eventType = (string) resultJson["methodName"];
if (eventType == "sendemail") {
// 设置成功
}
}
} catch (Exception e) {
Debug.LogError(e.Tostring());
}
} else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL) {
// 失败结果
}
break;
default:
// 其他结果
break;
}
}
# 16.6.2、打开收集页面(研发不需要提供收集界面)
string param = DHSDKHelper.DHJsonParam.Builder()
.put("pluginName", "tools") // 固定
.put("pluginType", "platform") // 固定
.put("methodName", "sendemail") // 固定
.toJson();
DHSDKHelper.exec(param, mSendEmailSdkCallback);
# 16.6.3、上报邮箱信息(研发提供收集界面,前提已收集到用户邮箱)
string methodParam = DHSDKHelper.DHJsonParam.Builder()
.put("nickName", "昵称") // 昵称
.put("email", "玩家真实的邮箱") // 邮箱信息
.toJson();
string param = DHSDKHelper.DHJsonParam.Builder()
.put("pluginName", "tools") // 固定
.put("pluginType", "platform") // 固定
.put("methodName", "sendemail") // 固定
.put("methodParam", methodParam)
.toJson();
DHSDKHelper.exec(param, mSendEmailSdkCallback);
# 16.7、游戏网络检测功能
该功能旨在检测用户设备连接游戏服的网络状况(TCP/WS/DNS/MTR/HTTP),并自动上报检测结果。通过此功能,用户可以轻松查询是否能够连接到游戏服,同时也为运维人员快速排查问题提供便利。
TIP
游戏方仅需调用提供的接口,相关检测项目需提前在开放平台进行动态配置。
string param = DHSDKHelper.DHJsonParam.Builder()
.put("pluginName", "tools") // 固定
.put("pluginType", "platform") // 固定
.put("methodName", "networkCheck") // 固定
.toJson();
DHSDKHelper.exec(param, mUnionSdkCallback);
DANGER
游戏方可在登录界面、设置界面等场景提供入口按钮。还可以在登录、支付失败多次等场景自动触发弹窗检测。
← 接入准备(必读) PS4 Unity 接入 →