跳到主要内容

XDSDK v7 C++(Windows)快速接入指南

· 阅读需 4 分钟

环境要求

  • Windows 10 x64 及以上。
  • MSVC(Visual Studio 2019+,即 MSVC 14.2+)。
  • C++17 或更高标准。
  • CMake ≥ 3.20(仅 CMake 接入方式需要)。

SDK 包结构

XDSDK_Win_vX.X.X/
├── include/ # C API 头文件(推荐)
│ └── xdsdk/
│ ├── xdg_common_api.h
│ └── xdg_account_api.h
├── include_cpp/ # C++ API 头文件
│ └── xdsdk/
├── lib/ # 链接库 (.lib)
├── bin/ # 运行时 DLL + resources/
├── cmake/ # CMake find_package 支持
├── XDSDK.props # Visual Studio 属性表
└── XDConfig.json.template

接入配置

方式一:Visual Studio

  1. 解压 SDK 到任意目录
  2. Visual Studio 菜单:视图 → 其他窗口 → 属性管理器
  3. 右键项目 → 添加现有属性表,选择 XDSDK.props

XDSDK.props 自动完成以下配置:

  • 添加 include/ 到头文件搜索路径。
  • 添加 lib/ 并链接 xdsdk_common.libxdsdk_account.lib
  • 构建后自动将 bin/ 下所有 DLL 和 resources/ 复制到输出目录。

属性表仅配置了 include/(C API)。如需使用 include_cpp/ 下的 C++ API,请在项目属性中手动添加该路径。

也可以直接编辑 .vcxproj 文件,在 <ImportGroup Label="PropertySheets"> 中添加:

<ImportGroup Label="PropertySheets">
<Import Project="path\to\XDSDK_Win_vX.X.X\XDSDK.props" />
</ImportGroup>

同时确保项目设置了 C++17:

<PropertyGroup>
<LanguageStandard>stdcpp17</LanguageStandard>
</PropertyGroup>

方式二:CMake

find_package(XDSDK CONFIG REQUIRED PATHS "path/to/XDSDK/cmake")

target_link_libraries(MyGame PRIVATE XDSDK::common XDSDK::account)

# 自动将运行时 DLL 和 resources/ 复制到输出目录
xdsdk_copy_runtime_dlls(MyGame)

配置文件

XDConfig.json.template 重命名为 XDConfig.json,填写后放到游戏 exe 同级目录

game.exe
XDConfig.json ← 放这里
{
"client_id": "你的 Client ID",
"region_type": "CN",
"tapsdk": {
"client_id": "TapTap Client ID",
"client_token": "TapTap Client Token",
"db_config": {
"enable": true,
"channel": "steam",
"game_version": "1.0.0"
}
}
}

初始化

#include <xdsdk/xdg_common_api.h>
#include <xdsdk/xdg_account_api.h>
#include <windows.h>

// 前置声明
void on_user_status(int status_code, const char* message);
void on_init(int success, const char* msg);

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
XDG_SetUserStatusCallback(on_user_status);
XDG_InitSDK(on_init);

MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}

登录

void on_login_success(const char* user_json) {
// user_json: {"user_id":"...","name":"...","avatar":"...","login_type":5,"token":"..."}
}

void on_login_error(const char* error_json) {
// error_json: {"code":...,"message":"..."}
}

// 在初始化回调中发起登录
void on_init(int success, const char* msg) {
if (!success) return;
XDG_Login(XDG_LOGIN_TYPE_DEFAULT, on_login_success, on_login_error);
}

登录类型

常量说明
XDG_LOGIN_TYPE_DEFAULT0默认(显示登录选择界面)
XDG_LOGIN_TYPE_GUEST1游客登录
XDG_LOGIN_TYPE_TAPTAP5TapTap 登录

用户状态

在调用登录前,通过 XDG_SetUserStatusCallback 注册用户状态回调。

void on_user_status(int status_code, const char* message) {
if (status_code == XDG_USER_STATUS_LOGOUT) {
// 返回登录页面并展示登录按钮
// 注意:此时不要再调用自动登录接口
}
}

状态码

常量触发时机
XDG_USER_STATUS_LOGOUT0登出
XDG_USER_STATUS_BIND1绑定第三方账号完成
XDG_USER_STATUS_UNBIND2解绑第三方账号完成
XDG_USER_STATUS_PROTOCOL_AGREED3用户同意协议

API 参考

Common 模块(xdg_common_api.h)

函数说明
XDG_InitSDK(callback)初始化 SDK,从 XDConfig.json 读取配置
XDG_InitSDKWithParam(channel, lang, pkg, callback)带渠道/语言/包类型参数初始化
XDG_IsInitialized()是否已初始化,返回 1/0
XDG_SetLanguage(lang)设置语言,使用 XDG_LANG_* 常量
XDG_SetTargetCountryOrRegion(code)设置目标国家/地区,如 "KR"
XDG_OpenWebPage(url, callback)打开网页
XDG_TrackUser(user_id, props_json)TapDB 追踪用户
XDG_TrackRole(role_id, name, level, server_id, props_json)TapDB 追踪角色
XDG_TrackEvent(event_name, props_json)TapDB 追踪自定义事件
XDG_GetDeviceId()获取设备 ID
XDG_RequestAnnouncementUnread(server, channel, extra, callback)查询公告未读状态
XDG_OpenAnnouncementPage(server, channel, extra, callback)打开公告页面
XDG_GetVersion()获取 SDK 版本号

Account 模块(xdg_account_api.h)

函数说明
XDG_Login(type, on_success, on_error)登录
XDG_Logout()登出
XDG_IsLoggedIn()是否已登录,返回 1/0
XDG_GetCurrentUser()获取当前用户 JSON,未登录返回 "{}"
XDG_OpenUserCenter()打开用户中心
XDG_Bind(type, callback)绑定第三方账号
XDG_Unbind(type, callback)解绑第三方账号
XDG_SetUserStatusCallback(callback)注册用户状态回调(传 NULL 取消)

语言常量

常量说明
XDG_LANG_AUTO-1自动检测
XDG_LANG_ZH_HANS0简体中文
XDG_LANG_ZH_HANT1繁体中文
XDG_LANG_EN2英语
XDG_LANG_TH3泰语
XDG_LANG_ID4印尼语
XDG_LANG_KO5韩语
XDG_LANG_JA6日语
XDG_LANG_DE7德语
XDG_LANG_FR8法语
XDG_LANG_PT9葡萄牙语
XDG_LANG_ES10西班牙语
XDG_LANG_TR11土耳其语
XDG_LANG_RU12俄语
XDG_LANG_VI13越南语

