API 参考
注意事项
初始化要求
除了 TapSDK_RestartAppIfNecessary 之外,调用其他所有 API 函数前必须先成功调用 TapSDK_Init 进行初始化。
未初始化或初始化失败时调用其他函数将返回错误或者非预期结果。
监听 TapTap 客户端系统状态变化
- 建议初始化成功后,立刻注册系统状态变化回调,以便实时获知 TapTap 客户端状态变化。
- 注册后,调用TapSDK_RunCallbacks()会触发回调函数得到当前的系统状态。
- 此后,只有当系统状态发生变化时,才会再次触发回调函数,得到变化后的系统状态。
TapSDK_RegisterCallback(TapEventID::SystemStateChanged, yourSystemStateNotificationHandler);
数据类型定义
基础类型
typedef char ErrMsg[1024]; // 错误信息,最大长度 1023 字节 + '\0'
typedef void (T_CALLTYPE *callback_t)(TapEventID, void *); // 回调函数类型
// TapSDK 接口返回值,取值请参考枚举值 TapSDK_Result_*
// - 注意:由于历史原因,部分接口(如初始化、授权、云存档)的返回值不是 TapSDK_Result 类型,请参考对应接口的文档说明
typedef uint32_t TapSDK_Result;
typedef int64_t TapSDK_ErrorCode; // 错误码,取值请参考枚举值 TapSDK_ErrorCode_*
typedef uint32_t TapSystemState; // TapTap 客户端系统状态,取值请参考枚举值TapSystemState_*
#pragma pack(push, 8)
// 错误信息结构体
typedef struct {
TapSDK_ErrorCode code; // 错误码
const char* message; // 错误信息
} TapSDK_Error;
// TapTap 客户端系统状态通知
typedef struct {
TapSystemState state; // TapTap 客户端当前系统状态
} TapSystemStateNotification;
#pragma pack(pop)
枚举类型
TapSDK_Init_Result
SDK 初始化结果枚举:
enum class TapSDK_Init_Result : uint32_t {
OK = 0, // 初始化成功
FailedGeneric = 1, // 其他错误
NoPlatform = 2, // 未找到 TapTap 平台
NotLaunchedByPlatform = 3, // 未通过 TapTap 启动
PlatformVersionMismatch = 4 // 平台版本不匹配,请引导用户升级 TapTap 与游戏至最新版本,再重新运行游戏
};
TapUser_AsyncAuthorize_Result
用户授权请求结果枚举:
enum class TapUser_AsyncAuthorize_Result : uint32_t {
Unknown = 0, // 未知错误,通常由于未初始化(未调用 TapSDK_Init)或初始化失败导致
OK = 1, // 成功发起授权流程
Failed = 2, // 发起授权流程失败,建议提示用户重试
InFlight = 3 // 授权流程正在执行中,建议忽略错误或提示用户等待
};
TapEventID
事件 ID 枚举:
enum class TapEventID : uint32_t {
Unknown = 0,
// TapTap客户端系统状态变化通知,SDK初始化成功后注册此事件的回调函数,以便及时获知TapTap客户端状态变化
// 使用 TapSystemStateNotification 结构体解析
SystemStateChanged = 1,
AuthorizeFinished = 2002, // 授权完成事件
GamePlayableStatusChanged = 4001, // 游戏可玩状态变更事件
DLCPlayableStatusChanged = 4002, // DLC 可玩状态变更事件
CloudSaveList = 6001, // 获取云存档列表
CloudSaveCreate = 6002, // 创建云存档
CloudSaveUpdate = 6003, // 更新云存档
CloudSaveDelete = 6004, // 删除云存档
CloudSaveGetData = 6005, // 获取云存档数据
CloudSaveGetCover = 6006, // 获取云存档封面
AchievementUnlock = 7001, // 解锁成就
AchievementIncrement = 7002, // 分步成就增长步长
ComplianceEnsureRealName = 8001, // 实名认证结果回调,使用 TapComplianceEnsureRealNameResponse 结构体解析
ComplianceActionsEvent = 8002, // 防沉迷通知,使用 TapComplianceActionsEvent 结构体解析
};
TapSDK_Result
TapSDK 接口返回值枚举值:
enum {
// [0, 1000) 预留给通用错误
TapSDK_Result_OK = 0,
TapSDK_Result_Uninitialized = 1, // SDK 未初始化,请调用 TapSDK_Init 并确保返回为 TapSDK_Init_Result::OK
TapSDK_Result_NoTapTapClient = 2, // TapTap 客户端尚未运行
TapSDK_Result_TapTapClientOutdated = 3, // TapTap 客户端版本过旧,请引导用户更新最新版 TapTap 客户端
TapSDK_Result_InvalidArgument = 4, // 参数错误,比如不允许 NULL 的参数传了 NULL
TapSDK_Result_SdkFailed = 5, // SDK内部错误
TapSDK_Result_TapTapClientNotLoggedIn = 6, // TapTap 客户端未登录
TapSDK_Result_UnknownError = 7, // 未知错误
TapSDK_Result_NetworkError = 8, // 网络错误
};
注意事项
由于历史原因,部分接口(如初始化、授权、云存档)的返回值不是 TapSDK_Result 类型,请参考对应接口的文档说明
TapSDK_ErrorCode
错误码枚举:
enum {
TapSDK_ErrorCode_Success = 0, // 请求执行成功
TapSDK_ErrorCode_Unknown = 1, // 未知错误
TapSDK_ErrorCode_Unauthorized = 2, // 用户凭证失效,请引导用户重新登录 TapTap
TapSDK_ErrorCode_MethodNotAllowed = 3, // 不允许的接口请求
TapSDK_ErrorCode_Unimplemented = 4, // 接口未实现
TapSDK_ErrorCode_InvalidArguments = 5, // 参数错误
TapSDK_ErrorCode_Forbidden = 6, // 用户没有当前动作的权限
TapSDK_ErrorCode_UserIsDeactivated = 7, // 用户被冻结
TapSDK_ErrorCode_InternalServerError = 8, // 服务器内部错误
TapSDK_ErrorCode_InternalSdkError = 9, // SDK内部错误
TapSDK_ErrorCode_NetworkError = 10, // 网络错误
TapSDK_ErrorCode_CloudSave_InvalidFileSize = 400000, // 非法的存档文件/封面大小
TapSDK_ErrorCode_CloudSave_UploadRateLimit = 400001, // 存档上传频率超限
TapSDK_ErrorCode_CloudSave_FileNotFound = 400002, // 存档文件不存在
TapSDK_ErrorCode_CloudSave_FileCountLimitPerClient = 400003, // 用户在该用下存档文件数量超限
TapSDK_ErrorCode_CloudSave_StorageSizeLimitPerClient = 400004, // 用户在该应用下使用存储空间超限
TapSDK_ErrorCode_CloudSave_TotalStorageSizeLimit = 400005, // 用户总使用存储空间超限
TapSDK_ErrorCode_CloudSave_Timeout = 400006, // 请求超时,通常是由于网络卡顿,创建/更新存档耗时过长导致
TapSDK_ErrorCode_CloudSave_ConcurrentCallDisallowed = 400007, // 上传云存档并发调用次数超过 10 个,或者并发更新同一个云存档
TapSDK_ErrorCode_CloudSave_StorageServerError = 400008, // 存储服务故障
TapSDK_ErrorCode_CloudSave_InvalidName = 400009, // 存档名称不合法
TapSDK_ErrorCode_OnlineGame_RequestRateLimitExceeded = 600001, // 请求频率超限
TapSDK_ErrorCode_OnlineGame_MaliciousUser = 600002, // 被认定为恶意用户,拒绝请求或关闭连接。建议不要重连
TapSDK_ErrorCode_OnlineGame_TooManyConnections = 600003, // 因同时连接数过多而被踢下线。建议不要重连,避免互踢,导致重连死循环
TapSDK_ErrorCode_OnlineGame_InvalidAuthorization = 600004, // 认证信息不合法,通常不会发生。如果发生,可以尝试重连
TapSDK_ErrorCode_OnlineGame_Unauthorized = 600005, // 尚未完成建连认证,通常不会发生。如果发生,可以尝试重连
TapSDK_ErrorCode_OnlineGame_AlreadyConnected = 600006, // 已经建连,不能重复建连。Connect成功后,二次调用Connect会返回此错误
TapSDK_ErrorCode_OnlineGame_PreviousRequestInProgress = 600007, // 上一个请求未完成,不接受新的请求
TapSDK_ErrorCode_OnlineGame_NotInRoom = 600009, // 尚未加入房间
TapSDK_ErrorCode_OnlineGame_AlreadyInRoom = 600010, // 已经在房间中,不能重复加入
TapSDK_ErrorCode_OnlineGame_NotRoomOwner = 600011, // 不是房主,不能执行此操作
TapSDK_ErrorCode_OnlineGame_RoomFull = 600012, // 房间已满,不能加入
TapSDK_ErrorCode_OnlineGame_RoomNotExist = 600013, // 房间不存在
TapSDK_ErrorCode_OnlineGame_FrameSyncNotStarted = 600014, // 帧同步未开始,不能执行此操作
TapSDK_ErrorCode_OnlineGame_FrameSyncAlreadyStarted = 600015, // 帧同步已开始,不能 执行此操作
TapSDK_ErrorCode_OnlineGame_FrameInputSizeLimitExceeded = 600016, // 对战帧数据大小超过限制
TapSDK_ErrorCode_OnlineGame_FrameInputCountLimitExceeded = 600017, // 每帧可接受的输入数量超过限制
TapSDK_ErrorCode_OnlineGame_PlayerNotFound = 600018 // 玩家不存在
};
TapSystemState
TapTap 客户端系统状态枚举:
enum {
TapSystemState_Unknown = 0,
// TapTap客户端当前可以正常访问TapTap服务端。
// 开发者收到这个状态通知时,可以解除之前收到TapSystemState_PlatformOffline状态通知时对游戏做的限制。
TapSystemState_PlatformOnline = 1,
// TapTap客户端当前无法访问TapTap服务端:网络异常或者TapTap服务端故障。
// 当TapTap客户端处于这个状态时,无法实时获得游戏/DLC所有权变化通知,比如已退款。
// 开发者收到这个状态通知时,可以提醒玩家检查网络状态,或者做其他游戏限制。
TapSystemState_PlatformOffline = 2,
// TapTap客户端退出。
// 开发者收到这个状态通知时,应该立刻保存游戏存档,然后退出游戏。
TapSystemState_PlatformShutdown = 3,
};
结构体类型
AuthorizeFinishedResponse
授权完成响应结构体:
struct AuthorizeFinishedResponse {
bool is_cancel; // 用户是否取消授权
char error[1024]; // 错误信息
char token_type[32]; // Token 类型
char kid[8*1024]; // Key ID
char mac_key[8*1024]; // MAC 密钥
char mac_algorithm[32]; // MAC 算法
char scope[1024]; // 权限范围
};
GamePlayableStatusChangedResponse
游戏可玩状态变更响应结构体:
struct GamePlayableStatusChangedResponse {
bool is_playable; // 游戏本体是否可玩
};
DLCPlayableStatusChangedResponse
DLC 可玩状态变更响应结构体:
struct DLCPlayableStatusChangedResponse {
char dlc_id[32]; // DLC ID
bool is_playable; // DLC 是否可玩
};
SDK 核心接口
TapSDK_RestartAppIfNecessary
检查是否需要重启应用。
bool TapSDK_RestartAppIfNecessary(const char *clientID);
参数:
clientID:客户端 ID
返回值:
true:需要重启,TapTap 将重新打开游戏,请立即退出游戏进程false:不需要重启,可以继续初始化
使用示例:
const char* clientID = "your_client_id";
if (TapSDK_RestartAppIfNecessary(clientID)) {
std::cout << "需要重启应用" << std::endl;
return 0; // 立即退出
}
注意事项:
- 此函数必须在
TapSDK_Init之前调用 - 如果返回 true,应立即退出程序,等待 TapTap 重启游戏
TapSDK_Init
初始化 SDK。
TapSDK_Init_Result TapSDK_Init(ErrMsg *errMsg, const char *pubKey);
参数:
errMsg:错误信息缓冲区,长度为 1024 字节pubKey:从 TapTap 开发者中心获取的公钥
返回值:
TapSDK_Init_Result:初始化结果枚举
使用示例:
ErrMsg errMsg;
const char* pubKey = "your_public_key";
TapSDK_Init_Result result = TapSDK_Init(&errMsg, pubKey);
switch (result) {
case TapSDK_Init_Result::OK:
std::cout << "初始化成功" << std::endl;
// 建议初始化成功后,立刻注册系统状态变化回调,以便实时获知 TapTap 客户端状态变化。
// 注册后,调用TapSDK_RunCallbacks()会触发回调函数得到当前的系统状态。
// 此后,只有当系统状态发生变化时,才会再次触发回调函数,得到变化后的系统状态。
TapSDK_RegisterCallback(TapEventID::SystemStateChanged, yourSystemStateNotificationHandler);
break;
case TapSDK_Init_Result::NoPlatform:
std::cout << "未找到 TapTap 平台,请下载并安装 TapTap 启动器" << std::endl;
std::cout << "下载地址:https://www.taptap.cn/mobile" << std::endl;
break;
case TapSDK_Init_Result::NotLaunchedByPlatform:
std::cout << "游戏未通过 TapTap 启动器启动,请从启动器重新打开游戏" << std::endl;
break;
case TapSDK_Init_Result::PlatformVersionMismatch:
std::cout << "平台版本不匹配,请升级 TapTap 启动器或游戏到最新版本" << std::endl;
break;
default:
std::cout << "初始化失败: " << errMsg << std::endl;
std::cout << "请关闭游戏,并从 TapTap 重新打开" << std::endl;
break;
}
TapSDK_Shutdown
关闭 SDK,释放资源。
bool TapSDK_Shutdown();
返回值:
true:成功关闭false:关闭失败(通常由于未初始化(未调用 TapSDK_Init)或初始化失败导致)
使用示例:
if (TapSDK_Shutdown()) {
std::cout << "SDK 已成功关闭" << std::endl;
} else {
std::cout << "SDK 关闭失败" << std::endl;
}
TapSDK_GetClientID
获取当前客户端 ID。
bool TapSDK_GetClientID(char *buffer);
参数:
buffer:用于存储客户端 ID 的缓冲区,固定长度 256 字节
返回值:
true:成功获取false:获取失败(通常由于未初始化(未调用 TapSDK_Init)或初始化失败导致)
使用示例:
char clientID[256];
if (TapSDK_GetClientID(clientID)) {
std::cout << "Client ID: " << clientID << std::endl;
} else {
std::cout << "获取 Client ID 失败,请检查 SDK 是否已正确初始化" << std::endl;
}
回调相关功能
内存管理
- 回调函数中的数据指针
data指向的内存由 SDK 管理,调用者无需释放 - 回调函数返回后,SDK 会自动释放该内存,如需长期使用,请自行复制一份
TapSDK_RegisterCallback
注册事件回调。
void TapSDK_RegisterCallback(TapEventID eventID, callback_t callback);
参数:
eventID:事件 IDcallback:回调函数
使用示例:
void T_CALLTYPE OnAuthorizeFinished(TapEventID eventID, void* data) {
if (eventID == TapEventID::AuthorizeFinished) {
AuthorizeFinishedResponse* response = (AuthorizeFinishedResponse*)data;
// 处理授权完成事件
}
}
// 注册回调
TapSDK_RegisterCallback(TapEventID::AuthorizeFinished, OnAuthorizeFinished);
TapSDK_UnregisterCallback
注销事件回调。
void TapSDK_UnregisterCallback(TapEventID eventID, callback_t callback);
参数:
eventID:事件 IDcallback:要注销的回调函数
使用示例:
// 注销回调
TapSDK_UnregisterCallback(TapEventID::AuthorizeFinished, OnAuthorizeFinished);
TapSDK_RunCallbacks
处理回调事件,建议每帧调用。
void TapSDK_RunCallbacks();
使用示例:
// 在游戏主循环中调用
while (gameRunning) {
TapSDK_RunCallbacks(); // 处理 SDK 事件
// 游戏逻辑
UpdateGame();
RenderGame();
Sleep(16); // 控制帧率
}