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 *); // 回调函数类型
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, // 获取云存档封面
};
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, // 存档名称不合法
};
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; // 立即退出
}