日志

SDK 运行日志自动写入以下路径(相对于游戏 exe):

resources/logs/xdsdk_<client_id>.log

注意事项

  • C API 返回的字符串使用内部静态缓冲区,无需释放,但请在下次调用同一函数前复制。
  • 所有回调在 SDK 内部线程触发,如需操作 UI 请切换到主线程。

技术支持

如有问题请联系 SDK 技术支持。

XDSDK v7 Android 快速接入指南

· 阅读需 6 分钟

环境要求

  • 最低支持 Android API Level 21(Android 5.0)。
  • 使用 AndroidX

配置

获取 SDK

  1. 请联系平台同事获取最新的 SDK 压缩包,解压后根据需要选择对应的 aar 导入到项目中。
  2. 压缩包分为 XDSDKThirdPartyLibraryADs 三部分,按照添加依赖描述部分进行选择导入。

添加依赖

在项目 build.gradle 中添加 SDK 依赖:

XDSDK 目录

  • XDGCommon_latest.aar(基础库,必须)
  • XDGAccount_latest.aar(登录)
  • XDThirdLoginCN_latest.aar(国内第三方登录支持库)
  • XDGThirdLogin_latest.aar(海外第三方登录支持库)
  • XDGPayment_latest.aar(支付)
  • XDGPaymentUPPay_latest.aar(国内云闪付支付支持库)
  • XDGTapTapWrapperInternal_latest.aar(内部封装 TapSDK 支持库)
  • XDGTapTapWrapper_latest.aar(TapSDK 额外支持库)
  • XDGAnnouncement_latest.aar(公告)

ThirdPartyLibrary 目录

  • ThemisLite-release1.0.7.8.aar(基础库支持,必须)
  • oaid_sdk_xxx.aar(信通院 SDK)

在项目级 build.gradle(.kts) 中 添加远程依赖:

// 基础库依赖
implementation("io.reactivex.rxjava2:rxandroid:2.1.1")
implementation("androidx.appcompat:appcompat:1.3.1")
implementation("com.squareup.retrofit2:retrofit:2.9.0")
implementation("com.squareup.retrofit2:adapter-rxjava2:2.9.0")
implementation("com.squareup.okhttp3:okhttp:4.7.2")
implementation("com.squareup.okio:okio:2.6.0")
implementation("androidx.recyclerview:recyclerview:1.2.1")
implementation("com.google.code.gson:gson:2.8.6")
implementation("androidx.localbroadcastmanager:localbroadcastmanager:1.0.0")

//XDSDK 依赖的 TapSDK 库
implementation("com.taptap.sdk:tap-core:4.9.0")
implementation("com.taptap.sdk:tap-login:4.9.0")
implementation("com.taptap.sdk:tap-compliance:4.9.0") // 国内防沉迷
// 支持的额外的 TapSDK 库
implementation("com.taptap.sdk:tap-moment:4.9.0")
implementation("com.taptap.sdk:tap-review:4.9.0")
implementation("com.taptap.sdk:tap-license:4.9.0")
implementation("com.taptap.sdk:tap-update:4.9.0")
// Google Advertising ID
implementation("com.google.android.gms:play-services-ads-identifier:18.0.1")

// 支付宝支付
implementation("com.alipay.sdk:alipaysdk-android:15.8.32@aar")
// 微信支付(同微信分享)
implementation("com.tencent.mm.opensdk:wechat-sdk-android:6.8.0")
// 海外支付支持库
implementation("androidx.browser:browser:1.4.0")
备注

具体使用哪些模块以及版本号请和平台同事确认。

参数文件

将给到的参数配置文件名改为 XDConfig.json,放到 app/src/main/assets/ 目录下。

备注

如果使用 Google 登录或 Firebase 埋点,请在 Firebase 后台下载 google-services.json 并添加到 app/ 目录下。

AndroidManifest.xml 配置

海外网页支付

提示

URL Scheme 组成规则:xd + xd_client_id,其中 xd_client_id 为全小写。 eg. : 你的 XD Client ID 为:hn5RcJei2JxCYlS0,在 AndroidManifest.xml 文件中添加的格式为 <data android:scheme="xdhn5rcjei2jxcyls0" />

<activity
android:name="com.xd.intl.payment.ui.SchemeCCTActivity"
android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>

<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>

<data
android:host="xdcctwebpay"
android:scheme="xd{your_xd_client_id}}"/>
</intent-filter>
</activity>

初始化

初始化 SDK

  • 请将初始化代码放在尽可能靠前的位置,在初始化成功前请不要绘制登录相关的界面。
  • 如果初始化失败一般为配置问题,请根据错误信息检查配置是否正确或者咨询平台。
  • 初始化成功前大部分接口都不可使用。
// MainActivity.java

import com.xd.sdk.common.XDGCommon;
import com.xd.sdk.common.base.Lang;
import com.xd.sdk.common.callback.XDGInitCallback;
import com.xd.sdk.common.data.model.InitParams;
import com.xd.sdk.common.data.model.PackageType;

import org.json.JSONObject;

// ...

private void init() {
InitParams initParams = InitParams.newBuilder()
.setPackageType(PackageType.GooglePlay) // 默认: PackageType.Normal
.setLanguage(Lang.EN) // 初始化语言
.setChannelName("GooglePlay") // 初始化渠道,默认为空,SDK 内部会按照读取顺序获取渠道顺序,这里是保留字段,在非广告渠道的自定义。读取广告包配置(仅国内) -> this -> XDConfig.json 配置
.setDBProperties(new JSONObject().put("custom_key", "custom_value")) // db 参数可透传给 TapDB 的 device_login/user_login 事件
.build();

XDGCommon.initSDK(MainActivity.this, initParams, new XDGInitCallback() {
@Override
public void initCallback(boolean success, String message) {
if (success) {
// Success
} else {
// Failure
Log.e("MainActivity", "XDSDK Init failed: " + message);
}
}
});
}

修改多语言

在初始化后可根据需要修改 SDK 语言。

// MainActivity.java

import com.xd.sdk.common.XDGCommon;
import com.xd.sdk.common.base.Lang;

// ...

private void setLanguage() {
XDGCommon.setLanguage(Lang.ZH_CN);
}

通用

事件上报

// MainActivity.java

import com.xd.sdk.common.XDGCommon;

import java.util.HashMap;
import java.util.Map;

// ...

private void trackEvent() {
XDGCommon.trackEvent("自定义事件名称");

Map<String, Object> params = new HashMap<>();
params.put("key", "value");
XDGCommon.trackEvent("自定义带参数的事件名称", params);
}

