感谢您的反馈!
功能介绍
如小游戏没有服务器,那么可以通过开放平台提供的云存档功能对游戏进度、资产数据进行存档,解决无服务器游戏换手机后无存档的问题,保障用户体验。由于原先的云存档能力不支持高性能容器,目前淘宝平台对云存档能力进行了升级,新能力支持普通容器与高性能容器。
有服务器的游戏,优先建议自己实现存档能力,将存档数据保存在自己的服务器上。请确保支持玩家换手机后仍然有存档,且不允许将用户的存档数据存放在本地。
注意:
1)接入旧版云存档能力的游戏无需强制升级,旧版能力在普通容器仍然能够使用。
2)本文档为未接入过旧版云存档能力的新游戏提供接入指引,不涉及到能力升级、数据迁移;如已经接入旧版云存档,希望进行存档能力升级,请参考云存档(存量游戏)。
每个openid所标识的微信用户在每个游戏上托管的数据不能超过128个key-value对。
上报的key-value列表当中每一项的key+value长度都不能超过1K(1024)字节。
上报的key-value列表当中每一个key长度都不能超过128字节。
接入云存档前,请在控制台-小游戏开发-小游戏开发权限中,申请小游戏云存档能力(新)权限包。
确认获得权限包后,可以在小游戏开发-小游戏云存档中,查看存储下来的数据。
基础回调参数类型,用于定义接口请求的回调函数。
export type TBaseParams<T = void> = { complete (): void; // 请求完成后的回调,无论成功或失败 success(data: T): void; // 请求成功时的回调 fail (err: any): void; // 请求失败时的回调 {errorCode: string;errorMessage: string;extra?: any;} };
表示键值对数据的类型。
export type KVData = { key: string; // 键名 value: string | number ; // 对应的值 };
KVData 类型的数组。
export type TKVDataList = KVData[];
键名的字符串数组。
export type TKeyList = string[];
async init(params: TInitParams)
export type TInitParams = { env: 'online' | 'test'; };
env:online代表正式环境,test代表测试环境。
async getUserCloudStorageKeys(params: TGetStorageKeys): Promise<void>;
export type TGetStorageKeys = TBaseParams<{ keys: TKeyList }>;
错误码 |
说明 |
SDK_PARAMS_ERROR |
params未设置 |
async getUserCloudStorage(params: TGetStorageParams): Promise<void>;
请求参数包括一个键列表和基础回调参数。
export type TGetStorageParams = { keyList: TKeyList } & TBaseParams<{ KVDataList: TKVDataList}>;
错误码 |
说明 |
SDK_PARAMS_ERROR |
params未设置 |
async setUserCloudStorage(params: TSetStorageParams): Promise<void>;
请求参数包括键值对列表和基础回调参数。
export type TSetStorageParams = { KVDataList: TKVDataList } & TBaseParams;
错误码 |
说明 |
SDK_PARAMS_ERROR |
params未设置 |
同一个用户同一个游戏中,同时进行set操作会抛出抢锁失败异常,一般重试即可解决。对于抢锁失败异常,游戏必须进行异常处理,避免出现丢档情况。
建议:
1)当同一个用户对同一个游戏发起多个set接口请求时,在上一次接口返回之后再发起新请求。
2)为保证系统性能、优化用户体验并节约服务器资源,所有客户端状态上报(set请求)请遵循“关键状态驱动”原则。不建议基于固定时间间隔(Polling)或无差别事件触发的冗余上报。
async removeUserCloudStorage(params: TRemoveStorageParams): Promise<void>;
请求参数包括一个键列表和基础回调参数。
export type TRemoveStorageParams = { keyList: TKeyList } & TBaseParams;
错误码 |
说明 |
SDK_PARAMS_ERROR |
params未设置 |
keyList为空或者长度为0 |
错误码 |
说明 |
SDK_REQUEST_RESULT_FAILED_ERROR |
xxx请求失败。 |
const sdk = my.tb.getInteractiveSDK(); const newCloud = sdk.getCloudStorageController(); // 初始化 try { newCloud.init({ env: 'online' }); } catch (error) { console.error(error); } if (newCloud) { newCloud.setUserCloudStorage({ KVDataList: [ { key: 'cnTime', value: 'test', } ], success: (res) => { console.log('云存档 设置数据成功', res); }, fail: (err) => { console.log('云存档 设置数据失败', err); }, complete: (res) => { console.log('云存档 设置数据完成', res); } }); newCloud.getUserCloudStorageKeys({ success: (res) => { console.log('云存档 获取全部key成功', res); }, fail: (err) => { console.log('云存档 获取全部key失败', err); }, complete: (res) => { console.log('云存档 获取全部key完成', res); } }); newCloud.getUserCloudStorage({ keyList: ['cnTime'], success: (res) => { console.log('云存档 获取数据成功', res); }, fail: (err) => { console.log('云存档 获取数据失败', err); }, complete: (res) => { console.log('云存档 获取数据完成', res); } }); newCloud.removeUserCloudStorage({ keyList: ['cnTime'], success: (res) => { console.log('云存档 删除数据成功', res); }, fail: (err) => { console.log('云存档 删除数据失败', err); }, complete: (res) => { console.log('云存档 删除数据完成', res); } }); // setUserCloudStorage 接口重试参考代码 const MAX_RETRIES = 3; // 最大重试次数 const INITIAL_DELAY = 1000; // 初始重试延迟(毫秒) const setCloudStorageWithRetry = (retryCount = 0) => { newCloud.setUserCloudStorage({ KVDataList: [{ key: 'cnTime', value: 'test' }], success: (res) => { console.log('云存档 设置数据成功', res); }, fail: (err) => { if (retryCount < MAX_RETRIES) { const delay = INITIAL_DELAY * Math.pow(2, retryCount); console.warn(`云存档 设置失败,${delay}ms后第${retryCount + 1}次重试...`, err); setTimeout(() => { setCloudStorageWithRetry(retryCount + 1); }, delay); } else { console.error('云存档 设置数据失败,已达最大重试次数', err); } }, complete: (res) => { console.log('云存档 设置数据完成', res); } }); }; setCloudStorageWithRetry(); }