开发指南
【可选】【初始化前】设置包体确定的区域
如果需要韩国包体使用韩国协议弹窗时,调用该接口,并传入 "KR"。请在初始化前指定该接口,不要在不确定的时候调用该接口。
- Android
- iOS
- Unity
- UE
枚举类:Lang
com.xd.intl.common.utils.EnvHelper.setTargetCountryOrRegion("KR");
[XDGSDKSettings setTargetCountryOrRegion:@"KR"];
XDGSettings.SetTargetCountryOrRegion("KR");
FXDGSettings::SetTargetCountryOrRegion(TEXT("KR"));
【建议】【初始化前】设置当前语言
请在初始化前设定好预期的语言,不设置的话 SDK 会尝试匹配系统设置的语言,匹配不上的话则按照国内简中,海外英文的逻辑展示。 目前支持的语言类型有:
类型 | 简体中文 | 繁体中文 | 英文 | 泰文 | 印尼文 | 韩语 | 日语 | 德语 | 法语 | 葡萄牙语 | 西班牙语 | 土耳其语 | 俄罗斯语 | 越南语 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
枚举 | ZH_CN | ZH_TW | EN | TH | ID | KR | JP | DE | FR | PT | ES | TR | RU | VI |
- Android
- iOS
- Unity
- UE
枚举类:Lang
XDGSDK.setLanguage(Lang.ZH_CN);
/** 设置 SDK 显示语言
* @param locale 语言,在 XDGLanguageLocale 枚举中查看
*/
[XDGSDKSettings setLanguage:XDGLanguageLocaleSimplifiedChinese];
XDGCommon.SetLanguage(LangType);
EXDGLangType NewType = EXDGLangType::ZH_CN; //设置你的语言
FXDGCommon::SetLanguage(NewType);
初始化
- XDSDK 会完成初始化大部分 TapSDK,但不包括防沉迷和公告模块。
- TapSDK 会自动完成 TapDB 与云服务模块的初始化。请不要重复初始化。
- Android
- iOS
- Unity
- UE
XDGSDK.initSDK(Activity activity,XDGInitCallback callback);
[XDGSDK initSDK:^(BOOL success, NSString *msg) {
if (success) {
NSLog(@"Init success , %@", XDSDK_VERSION);
} else {
NSLog(@"Init fail , %@ , %@", msg, XDSDK_VERSION);
}
}];
XDGCommon.InitSDK(((success, msg) => {
if (success){
ResultText.text = $"初始化成功 {success} {msg}";
} else{
ResultText.text = $"初始化失败 {success} {msg}";
}
}));
FXDGCommon::InitSDK(FXDGCommon::FInitDelegate::CreateLambda([](bool IsSuccess, const FString& Msg) {
}));
如果要判断初始化是否完成,可通过如下接口查询。
- Android
- iOS
- Unity
- UE
boolean isInitialized=XDGSDK.isInitialized();
BOOL isInitialized = [XDGSDK isInitialized];
XDGCommon.IsInitialized(Action<bool> callback);
bool bInitialized = FXDGCommon::IsInitialized();
Unity 日志输出
Unity SDK 中默认不输出运行时日志,需要实现委托代码自行输出:
XDGLogger.LogDelegate = (level, message) => {
switch (level) {
case XDGLogLevel.Debug:
Debug.Log($"XD [DEBUG] {DateTime.Now} {message}");
break;
case XDGLogLevel.Warn:
Debug.LogWarning($"XD [WARN] {DateTime.Now} {message}");
break;
case XDGLogLevel.Error:
Debug.LogError($"XD [ERROR] {DateTime.Now} {message}");
break;
default:
break;
}
};
日志输出级别遵循如下原则:
- Debug:调试和一般信息,包括请求/响应日志,SDK 状态信息等,在开发阶段和排查问题阶段需要查看。
- Warn:警告信息,包括可能潜在问题,预期内的错误,不影响 SDK 使用,但需要开发者注意。
- Error:错误信息,包括 SDK 无法处理的错误,Unity 会打印 SDK 未捕获的异常。
客服系统
客服系统建议参考定制版 TDS客服文档进行接入
商店评分
- Android
- iOS
- Unity
- UE
XDGSDK.storeReview();
[XDGSDK storeReview];
XDGCommon.StoreReview();
FXDGCommon::StoreReview();
埋点
目前已集成以下五种拥有数据能力的 SDK。
- TapDB
- Appsflyer
- Adjust
- Firebase
危险
注意:SDK 内部针对 「支付成功」 事件有做统一的事件埋点处理,如有疑问联系相关人员。
提示
针对 Adjust 平台的数据统计能力,需游戏将对应的事件配置放入到 XDConfig.json 文件中,详情请参考 XDConfig.json 文件模版说明,
按照 key-value 的形式进行一一对应,目前 SDK 「支付成功」 对应的 key 为 TDSG_ADJ_REVENUE
。
自定义事件埋点
- Android
- iOS
- Unity
- UE
/**
* 自定义埋点
* @param: eventName: 事件名称
*/
XDGSDK.trackEvent(String eventName);
/**
* 附带参数的自定义埋点
*
* @param: eventName: 事件名称
* @param: eventsMap: 附带参数
*/
XDGSDK.trackEvent(String eventName,Map<String, Object> eventsMap)
/** 跟踪自定义事件
* @param eventName 事件名称
*/
NSString *eventName = @"custom_event_name";
[XDGSDK trackEvent:eventName];
/** 跟踪自定义事件
* @param eventName 事件名称
* @param properties 自定义属性
*/
NSString *eventName = @"custom_event_name";
NSMutableDictionary *properties = [NSMutableDictionary dictionary];
[XDGSDK trackEvent:eventName properties:properties];
XDGCommon.TrackEvent(string eventName);
class XDGCOMMON_API FXDGCommon {
public:
//[iOS] [Android] [Win64] [macOS]
static void TrackEvent(const FString& EventName, TSharedPtr<FJsonObject> Properties = nullptr);
};
内置埋点
为方便游戏快速接入,SDK 提前定义了与游戏相关的埋点,游戏可直接在对应事件触发点直接调用即可:
- Android
- iOS
- Unity
- UE
// 角色埋点
XDGSDK.trackRole(String serverId,String roleId,String roleName,int level);
// 用户埋点
XDGSDK.trackUser(xdgUser.userId); //要用 xdgUser.userId
// 完成新手引导埋点
XDGSDK.eventCompletedTutorial();
// 创建角色埋点
XDGSDK.eventCreateRole();
// 成就埋点
XDGSDK.trackAchievement();
/** 跟踪用户(默认当前用户的 xdid)
*/
[XDGSDK trackUser];
/** 跟踪用户
* @param userId xdUserId
*/
NSString *xdUserId = [XDGUser currentUser].userId;
[XDGSDK trackUser:xdUserId];
/** 跟踪用户
* @param userId xdUserId
* @param loginType 登录方式
* @param properties 自定义属性,可为空
*/
[XDGSDK trackUser:result.userId];
NSString *xdUserId = [XDGUser currentUser].userId;
LoginEntryType loginType = [XDGUser currentUser].loginType;
NSDictionary *properties = [NSDictionary dictionary];
[XDGSDK trackUser:xdUserId loginType:loginType properties:properties];
/** 跟踪角色
* @param roleId 角色id
* @param roleName 角色名称
* @param serverId 服务器id
* @param level 角色等级
*/
[XDGSDK trackRoleWithRoleId:@"roleId" roleName:@"roleName" serverId:@"serverId" level:1];
// 跟踪完成成就
[XDGSDK trackAchievement];
// 跟踪完成新手引导接口
[XDGSDK eventCompletedTutorial];
// 跟踪完成创角
[XDGSDK eventCreateRole];
// 用户埋点, 登录成功后使用,TapDB 统计用户
XDGCommon.TrackUser();
// 角色埋点
XDGCommon.TrackRole(string serverId, string roleId, string roleName, int level);
// 完成新手引导埋点
XDGCommon.EventCompletedTutorial();
// 创建角色埋点
XDGCommon.EventCreateRole();
// 成就打点
XDGCommon.TrackAchievement();
class XDGCOMMON_API FXDGCommon {
public:
//[iOS] [Android] [Win64] [macOS]
static void TrackUser(const FString& UserId = "");
//[iOS] [Android] [Win64] [macOS]
static void TrackRole(const FString& ServerId, const FString& RoleId, const FString& RoleName, int32 Level);
//[iOS] [Android]
static void TrackAchievement();
//[iOS] [Android]
static void EventCompletedTutorial();
//[iOS] [Android]
static void EventCreateRole();
};
获取版本号
- Android
- iOS
- Unity
- UE
XDGSDK.getVersionName(); // 6.0.0(6000000)
[XDGSDK getSDKVersionName];
XDGCommon.GetVersionName(Action<string> callback);
FXDGCommon::GetSDKVersionName();
获取地区信息
提示
这个接口实际封装了 https://ip.xindong.com/myloc2 中返回的地区信息,详细的 countryCode 定义可以参考 IBAN 的 Alpha-2 code
- Android
- iOS
- Unity
- UE
XDGSDK.getRegionInfo(new Callback<XDGRegionInfo>(){
@Override
public void onCallback(XDGRegionInfo xdgRegionInfo,XDGError tdsServerError) {
if (xdgRegionInfo != null) {
Log.d("getRegionInfo",String.format("国家: %s, 时区: %s, 城市: %s, 来源: %s",xdgRegionInfo.countryCode,xdgRegionInfo.timeZone,xdgRegionInfo.city,xdgRegionInfo.locationInfoType));
}
}
});
[XDGSDK getRegionInfo:^(XDGRegionInfo * _Nonnull info) {
// 国家代码
NSString *countryCode = info.countryCode;
// 时区
NSString *timeZone = info.timeZone;
// 城市
NSString *city = info.city;
// 位置信息来源,ip :ip 获取,sim:sim 卡获取, locale:手机系统获取
NSString *locationInfoType = info.locationInfoType;
}];
XDGCommon.GetRegionInfo(Action<XDGRegionInfoWrapper> callback);
FXDGCommon::GetRegionInfo(FXDGRegionInfo::FDelegate::CreateLambda([](const FXDGRegionInfo& RegionInfo) {
//成功
}),
FXDGError::FDelegate::CreateLambda([](const FXDGError& Error) {
//失败
}));