商店评价

商店评价仅支持 Google Play 平台。

// MainActivity.java

import com.xd.sdk.common.XDGCommon;

// ...

private void storeReview() {
XDGCommon.storeReview(MainActivity.this);
}

打开网页

// PaymentActivity.java

import com.xd.sdk.common.XDGCommon;
import com.xd.sdk.common.callback.WebActionCallback;
import com.xd.sdk.common.entities.WebActionType;

import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.Map;

// ...

private void openWebPage() {
String activityUrl = "https://www.xindong.com";
XDGCommon.openWebPage(PaymentActivity.this, activityUrl, new WebActionCallback() {
@Override
public void onAction(int type, @Nullable Map<@NotNull String, ?> data) {
if (type == WebActionType.CLOSE) {
// 网页关闭
} else if (type == WebActionType.MESSAGE) {
// 网页透传信息
if (data != null) {
Object value = data.get("key");
}
}
}
});
}

登录

  • 在初始化成功后可以进入登录页面但暂时先不要绘制登录按钮,先设置好用户状态回调并调用自动登录,如果自动登录失败再绘制登录按钮。
  • 登录按钮点击后调用手动登录接口,需要传入对应的登录类型。登录失败后需要继续展示登录按钮让用户重新登录。
  • 自动登录在每次打开游戏时只能触发一次,失败后只能调用手动登录接口。
  • 收到用户退出登录的回调时需要回到登录页面并展示登录按钮。此时不要再调用自动登录接口。

状态回调

  • 需要在初始化前设置好
// MainActivity.java

import com.xd.sdk.account.XDGAccount;
import com.xd.sdk.common.callback.XDGUserStatusChangeCallback;

import org.jetbrains.annotations.Nullable;

// ...

private void addUserStatusChangeCallback() {
XDGAccount.addUserStatusChangeCallback(new XDGUserStatusChangeCallback() {
@Override
public void userStatusChange(int code, @Nullable String message) {
if (code == XDGUserStatusChangeCallback.UserStatus.LOGOUT) {
// 退出登录,回到登录页面,展示登录按钮
} else if (code == XDGUserStatusChangeCallback.UserStatus.BIND) {
// 绑定成功,没有更多登录方式可不处理
} else if (code == XDGUserStatusChangeCallback.UserStatus.UNBIND) {
// 解绑成功,没有更多登录方式可不处理
} else if (code == XDGUserStatusChangeCallback.UserStatus.PROTOCOL_AGREED_AFTER_LOGOUT) {
// 退出登录后同意协议,可不处理
} else if (code == XDGUserStatusChangeCallback.UserStatus.CUSTOMER_NO_UNREAD_MESSAGE) {
// 客服有未读消息,未开通服务可以不处理
} else if (code == XDGUserStatusChangeCallback.UserStatus.CUSTOMER_HAS_UNREAD_MESSAGE) {
// 客服没有未读消息,未开通服务可以不处理
} else {
// 未知 Code,不需要处理
}
}
});
}

发起登录

// LoginActivity.java

import android.util.Log;

import com.xd.sdk.account.XDGAccount;
import com.xd.sdk.common.base.XDGError;
import com.xd.sdk.common.bean.XDGUser;
import com.xd.sdk.common.callback.Callback;
import com.xd.sdk.common.entities.LoginEntryType;

import java.util.Map;

// ...

/**
* 登录
*
* LoginEntryType 枚举:
* LoginEntryType.DEFAULT - 自动登录
* LoginEntryType.TAP_TAP - TapTap 登录
* LoginEntryType.APPLE - Apple 登录
* LoginEntryType.GOOGLE - Google 登录
* LoginEntryType.FACEBOOK - Facebook 登录
* LoginEntryType.LINE - LINE 登录
* LoginEntryType.TWITTER - Twitter 登录
* LoginEntryType.STEAM - Steam 登录
* LoginEntryType.GUEST - 游客登录
* LoginEntryType.PHONE - 手机号登录
* LoginEntryType.EMAIL - 邮箱登录
*/
private void loginByType() {
XDGAccount.loginByType(LoginActivity.this, LoginEntryType.TAP_TAP, new Callback<XDGUser>() {
@Override
public void onCallback(XDGUser xdgUser, XDGError xdgError) {
if (xdgUser != null) {
// 登录成功
String userId = xdgUser.getId(); // 用户在 XD 账户系统的 XD User ID(用户唯一标识)
String avatarUrl = xdgUser.getAvatar();
String nickname = xdgUser.getNickName();
return;
}

// 登录失败
if (xdgError != null) {
int code = xdgError.getCode();
String message = xdgError.getMessage();
Log.e("LoginActivity", "XDSDK loginFailed, code=" + code + ", message: " + message);
Map<String, Object> errorDataMap = xdgError.getErrorDataMap();
if (errorDataMap != null) {
// ...
}
}
}
});
}

用户中心

// LoginActivity.java

import com.xd.sdk.account.XDGAccount;

// ...

private void openUserCenter() {
XDGAccount.openUserCenter(LoginActivity.this);
}

退出登录

// LoginActivity.java

import com.xd.sdk.account.XDGAccount;

// ...

private void logout() {
XDGAccount.logout(LoginActivity.this);
}

账号注销

// LoginActivity.java

import com.xd.sdk.account.XDGAccount;

// ...

private void openAccountDeletion() {
XDGAccount.openAccountDeletion(LoginActivity.this);
}

打开客服

// MainActivity.java

import com.xd.sdk.account.XDGAccount;
import com.xd.sdk.common.entities.RoleInfo;

import java.util.HashMap;
import java.util.Map;

// ...

private void openCustomerService() {
RoleInfo roleInfo = RoleInfo.newBuilder()
.setRoleId("game_role_id") // 必填
.setRoleName("game_role_name") // 必填
.setRoleLevel(100)// 必填
.setServerId("game_server_id") // 必填
.setExtra("extra_info")
.build();

String path = ""; // 客服内的相对路径,一般留空即可

Map<String, Object> extrasMap = new HashMap<>();
extrasMap.put("key", "value");

XDGAccount.openCustomerService(MainActivity.this, roleInfo, path, extrasMap);
}

个人信息页

仅限国内可使用

// LoginActivity.java

import com.xd.sdk.account.XDGAccount;
import com.xd.sdk.common.entities.RoleInfo;

// ...

private void openUserDashboard() {
RoleInfo roleInfo = RoleInfo.newBuilder()
.setRoleId("game_role_id") // 必填
.setRoleName("game_role_name") // 必填
.setRoleLevel(100)// 必填
.setServerId("game_server_id") // 必填
.setExtra("extra_info")
.build();
XDGAccount.openUserDashboard(LoginActivity.this, roleInfo);
}

内购

查询商品价格

  • 在查询商品价格前请在后台配置好对应的商品信息。
  • XDConfig.json 配置的 regionTypeGlobal 且初始化参数指定的 packageTypePackageType.GooglePlay 时查询的是 Google 的商品。
  • 其他情况查询的是在平台配置的商品。
// PaymentActivity.java

import com.xd.sdk.common.base.XDGError;
import com.xd.sdk.payment.XDGPayment;
import com.xd.sdk.payment.callback.PaymentResultCallback;
import com.xd.sdk.payment.entities.XDGProductInfo;


import org.jetbrains.annotations.NotNull;

import java.util.ArrayList;
import java.util.List;

// ...

private void queryProducts() {
// 当 XDConfig.json 配置的 regionType 为 Global 且初始化参数指定的 packageType 为 PackageType.GooglePlay 时查询的是 Google 的商品;
// 其他情况查询的是在平台配置的商品
List<String> productIdList = new ArrayList<>();
productIdList.add("product_id_1");
XDGPayment.queryWithProductIds(productIdList, new PaymentResultCallback<List<XDGProductInfo>>() {
@Override
public void onSuccess(@NotNull List<XDGProductInfo> xdgProductInfos) {
if (xdgProductInfos.isEmpty()) {
// 查询商品为空
} else {
// 查询成功
for (XDGProductInfo info : xdgProductInfos) {
String productId = info.getProductId();
String displayPrice = info.getDisplayPrice();
String title = info.getTitle();
String description = info.getDescription();
}
}
}

@Override
public void onError(@NotNull XDGError xdgError) {

}
});
}

发起内购

// PaymentActivity.java

import android.util.Log;

import com.xd.sdk.common.base.XDGError;
import com.xd.sdk.payment.XDGPayment;
import com.xd.sdk.payment.api.XDGPaymentParams;
import com.xd.sdk.payment.callback.PaymentResultCallback;
import com.xd.sdk.payment.entities.XDGOrderInfo;

import org.jetbrains.annotations.NotNull;

// ...

private void payWithParams() {
// 当 XDConfig.json 配置的 regionType 为 CN 发起的是国内支付宝&微信支付;
// regionType 为 Global 时:
// - 初始化参数指定的 packageType 为 PackageType.GooglePlay 时发起的是 Google 结算库购买
// - 其他,发起网页支付
XDGPaymentParams params = XDGPaymentParams.newBuilder()
.setGameOrderId("game_order_id") // 订单 ID
.setProductId("product_id") // 商品 ID
.setRoleId("game_role_id") // 角色 ID
.setServerId("game_server_id") // 服务器 ID
.setExt("extra_info") // 附加信息
.build();
XDGPayment.payWithParams(PaymentActivity.this, params, new PaymentResultCallback<XDGOrderInfo>() {
@Override
public void onSuccess(@NotNull XDGOrderInfo xdgOrderInfo) {
// 支付成功
Log.i("PaymentActivity", "支付订单数据: " + xdgOrderInfo);
}

@Override
public void onError(@NotNull XDGError xdgError) {
// 支付失败
int code = xdgError.getCode();
String message = xdgError.getMessage();
}
});
}

公告

展示公告

展示公告 UI,由 SDK 处理公告的获取和展示。可以在公告后台进行样式自定义。

// AnnouncementActivity.java

import com.xd.sdk.announcement.XDGAnnouncement;
import com.xd.sdk.announcement.domain.model.AnnouncementConfig;
import com.xd.sdk.common.callback.WebActionCallback;
import com.xd.sdk.common.entities.WebActionType;

import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.Map;

// ...

private void openPage() {
AnnouncementConfig config = AnnouncementConfig.newBuilder()
.setServerCode("server_code") // 公告后台配置服务器后生成的代码
.setChannel("tap") // 渠道标识
.build();
XDGAnnouncement.openPage(AnnouncementActivity.this, config, new WebActionCallback() {
@Override
public void onAction(int type, @Nullable Map<@NotNull String, ?> data) {
if (type == WebActionType.CLOSE) {
// 页面关闭
} else if (type == WebActionType.MESSAGE) {
// 页面消息
if (data != null) {
Object value = data.get("key");
}
}
}
});
}


检查未读公告

检查是否有未读公告,请不要频繁调用该接口,可能影响性能。

// AnnouncementActivity.java

import com.xd.sdk.announcement.XDGAnnouncement;
import com.xd.sdk.announcement.domain.model.AnnouncementConfig;
import com.xd.sdk.common.base.XDGError;
import com.xd.sdk.common.callback.Callback;

// ...

private void requestUnread() {
AnnouncementConfig config = AnnouncementConfig.newBuilder()
.setServerCode("server_code") // 公告后台配置服务器后生成的代码
.setChannel("tap") // 渠道标识
.build();
XDGAnnouncement.requestUnread(ADsActivity.this, config, new Callback<Boolean>() {
@Override
public void onCallback(Boolean aBoolean, XDGError xdgError) {
if (aBoolean) {
// 有未读公告
} else {
// 无未读公告
}
}
});
}


TapSDK 相关内容

请参考 TapSDK 接入文档的使用方式,将方法调用类改为 XDSDK 封装类,以云存档为例:

// TapSDKActivity.java

import androidx.annotation.NonNull;

import com.taptap.sdk.cloudsave.ArchiveData;
import com.taptap.sdk.cloudsave.ArchiveMetadata;
import com.taptap.sdk.cloudsave.internal.TapCloudSaveRequestCallback;

//...

private void createArchive() {
ArchiveMetadata metadata = new ArchiveMetadata.Builder()
.setName("")
.setSummary("")
.setExtra("")
.setPlaytime(0)
.build();
// 存档文件路径(单个存档文件大小不超过10MB)
String archiveFilePath = "path/to/archive/file";
// 存档封面路径(可选,封面大小不超过512KB)
String archiveCoverPath = "path/to/cover/image";

// 请求回调
TapCloudSaveRequestCallback callback = new TapCloudSaveRequestCallback() {

@Override
public void onRequestError(int errorCode, @NonNull String errorMessage) {
// 处理请求错误
}

@Override
public void onArchiveCreated(@NonNull ArchiveData archive) {
// 处理存档创建成功
}
};
XDTapCloudSave.createArchive(metadata, archiveFilePath, archiveCoverPath, callback);
}

XDSDK 封装的 TapSDK 类包括:

XDSDK v7 iOS 快速接入指南

· 阅读需 5 分钟

环境要求

  • 国内最低 iOS 11.0,海外最低 iOS 13.0。
  • XCode 16 或更高版本。

配置

导入 SDK

  1. 请联系平台同事获取最新的 SDK 压缩包,解压后选择需要的 framework 和 bundle 导入到您的项目中。
  2. 压缩包分为 ThirdSDKXDSDK 两部分,所有的 framework 均为动态库,导入后请设置为 Embed & Sign

必选项:

  • XDAccountSDK.framework(登录)
  • XDPaymentSDK.framework(支付)
  • XDCommonSDK.framework(基础库)
  • XDTapSDK4WrapperSDK.framework(TapSDK 封装库)
  • TapTapMomentResource.bundle(TapTap 资源包)
  • TapTapLoginResource.bundle(TapTap 资源包)
  • TapTapComplianceResource.bundle(TapTap 资源包)
  • TapTapAchievementResource.bundle(TapTap 资源包)

可选项:

  • XDCNWrapper.framework(国内三方 SDK,按需添加)
  • XDGlobalWrapper.framework(海外三方 SDK,按需添加)

参数文件

将给到的参数配置文件名改为 XDConfig.json,导入到 XCode 工程中。

备注

如果使用 Google 登录或 Firebase 埋点,请在 Firebase 后台下载 GoogleService-Info.plist 并添加到项目中。

添加系统依赖库

请检查项目中是否已自动添加以下依赖项:

LocalAuthentication.framework
AuthenticationServices.framework
SystemConfiguration.framework
Accelerate.framework
SafariServices.framework
Webkit.framework
CoreTelephony.framework
Security.framework
libc++.tdb
AVFoundation.framework
AdServices.framework
提示
  • AdServices.framework 需要在 Build Phases → Link Binary With Libraries 中设置为 Optional。
  • AuthenticationServices.framework iOS 12 以上才支持,建议设置为 Optional。

配置编译选项

Build Setting 中的 Other Link Flag 中添加 -ObjC

Capabilities 中按需打开 In-App PurchasePush NotificationsSign In With Apple 等功能。

配置 AppDelegate

在项目中实现了 UIApplicationDelegate 协议的类中引入头文件,并将系统回调转发给 SDK:

#import <XDCommonSDK/XDCommonSDK.h>

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// ...其他初始化代码

[XDGSDK application:application didFinishLaunchingWithOptions:launchOptions];
return YES;
}

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
[XDGSDK application:application didRegisterForRemoteNotificationsWithDeviceToken:deviceToken];
}

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options {
[XDGSDK application:app openURL:url options:options];
return YES;
}

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler {
[XDGSDK application:application continueUserActivity:userActivity restorationHandler:restorationHandler];
return YES;
}

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
[XDGSDK application:application didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler];
}

@end
提示

请确保在 didFinishLaunchingWithOptions 中尽早调用 [XDGSDK application:application didFinishLaunchingWithOptions:launchOptions],其余回调方法也需要正确转发,否则可能影响登录、支付、推送等功能。

初始化

初始化SDK

  • 请将初始化代码放在尽可能靠前的位置,在初始化成功前请不要绘制登录相关的界面。
  • 如果初始化失败一般为配置问题,请根据错误信息检查配置是否正确或者咨询平台。
  • 初始化成功前大部分接口都不可使用。
#import <XDCommonSDK/XDCommonSDK.h>

XDGInitParam *initParam = [XDGInitParam new];
// 语言和渠道根据实际情况设置
initParam.lang = XDGLanguageLocaleEnglish;
initParam.channel = @"AP";
// db 参数可透传给 TapDB 的 device_login/user_login 事件
NSMutableDictionary *dbProperties = [NSMutableDictionary dictionary];
[dbProperties setValue:@"demo_extra_value" forKey:@"demo_extra_key"];
initParam.dbProperties = dbProperties;
[XDGSDK initSDK:initParam
handler:^(BOOL success, NSString *msg) {
if (success) {
NSLog(@"初始化成功");
} else {
NSLog(@"初始化失败:%@", msg);
}
}];

// 判断是否初始化完成
BOOL isInitialized = [XDGSDK isInitialized];

修改多语言

在初始化后可根据需要修改 SDK 语言。

#import <XDCommonSDK/XDCommonSDK.h>

/** 设置 SDK 显示语言
* @param locale 语言,在 XDGLanguageLocale 枚举中查看
*/
[XDGSDK setLanguage:XDGLanguageLocaleSimplifiedChinese];

登录

  • 在初始化成功后可以进入登录页面但暂时先不要绘制登录按钮,先设置好用户状态回调并调用自动登录,如果自动登录失败再绘制登录按钮。
  • 登录按钮点击后调用手动登录接口,需要传入对应的登录类型。登录失败后需要继续展示登录按钮让用户重新登录。
  • 自动登录在每次打开游戏时只能触发一次,失败后只能调用手动登录接口。
  • 收到用户退出登录的回调时需要回到登录页面并展示登录按钮。此时不要再调用自动登录接口。

状态回调

  • 需要在初始化前设置好
typedef NS_ENUM(NSInteger, XDGUserStateChangeCode) {
XDGUserStateChangeCodeLogout = 0, // 用户登出
XDGUserStateChangeCodeBindSuccess = 1, // 用户绑定成功,msg = 登录类型字符串,例如:@"TAPTAP"
XDGUserStateChangeCodeUnBindSuccess = 2, // 用户解绑成功,msg = 登录类型字符串
XDGUserStateChangeCodeProtocolAgreedAfterLogout = 3, // 用户在登出后点击确认同意协议
XDGUserStateChangeCodeSupportNoUnread = 4, // 客服中心没有未读消息
XDGUserStateChangeCodeSupportHasUnread = 5, // 客服中心有未读消息
};

[XDGAccount addUserStatusChangeCallback:^(XDGUserStateChangeCode userStateChangeCode, NSString *message) {
if (userStateChangeCode == XDGUserStateChangeCodeBindSuccess) {
// 绑定新平台成功
} else if (userStateChangeCode == XDGUserStateChangeCodeUnBindSuccess) {
// 解绑平台成功
} else if (userStateChangeCode == XDGUserStateChangeCodeLogout) {
// 用户退出登录
} else if (userStateChangeCode == XDGUserStateChangeCodeProtocolAgreedAfterLogout) {
// 用户退出登录后点击同意协议
} else if (userStateChangeCode == XDGUserStateChangeCodeSupportNoUnread) {
// 客服中心没有未读消息
} else if (userStateChangeCode == XDGUserStateChangeCodeSupportHasUnread) {
// 客服中心有未读消息
}
}];

发起登录

LoginEntryTypeDefault (自动登录)
LoginEntryTypeTapTap
LoginEntryTypeApple
LoginEntryTypeGoogle
LoginEntryTypeFacebook
LoginEntryTypeLine
LoginEntryTypeTwitter
LoginEntryTypeSteam
LoginEntryTypeGuest
LoginEntryTypePhone
LoginEntryTypeEmail

LoginEntryType type = LoginEntryTypeDefault;
[XDGAccount loginByType:type loginHandler:^(XDGUser * _Nullable result, NSError * _Nullable error) {
if (error) {
// 登录失败
// error.code (错误码,用来区分类型)
// error.localizedDescription (可以用来展示给用户的错误原因文案)
} else {
// 登陆成功
NSString *xdUserID = result.userId; // result.userId 为用户在 XD 账户系统的 XD User ID(用户唯一标识)
NSString *name = result.name;
NSString *nickName = result.nickName;
NSString *avatar = result.avatar;
}
}];

用户中心

[XDGAccount openUserCenter];

退出登录

[XDGAccount logout];

账号注销

[XDGAccount openAccountDeletion];

打开客服

XDGRoleInfo *role = [XDGRoleInfo new];
role.roleId = roleId; // 必填
role.roleName = roleName; // 必填
role.roleLevel = roleLevel; // 必填
role.serverId = serverId; // 必填
NSString *pathStr = @"客服内的相对路径,一般留空即可";
NSDictionary *paramsDic = @{@"自定义参数 key":@"自定义参数 value"};
[XDGAccount openCustomerService:role path:pathStr params:paramsDic];

个人信息页

仅限国内可使用

XDGRoleInfo *roleInfo = [XDGRoleInfo new];
roleInfo.roleId = roleId; // 必填
roleInfo.roleName = roleName; // 必填
roleInfo.roleLevel = roleLevel; // 必填
roleInfo.serverId = serverId; // 必填
[XDGAccount openUserDashboard:roleInfo];

内购

查询商品价格

  • 在查询商品价格前请在后台配置好对应的商品信息。
  • 使用 App Store 的商品 ID 进行查询。
NSArray *procudtIds = @[@"com.xd.sdkdemo1.stone30", @"com.xd.sdkdemo1.stone50"];
[XDGPayment queryWithProductIds:procudtIds completionHandler:^(NSArray<XDGProductInfo *> * _Nullable result, NSError * _Nullable error) {
if (error) {
NSLog(@"查询失败 %@", error);
} else {
for (XDGProductInfo *product in result) {
// 商品 ID
NSString *productId = product.productIdentifier;
// 展示价格(拼接好的完整货币符号和价格文本)
NSString *displayPrice = product.displayPrice;
}
}
}];

发起内购

XDGPaymentParams *params = [XDGPaymentParams new];
params.gameOrderId = @"可选,游戏侧订单号,不填会自动生成随机订单号";
params.productId = @"必须,在苹果后台配置的商品 ID";
params.roleId = @"必须,角色 ID";
params.serverId = @"必须,服务器 ID";
params.extra = @"可选,透传参数";
params.quantity = 1; // 购买数量,限制为 1-10

[XDGPayment payWithParams:params completionHandler:^(XDGOrderInfo * _Nullable orderInfo, NSError * _Nullable error) {
if (error) {
// 支付失败
} else {
// 支付成功
}
}];

查询 Apple 未消费订单

  • 仅 Apple 平台可用。
  • 查询到的订单可能是用户之前购买成功但未成功消费的订单,也可能是 App Store 中兑换的礼包码订单。
[XDGPayment queryPendingPurchases:^(NSArray<XDGPendingPurchase *> * _Nonnull result) {
for (XDGPendingPurchase *purchase in result) {
NSString *productId = purchase.productId; // 商品ID
NSString *purchaseToken = purchase.pendingPurchaseToken; // 订单标识符
}
}];

消费 Apple 未消费订单

XDGPaymentParams *params = [XDGPaymentParams new];
params.gameOrderId = @"可选,游戏侧订单号,不填会自动生成随机订单号";
params.productId = @"必须,在苹果后台配置的商品 ID";
params.roleId = @"必须,角色 ID";
params.serverId = @"必须,服务器 ID";
params.extra = @"可选,透传参数";
params.quantity = 1;
params.pendingPurchaseToken = @"未完成订单标识符,从查询未完成订单接口获取";
[XDGPayment handlePendingPurchase:params completionHandler:^(XDGOrderInfo * _Nullable orderInfo, NSError * _Nullable error) {
if (error) {
// 兑换或补单失败
} else {
// 兑换或补单成功
}
}];

工具

事件上报

#import <XDCommonSDK/XDCommonSDK.h>

/** 跟踪自定义事件
* @param eventName 事件名称
*/
NSString *eventName = @"custom_event_name";
[XDGSDK trackEvent:eventName];

/** 跟踪自定义事件
* @param eventName 事件名称
* @param properties 自定义属性
*/
NSString *eventName2 = @"custom_event_name";
NSMutableDictionary *properties = [NSMutableDictionary dictionary];
[XDGSDK trackEvent:eventName2 properties:properties];

// 跟踪角色信息
XDGRoleInfo *role = [XDGRoleInfo new];
role.roleId = @"your_role_id";
role.roleName = @"your_role_name";
role.roleLevel = 11;
role.serverId = @"your_server_id";
[XDGSDK trackRole:role];

商店评价

#import <XDCommonSDK/XDCommonSDK.h>

[XDGSDK storeReview];

打开网页

#import <XDCommonSDK/XDCommonSDK.h>

[XDGSDK openWebPageWithURL:@"https://活动页面地址" handler:^(XDGWebAction actionType, NSDictionary * _Nullable data) {
if (actionType == XDGWebActionCloseWeb) {
// 网页关闭
} else if (actionType == XDGWebActionMessage) {
// 网页透传消息
NSLog(@"网页透传消息 %@", data);
}
}];

公告

展示公告

展示公告 UI,由 SDK 处理公告的获取和展示。可以在公告后台进行样式自定义。

#import <XDCommonSDK/XDGAnnouncementManager.h>

XDGAnnouncementConfig *config = [XDGAnnouncementConfig new];
config.serverCode = @"1"; // 公告后台配置服务器后生成的代码
config.channel = @"ios"; // 渠道标识
[XDGAnnouncementManager openPageWithConfig:config handler:^(XDGWebAction actionType, NSDictionary * _Nullable data) {
if (actionType == XDGWebActionCloseWeb) {
// 页面关闭时回调
} else if (actionType == XDGWebActionMessage) {
// 页面消息回调
}
}];

检查未读公告

检查是否有未读公告,请不要频繁调用该接口,可能影响性能。

#import <XDCommonSDK/XDGAnnouncementManager.h>

XDGAnnouncementConfig *config = [XDGAnnouncementConfig new];
config.serverCode = @"1"; // 公告后台配置服务器后生成的代码
config.channel = @"ios"; // 渠道标识
[XDGAnnouncementManager requestUnreadWithConfig:config handler:^(_Bool hasRedDot) {
if (hasRedDot) {
// 有未读公告
} else {
// 无未读公告
}
}];

TapSDK

以下模块均已由 XDSDK 统一封装,游戏无需单独集成对应的 TapSDK,接入请参考 TapTap 文档: 成就 云存档 动态

接入时不要使用 TapSDK 的类和方法,请使用 XDSDK 封装的类和方法:

#import <XDTapSDK4WrapperSDK/XDTapSDK4WrapperSDK.h>

//成就接口 XDGTapTapAchievementWrapper.h
//云存档接口 XDGTapTapCloudSaveWrapper.h
//动态接口 XDGTapTapMomentWrapper.h

XDSDK v7 Unity 快速接入指南

· 阅读需 4 分钟

配置

添加依赖

参考下面内容,在 manifest.json 中添加 SDK 依赖。代码示例为所有模块,具体使用哪些请和平台同事确认。

{
"dependencies": {
"com.xd.sdk.foundation": "7.3.3",
"com.xd.sdk.common": "7.3.3",
"com.xd.sdk.account": "7.3.3",
"com.xd.sdk.payment": "7.3.3",
"com.xd.sdk.mainland": "7.3.3",
"com.xd.sdk.announcement": "7.3.3",
"com.xd.sdk.tap": "4.9.0-xd.5",
"com.xd.sdk.tap.plus": "4.9.0-xd.2"
},
"scopedRegistries": [
{
"name": "NPMJS",
"url": "https://registry.npmmirror.com",
"scopes": [
"com.xd.sdk"
]
}
]
}

导入插件

如果您的游戏包含 PC 平台,请按照下面步骤导入 Vuplex WebView 插件:

  1. 将给到的 Vuplex 4.5 的 UnityPackage 导入项目。
  2. 将 asmdef 文件拷贝到 Vuplex/WebView/Core/Scripts/Vuplex.WebView.asmdef

如果您的游戏不包含 PC 平台,请在工程配置的 Scripting Define Symbols 中添加宏 XDSDK_DISABLE_VUPLEX

参数文件

将给到的参数配置文件名改为XDConfig.json,放到 Assets/ 目录下。

初始化

打印日志

using XD.SDK.Common;
XDGLogger.LogDelegate = (level, info) =>
{
// 自行打印到控制台或文件
};

初始化SDK

  • 请将初始化代码放在尽可能靠前的位置,在初始化成功前请不要绘制登录相关的界面。
  • 如果初始化失败一般为配置问题,请根据错误信息检查配置是否正确或者咨询平台。
  • 初始化成功前大部分接口都不可使用。
using XD.SDK.Common;

// 渠道和语言根据实际情况修改
// PackageType 规则
// 国内 TapTap PC 平台请使用 PackageTypePCTapTap,
// 海外 Google Play Android 平台请使用 PackageTypeAndroidGooglePlay
// 其他平台请使用 PackageTypeDefault

// db 参数可透传给 TapDB 的 device_login/user_login 事件
var dbProperties = new Dictionary<string, object>
{
{ "test_init_device_login_key", "test_init_device_login_value" }
};
XDGInitParam initParam = XDGInitParam.CreateToXDSDK("your_channel", LangType.ZH_CN, XDGPackageType.PackageTypePCTapTap, dbProperties);
XDGCommon.InitSDK(initParam,
(success, msg) =>
{
if (success)
{
// 初始化成功
}
else
{
// 初始化失败
}
});

// 判断是否初始化完成
bool isInitialized = XDGCommon.IsInitialized();

修改多语言

在初始化后可根据需要修改SDK语言。

using XD.SDK.Common;
XDGCommon.SetLanguage(LangType.EN);

登录

  • 在初始化成功后可以进入登录页面但暂时先不要绘制登录按钮,先设置好用户状态回调并调用自动登录,如果自动登录失败再绘制登录按钮。
  • 登录按钮点击后调用手动登录接口,需要传入对应的登录类型。登录失败后需要继续展示登录按钮让用户重新登录。
  • 自动登录在每次打开游戏时只能触发一次,失败后只能调用手动登录接口。
  • 收到用户退出登录的回调时需要回到登录页面并展示登录按钮。此时不要再调用自动登录接口。

状态回调

  • 需要在初始化前设置好
using XD.SDK.Account;   

// 设置用户状态回调
XDGAccount.AddUserStatusChangeCallback((code, message) =>
{
switch (code)
{
case XDGUserStatusCodeType.BIND:
// 绑定成功,没有更多登录方式可不处理
break;
case XDGUserStatusCodeType.UNBIND:
// 解绑成功,没有更多登录方式可不处理
break;
case XDGUserStatusCodeType.LOGOUT:
// 退出登录,回到登录页面,展示登录按钮
break;
case XDGUserStatusCodeType.ProtocolAgreedAfterLogout:
// 退出登录后同意协议,可不处理
break;
case XDGUserStatusCodeType.SupportHasUnRead:
// 客服有未读消息,未开通服务可以不处理
break;
case XDGUserStatusCodeType.SupportNoUnRead:
// 客服没有未读消息,未开通服务可以不处理
break;
default:
// 未知 Code,不需要处理
break;
}
});

发起登录

using XD.SDK.Account;

// 自动登录,在初始化成功后可以调用该方法,每次打开游戏只触发一次。失败之后只能调用其他登录方式。
XDGAccount.LoginByType(LoginType.Default,
user =>
{
// 自动登录成功,进入游戏
String userId = user.UserId;
},
error =>
{
// 自动登录失败,展示 TapTap 登录按钮
});

// 手动登录
XDGAccount.LoginByType(LoginType.TapTap,
user =>
{
// TapTap登录成功,进入游戏
String userId = user.UserId;
},
error =>
{
// TapTap 登录失败,展示 TapTap 登录按钮
});

// 登录后获取用户信息
XDGUser currentUser = XDGAccount.GetCurrentUser();

用户中心

using XD.SDK.Account;

XDGAccount.OpenUserCenter(null);

退出登录

using XD.SDK.Account;

XDGAccount.Logout();

账号注销

using XD.SDK.Account;

XDGAccount.OpenAccountDeletion();

打开客服

using XD.SDK.Account;

// 角色信息
XDGRoleInfo role = new XDGRoleInfo()
{
RoleId = "role_id",
RoleLevel = 10,
RoleName = "role_name",
ServerId = "server_id"
};
// 透传参数
var paramsMap = new Dictionary<string, object>
{
{ "key1", "value1" },
{ "key2", true },
{ "key3", 1234567890 }
};
XDGAccount.OpenCustomerService(role, "", paramsMap);

个人信息页

仅限国内可使用

using XD.SDK.Account;

XDGRoleInfo role = new XDGRoleInfo()
{
RoleId = "role_id",
RoleLevel = 10,
RoleName = "role_name",
ServerId = "server_id"
};
XDGAccount.OpenUserDashboard(role);

内购

查询商品价格

  • 在查询商品价格前请在后台配置好对应的商品信息。
  • Apple、Google Play 平台查询价格需要使用对应平台的商品 ID。
  • 其他平台查询价格使用 XD 平台的商品 ID。
using XD.SDK.Payment;

string[] productIdList = { "com.xd.demo.sku1", "com.xd.demo.sku2" };
XDGPayment.QueryWithProductIds(productIdList,
list =>
{
foreach (var product in list)
{
// 商品 ID
var productId = product.ProductId;
// 商品价格,带货币符号,可直接使用
var productPrice = product.DisplayPrice;
}
},
error =>
{
// 查询失败
});

发起内购

using XD.SDK.Payment;

var paymentParams = new XDGPaymentParams(
"game_order_id", // 游戏订单号
"product_id", // 商品 ID
"role_id", // 当前角色 ID
"server_id", // 当前服务器 ID
"extra", // 透传参数
1);// 商品数量,仅 Apple 购买可用
XDGPayment.PayWithParams(paymentParams,
orderInfo =>
{
// 购买完成,发货请等待服务端回调
String orderId = orderInfo.GameOrderId;
String productId = orderInfo.ProductId;
String roleId = orderInfo.RoleId;
String serverId = orderInfo.ServerId;
String extra = orderInfo.Extra;
},
error =>
{
// 购买失败
});

查询 Apple 未消费订单

  • 仅 Apple 平台可用,其他平台调用该接口会直接返回空列表。
  • 查询到的订单可能是用户之前购买成功但未成功消费的订单,也可能是 App Store 中兑换的礼包码订单。
using XD.SDK.Payment;

// 查询礼包码或掉单数据
XDGPayment.QueryPendingPurchases(
list =>
{
if (list == null || list.Count == 0)
{
// 没有未完成的订单
}
else
{
foreach (var purchase in list)
{
// 商品 ID
string productId = purchase.ProductId;
// 订单 token
string purchaseToken = purchase.PurchaseToken;
}
}
},
error =>
{
// 查询失败
});

消费 Apple 未消费订单

using XD.SDK.Payment;

var paymentParams = new XDGPaymentParams(
"game_order_id", // 可选,游戏侧订单号,不填会自动生成随机订单号
"product_id", // 必须,商品 ID
"role_id", // 必须,角色 ID
"server_id", // 必须,服务器 ID
"extra", // 可选,透传参数
1);// 商品数量,仅 Apple 购买可用

// 未完成订单标识符,从查询未完成订单接口获取
paymentParams.PendingPurchaseToken = "purchase_token";

XDGPayment.HandlePendingPurchase(paymentParams,
orderInfo =>
{
// 兑换或补单成功
},
error =>
{
// 兑换或补单失败
});

工具

事件上报

using XD.SDK.Common;

// 事件上报
XDGCommon.TrackEvent("event_name", new Dictionary<string, object>()
{
{ "key1", "value1" },
{ "key2", "value2" }
});

// 角色信息上报
XDGRoleInfo role = new XDGRoleInfo()
{
RoleId = "role_id",
RoleLevel = 10,
RoleName = "role_name",
ServerId = "server_id"
};
XDGCommon.TrackRole(role);

商店评价

商店评价仅支持 Apple 和 Google Play 平台。

using XD.SDK.Common;

XDGCommon.StoreReview();

打开网页

using XD.SDK.Common;

XDGCommon.OpenWebPage("url", (actionType, objects) =>
{
// objects 是透传数据,在各个事件中均可能携带
if (actionType == WebActionEnum.CLOSE)
{
// 关闭网页
} else if (actionType == WebActionEnum.MESSAGE)
{
// 透传数据,具体数据内容根据和网页的约定而定
}
});

公告

展示公告

展示公告 UI,由 SDK 处理公告的获取和展示。可以在公告后台进行样式自定义。

using XD.SDK.Announcement;

XDGAnnouncementConfig config = new XDGAnnouncementConfig();
config.Channel = "渠道配置"; // 对应公告后台的 Google iOS PC 等
config.ServerCode = "服务器 code"; // 对应公告后台配置服务器时对应的 code

// 展示公告面板
XDGAnnouncementManager.OpenAnnouncementPage(config, (actionType, objects) =>
{
// objects 是透传数据,在各个事件中均可能携带
if (actionType == WebActionEnum.CLOSE)
{
// 关闭公告
} else if (actionType == WebActionEnum.MESSAGE)
{
// 透传数据
}
});

检查未读公告

检查是否有未读公告,请不要频繁调用该接口,可能影响性能。

using XD.SDK.Announcement;

XDGAnnouncementConfig config = new XDGAnnouncementConfig();
config.Channel = "渠道配置"; // 对应公告后台的 Google iOS PC 等
config.ServerCode = "服务器 code"; // 对应公告后台配置服务器时对应的 code

XDGAnnouncementManager.RequestAnnouncementUnread(config, hasUnread =>
{
if (hasUnread)
{
// 有未读公告
}
else
{
// 没有未读公告
}
});

TapSDK

  • TapSDK 内的功能模块均由 XDSDK 进行初始化和调用,游戏无需重复初始化 TapSDK。
  • 接口功能使用说明请参考 TapSDK 文档,但接口使用时请注意替换成 XDSDK 中的对应接口,一般在 XDGTapSDK 和 XDGTapPlusSDK 两个类中,函数名一般保持不变。

XDGTapSDK

using XD.SDK.Tap;

该模块下所有模块使用时需要替换成 XDGTapSDK.接口名 形式调用。

XDGTapPlusSDK

using XD.SDK.Tap.Plus;

该模块下所有模块使用时需要替换成 XDGTapPlusSDK.接口名 形式调用。