TapTap排行榜开发指南
本文介绍如何在游戏中加入排行榜系统。
权限说明
- Unity
- Android Java
- Android Kotlin
该模块需要如下权限:
权限 | 使用目的 | 权限申请时机 |
---|---|---|
网络权限 | 用于访问网络数据 | 用户首次使用该功能时会申请权限 |
网络状态权限 | 用于检查网络连接状态(如 Wi-Fi 或移动数据是否可用) | 用户首次使用该功能时会申请权限 |
写入外部存储权限 | 用于保存排行榜分享图片到设备存储 | 用户首次使用分享功能时会申请权限 |
该模块将在应用中添加如下 权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
该模块需要如下权限:
权限 | 使用目的 | 权限申请时机 |
---|---|---|
网络权限 | 用于访问网络数据 | 用户首次使用该功能时会申请权限 |
网络状态权限 | 用于检查网络连接状态(如 Wi-Fi 或移动数据是否可用) | 用户首次使用该功能时会申请权限 |
写入外部存储权限 | 用于保存排行榜分享图片到设备存储 | 用户首次使用分享功能时会申请权限 |
该模块将在应用中添加如下权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
该模块需要如下权限:
权限 | 使用目的 | 权限申请时机 |
---|---|---|
网络权限 | 用于访问网络数据 | 用户首次使用该功能时会申请权限 |
网络状态权限 | 用于检查网络连接状态(如 Wi-Fi 或移动数据是否可用) | 用户首次使用该功能时会申请权限 |
写入外部存储权限 | 用于保存排行榜分享图片到设备存储 | 用户首次使用分享功能时会申请权限 |
该模块将在应用中添加如下权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
集成前准备
参考 准备工作 创建应用、开启排行榜服务。
SDK 获取
由于 TapSDK V4 依赖于 TapTapCore 核心库 以及 TapTapLogin 登录,所以需要在 TapTapCore 的基础上,另外添加 TapTapLeaderboard
、 TapTapLogin
模块:
- Unity
- Android Java
- Android Kotlin
第一步:添加 SDK 所需的外部依赖
SDK 内部使用了部分第三方库,开发者接入时需先确保 SDK 外部依赖库已正常接入,具体设置如下:
- SDK 使用的 JSON 解析库为
Newtonsoft-json
,如果当前工程已接 入该依赖库,则不需额外处理,否则需在Packages/manifest.json
添加如下依赖:
"com.unity.nuget.newtonsoft-json":"3.2.1"
- SDK 使用
com.google.external-dependency-manager
管理 Android、iOS 依赖,如果当前工程已接入该依赖库,则不需额外处理,否则需在Packages/manifest.json
添加如下依赖:
{
"dependencies": {
"com.google.external-dependency-manager": "1.2.179"
},
"scopedRegistries": [
{
"name": "package.openupm.com",
"url": "https://package.openupm.com",
"scopes": [
"com.google.external-dependency-manager"
]
}
]
}
第二步:添加 SDK 依赖
SDK 支持 Unity Package Manager 及本地文件导入两种集成方式,开发者根据需求选择其中一种即可,推荐使用远程依赖。
远程依赖
SDK 支持通过 NPMJS 及 GitHub 两种方式,开发者选择其中一种即可。
1. NPMJS 接入
在项目的 Packages/manifest.json
文件中添加以下依赖:
"dependencies":{
"com.taptap.sdk.core":"4.7.1",
"com.taptap.sdk.login":"4.7.1",
"com.taptap.sdk.leaderboard":"4.7.1",
}
但需要注意的是,需在 Packages/manifest.json
中 dependencies
同级下声明 scopedRegistries
:
"scopedRegistries":[
{
"name": "NPMJS",
"url": "https://registry.npmjs.org/",
"scopes": ["com.taptap"]
}
]
2. GitHub 接入
在项目的 Packages/manifest.json
文件中添加以下依赖:
"dependencies":{
"com.taptap.sdk.core":"https://github.com/taptap/TapSDKCore-Unity.git#4.7.1",
"com.taptap.sdk.login":"https://github.com/taptap/TapSDKLogin-Unity.git#4.7.1",
"com.taptap.sdk.leaderboard":"https://github.com/taptap/TapSDKLeaderboard-Unity.git#4.7.1",
}
在 Unity 顶部菜单中选择 Window > Package Manager 可查看已经安装在项目中的包。
本地文件导入
- 在 下载页 下载下列模块对应
unitypackage
文件,并在 Unity 项目中依次通过 Assets > Import Packages > Custom Packages 进行导入,包括:
TapSDK_Core.unitypackage
TapTapSDK 核心模块,必选。TapSDK_Login.unitypackage
TapTapSDK 登录模块,必选。TapSDK_Leaderboard.unitypackage
TapTapSDK 排行榜模块,必选。
- 如果当前项目已集成
Newtonsoft.Json
依赖,则忽略该步骤,否则在NuGet.org
Newtonsoft.Json 页面中通过点击右侧 「Download package」 下载库文件,并将下载的文件后缀从.nupkg
修改为.zip
,同时解压该文件并复制内部的Newtonsoft.Json.dll
文件拷贝到工程Assets
的Plugins
目录下,另外为了避免导出 IL2CPP 平台时删除必要数据,需在Assets
目录下创建link.xml
文件(如果已有该文件,则添加如下内容),其内容如下:
<linker>
<assembly fullname="System.Core">
<type fullname="System.Linq.Expressions.Interpreter.LightLambda" preserve="all" />
</assembly>
</linker>
- 项目根目录的 build.gradle 添加仓库地址:
allprojects {
repositories {
google()
mavenCentral()
}
}
- app module 的 build.gradle 添加对应依赖:
dependencies {
implementation 'com.taptap.sdk:tap-core:4.7.0'
implementation 'com.taptap.sdk:tap-leaderboard-androidx:4.7.0'
implementation 'com.taptap.sdk:tap-login:4.7.0'
}
- 项目根目录的 build.gradle 添加仓库地址:
allprojects {
repositories {
google()
mavenCentral()
}
}
- app module 的 build.gradle 添加对应依赖:
dependencies {
implementation 'com.taptap.sdk:tap-core:4.7.0'
implementation 'com.taptap.sdk:tap-login:4.7.0'
implementation 'com.taptap.sdk:tap-leaderboard-androidx:4.7.0'
}
SDK 初始化
详见 TapTapSDK 初始化文档。
- Unity
- Android Java
- Android Kotlin
TapTapSdkOptions
详细参数见 入门指南#快速开始
using TapSDK.Core;
using TapSDK.Leaderboard
// 核心配置 详细参数见 [TapTapSDK]
TapTapSdkOptions coreOptions = new TapTapSdkOptions();
// 设置屏幕方向:0-竖屏 1-横屏
coreOptions.screenOrientation = 1;
// TapSDK 初始化
TapTapSDK.Init(coreOptions, otherOptions);
TapTapSdkOptions
详细参数见 入门指南#快速开始
import com.taptap.sdk.core.TapTapRegion;
import com.taptap.sdk.core.TapTapSdk;
import com.taptap.sdk.core.TapTapSdkOptions;
/* 必选配置 */
// 开发者中心对应 Client ID
String clientId = "";
// 开发者中心对应 Client Token
String clientToken = "";
// 是否开启 log,建议 Debug 开启,Release 关闭,默认关闭 log
boolean enableLog = BuildConfig.DEBUG;
// 屏幕方向,横屏传ScreenOrientation.LANDSCAPE 竖屏传ScreenOrientation.PORTRAIT
int screenOrientation = ScreenOrientation.LANDSCAPE;
TapTapSdkOptions tapSdkOptions = new TapTapSdkOptions(
clientId, // 游戏 Client ID
clientToken, // 游戏 Client Token
TapTapRegion.CN // 游戏可玩区域: [TapTapRegion.CN]=国内 [TapTapRegion.GLOBAL]= 海外
);
// 设置屏幕方向
tapSdkOptions.setScreenOrientation(screenOrientation);
tapSdkOptions.setEnableLog(enableLog);
// 初始化 TapSDK
TapTapSdk.init(context, tapSdkOptions);
import com.taptap.sdk.core.TapTapSdk
import com.taptap.sdk.core.TapTapSdkOptions
import com.taptap.sdk.core.TapTapLanguage
import com.taptap.sdk.core.TapTapRegion
/* 必选配置 */
// 开发者中心对应 Client ID
val clientId = "";
// 开发者中心对应 Client Token
val clientToken = "";
// 是否开启 log,建议 Debug 开启,Release 关闭,默认关闭 log
val enableLog = BuildConfig.DEBUG;
// 屏幕方向,横屏传ScreenOrientation.LANDSCAPE 竖屏传ScreenOrientation.PORTRAIT
val screenOrientation = ScreenOrientation.LANDSCAPE
TapTapSdk.init(
context = context,
sdkOptions = TapTapSdkOptions(
clientId = clientId,
clientToken = clientToken,
region = TapTapRegion.CN,
screenOrientation = screenOrientation,
preferredLanguage = TapTapLanguage.ZH_HANS,
enableLog = false
)
)
注册排行榜事件回调
排行榜 SDK 提供事件回调接口,用于处理排行榜相关事件,如用户未登录等状态。
- Unity
- Android Java
- Android Kotlin
using TapSDK.Leaderboard
LeaderboardCallback callback = new LeaderboardCallback();
TapTapLeaderboard.RegisterLeaderboardCallback(callback);
TapTapLeaderboard.UnregisterLeaderboardCallback(callback);
class LeaderboardCallback : ITapTapLeaderboardCallback
{
public LeaderboardCallback(){}
public void OnLeaderboardResult(int code, string message)
{
// 处理排行榜 SDK 的状态码
// 500102:需要登录
}
}
import com.taptap.sdk.leaderboard.androidx.TapLeaderboard;
import com.taptap.sdk.leaderboard.callback.TapTapLeaderboardCallback;
// 注册排行榜事件回调
TapTapLeaderboardCallback callback = new TapTapLeaderboardCallback() {
@Override
public void onLeaderboardResult(int code, String message) {
// 处理排行榜事件
switch (code) {
case 500102:
// 用户 未登录,需要引导用户登录
// showLoginDialog();
break;
// 处理其他事件
default:
Log.d("Leaderboard", "code: " + code + ", message: " + message);
break;
}
}
};
TapTapLeaderboard.registerLeaderboardCallback(callback);
TapTapLeaderboard.unregisterLeaderboardCallback(callback);
import com.taptap.sdk.leaderboard.androidx.TapLeaderboard
import com.taptap.sdk.leaderboard.callback.TapTapLeaderboardCallback
// 注册排行榜事件回调
TapTapLeaderboard.registerLeaderboardCallback(
callback = object : TapTapLeaderboardCallback {
override fun onLeaderboardResult(code: Int, message: String) {
// 处理排行榜事件
when (code) {
500102 -> {
// 用户未登录,需要引导用户登录
// showLoginDialog()
}
// 处理其他事件
else -> {
Log.d("Leaderboard", "code: $code, message: $message")
}
}
}
}
)
// 取消注册回调
TapTapLeaderboard.unregisterLeaderboardCallback(callback = callback)
设置分享功能
设置分享回调后,排行榜H5页面会显示分享按钮,用户点击分享按钮后,排行榜截图会保存到本地,并触发分享成功回调。开发者可以根据自己的需要判断是否实现分享失败的回调方法。
- Unity
- Android Java
- Android Kotlin
using TapSDK.Leaderboard
// 设置分享回调
var shareCallback = new LeaderboardShareCallback
{
OnShareSuccessAction = (localPath) =>
{
// 处理排行榜分享图片保存成功
// localPath 为本地图片路径,可用于分享到系统
},
OnShareFailedAction = (error) =>
{
// 处理分享失败(可选实现)
// 开发者可以根据需要选择是否实现此方法
}
};
TapTapLeaderboard.SetShareCallback(shareCallback);
配置 FileProvider
在 Android 平台,为了正确获取分享图片的路径,需要配置 FileProvider。
- 在
AndroidManifest.xml
中添加 FileProvider 配置:
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
- 在
res/xml
目录下创建file_paths.xml
文件(如果不存在则创建),内容如下:
<?xml version="1.0" encoding="utf-8"?>
<paths>
<!-- 允许访问应用私有目录下的 files/shared_images/ -->
<files-path name="shared_images" path="shared_images/" />
</paths>
设置分享回调
import com.taptap.sdk.leaderboard.androidx.TapLeaderboard;
import com.taptap.sdk.leaderboard.callback.TapTapLeaderboardShareCallback;
// 设置分享回调
TapTapLeaderboard.setShareCallback(new TapTapLeaderboardShareCallback() {
@Override
public void onShareSuccess(String localPath) {
// 处理排行榜分享图片保存成功
// localPath 为本地图片路径,可用于分享到系统
// shareImageToSystem(localPath);
}
@Override
public void onShareFailed(Throwable error) {
// 处理分享失败(可选实现)
// 开发者可以根据需要选择是否实现此方法
Log.e("Leaderboard", "分享失败", error);
}
});
配置 FileProvider
在 Android 平台,为了正确获取分享图片的路径,需要配置 FileProvider。
- 在
AndroidManifest.xml
中添加 FileProvider 配置:
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
- 在
res/xml
目录下创建file_paths.xml
文件(如果不存在则创建),内容如下:
<?xml version="1.0" encoding="utf-8"?>
<paths>
<!-- 允许访问应用私有目录下的 files/shared_images/ -->
<files-path name="shared_images" path="shared_images/" />
</paths>
设置分享回调
import com.taptap.sdk.leaderboard.androidx.TapLeaderboard
// 设置分享回调
TapTapLeaderboard.setShareCallback(object : TapTapLeaderboardShareCallback {
override fun onShareSuccess(localPath: String) {
// 处理排行榜分享图片保存成功
// localPath 为本地图片路径,可用于分享到系统
// shareImageToSystem(localPath)
}
override fun onShareFailed(error: Throwable) {
// 处理分享失败(可选实现)
// 开发者可以根据需要选择是否实现此方法
Log.e("Leaderboard", "分享失败", error)
}
})
打开排行榜页面
打开排行榜H5页面对话框,支持总榜和好友榜两种类型。
- Unity
- Android Java
- Android Kotlin
using TapSDK.Leaderboard
string leaderboardId = "your_leaderboard_id";
// 打开总榜
TapTapLeaderboard.OpenLeaderboard(leaderboardId, "public");
// 打开好友榜
TapTapLeaderboard.OpenLeaderboard(leaderboardId, "friends");
import com.taptap.sdk.leaderboard.androidx.TapLeaderboard;
// 打开总榜
String leaderboardId = "your_leaderboard_id";
String collection = "public";
TapTapLeaderboard.openLeaderboard(
this, // Activity
leaderboardId,
collection
);
// 打开好友榜
TapTapLeaderboard.openLeaderboard(
this, // Activity
"your_leaderboard_id",
"friends"
);
import com.taptap.sdk.leaderboard.androidx.TapLeaderboard
// 打开总榜
val leaderboardId = "your_leaderboard_id"
val collection = "public"
TapTapLeaderboard.openLeaderboard(
activity = this, // Activity
leaderboardId = leaderboardId,
collection = collection
)
// 打开好友榜
TapTapLeaderboard.openLeaderboard(
activity = this, // Activity
leaderboardId = "your_leaderboard_id",
collection = "friends"
)
打开用户个人资料
展示指定用户的个人资料对话框,传入用户的openId。
- Unity
- Android Java
- Android Kotlin
using TapSDK.Leaderboard;
// 打开用户个人资料
string openId = "user_open_id"; // 用户的OpenID
string unionId = ""; // 用户的UnionID
TapTapLeaderboard.ShowTapUserProfile(openId, unionId);
import com.taptap.sdk.leaderboard.androidx.TapLeaderboard;
// openId unionId二选一即可
String openId = "user_open_id";
String unionId = "";
TapTapLeaderboard.showTapUserProfile(
this, // Activity
openId,
unionId
);
import com.taptap.sdk.leaderboard.androidx.TapLeaderboard
// openId unionId二选一即可
val openId = "user_open_id"
val unionId = ""
TapTapLeaderboard.showTapUserProfile(
activity = this, // Activity
openId = openId,
unionId = unionId
)
提交分数
批量提交用户排行榜分数,一次最多提交5个分数。
- Unity
- Android Java
- Android Kotlin
using System.Collections.Generic;
using TapSDK.Leaderboard
// 单个分数提交
var singleScore = new List<SubmitScoresRequest.ScoreItem>
{
new SubmitScoresRequest.ScoreItem
{
LeaderboardId = "your_leaderboard_id",
Score = 1000
}
};
// 批量分数提交(最多5个)
var multipleScores = new List<SubmitScoresRequest.ScoreItem>
{
new SubmitScoresRequest.ScoreItem
{
LeaderboardId = "leaderboard_1",
Score = 1000
},
new SubmitScoresRequest.ScoreItem
{
LeaderboardId = "leaderboard_2",
Score = 2000
}
};
// 提交分数并处理回调
var callback = new TapTapLeaderboardResponseCallback<SubmitScoresResponse>
{
OnSuccessAction = (result) => {
// 提交成功
},
OnFailureAction = (code, message) => {
// 提交失败
}
};
TapTapLeaderboard.SubmitScores(singleScore, callback);
import com.taptap.sdk.leaderboard.androidx.TapLeaderboard;
import com.taptap.sdk.leaderboard.callback.TapTapLeaderboardResponseCallback;
import com.taptap.sdk.leaderboard.data.request.SubmitScoresRequest;
import com.taptap.sdk.leaderboard.data.response.SubmitScoresResponse;
import java.util.Arrays;
import java.util.List;
List<SubmitScoresRequest.ScoreItem> scores = Arrays.asList(
new SubmitScoresRequest.ScoreItem("leaderboard_1", 1000L),
new SubmitScoresRequest.ScoreItem("leaderboard_2", 2000L)
);
TapTapLeaderboard.submitScores(
scores,
new TapTapLeaderboardResponseCallback<SubmitScoresResponse>() {
@Override
public void onSuccess(SubmitScoresResponse data) {
// 提交成功
Log.d("Leaderboard", "提交成功: " + data);
}
@Override
public void onFailure(int code, String message) {
// 提交失败
Log.e("Leaderboard", "提交失败: code=" + code + ", message=" + message);
}
}
);
import com.taptap.sdk.leaderboard.androidx.TapLeaderboard
import com.taptap.sdk.leaderboard.callback.TapTapLeaderboardResponseCallback
import com.taptap.sdk.leaderboard.data.request.SubmitScoresRequest
import com.taptap.sdk.leaderboard.data.response.SubmitScoresResponse
val scores = listOf(
SubmitScoresRequest.ScoreItem("leaderboard_1", 1000),
SubmitScoresRequest.ScoreItem("leaderboard_2", 2000)
)
TapTapLeaderboard.submitScores(
scores = scores,
callback = object : TapTapLeaderboardResponseCallback<SubmitScoresResponse> {
override fun onSuccess(data: SubmitScoresResponse) {
// 提交成功
Log.d("Leaderboard", "提交成功: $data")
}
override fun onFailure(code: Int, message: String) {
// 提交失败
Log.e("Leaderboard", "提交失败: code=$code, message=$message")
}
}
)
获取排行榜数据
分页获取排行榜数据,支持总榜和好友榜。
- Unity
- Android Java
- Android Kotlin
using TapSDK.Leaderboard
// 获取排行榜数据
string leaderboardId = "your_leaderboard_id";
string leaderboardCollection = "public"; // 总榜,使用"friends"获取好友榜
string nextPageToken = null; // 首次请求传null,加载更多时传上次请求返回的nextPage
string periodToken = null; // 时间周期标识,默认为当前周期
var callback = new TapTapLeaderboardResponseCallback<LeaderboardScoreResponse>
{
OnSuccessAction = (scores) =>
{
// 获取成功
// 保存分页标识用于加载更多数据
nextPageToken = scores.nextPage;
// 处理分数数据
if (scores.scores != null)
{
// 处理排行榜数据
}
},
OnFailureAction = (code, message) =>
{
// 获取失败
}
};
TapTapLeaderboard.LoadLeaderboardScores(
leaderboardId,
leaderboardCollection,
nextPageToken,
periodToken,
callback
);
import com.taptap.sdk.leaderboard.androidx.TapLeaderboard;
import com.taptap.sdk.leaderboard.data.request.LeaderboardCollection;
import com.taptap.sdk.leaderboard.callback.TapTapLeaderboardResponseCallback;
import com.taptap.sdk.leaderboard.data.response.LeaderboardScoresResponse;
TapTapLeaderboard.loadLeaderboardScores(
"your_leaderboard_id", // 排行榜ID
null, // nextPage - 首次请求传null
LeaderboardCollection.PUBLIC, // 总榜
null, // periodToken - 时间周期标识
new TapTapLeaderboardResponseCallback<LeaderboardScoresResponse>() {
@Override
public void onSuccess(LeaderboardScoresResponse data) {
// 获取成功
List<Score> scores = data.getScores();
String nextPage = data.getNextPage(); // 用于下一页请求
}
@Override
public void onFailure(int code, String message) {
// 获取失败
Log.e("Leaderboard", "获取排行榜数据失败: code=" + code + ", message=" + message);
}
}
);
import com.taptap.sdk.leaderboard.androidx.TapLeaderboard
import com.taptap.sdk.leaderboard.data.request.LeaderboardCollection
import com.taptap.sdk.leaderboard.callback.TapTapLeaderboardResponseCallback
import com.taptap.sdk.leaderboard.data.response.LeaderboardScoresResponse
TapTapLeaderboard.loadLeaderboardScores(
leaderboardId = "your_leaderboard_id", // 排行榜ID
nextPage = null, // 首次请求传null
leaderboardCollection = LeaderboardCollection.PUBLIC, // 总榜
periodToken = null, // 时间周期标识
callback = object : TapTapLeaderboardResponseCallback<LeaderboardScoresResponse> {
override fun onSuccess(data: LeaderboardScoresResponse) {
// 获取成功
val scores = data.scores
val nextPage = data.nextPage // 用于下一页请求
}
override fun onFailure(code: Int, message: String) {
// 获取失败
Log.e("Leaderboard", "获取排行榜数据失败: code=$code, message=$message")
}
}
)
获取当前用户分数
获取当前登录用户在指定排行榜的分数和排名。
- Unity
- Android Java
- Android Kotlin
using TapSDK.Leaderboard
// 获取当前用户分数
string leaderboardId = "your_leaderboard_id";
string leaderboardCollection = "public"; // 总榜,使用"friends"获取好友榜
string periodToken = null; // 时间周期标识,默认为当前周期
var callback = new TapTapLeaderboardResponseCallback<UserScoreResponse>
{
OnSuccessAction = (result) =>
{
// 获取成功
if (result.currentUserScore != null)
{
var userScore = result.currentUserScore;
// 处理用户分数和排名
}
},
OnFailureAction = (code, message) =>
{
// 获取失败
}
};
TapTapLeaderboard.LoadCurrentPlayerLeaderboardScore(
leaderboardId,
leaderboardCollection,
periodToken,
callback
);
import com.taptap.sdk.leaderboard.androidx.TapLeaderboard;
import com.taptap.sdk.leaderboard.data.request.LeaderboardCollection;
import com.taptap.sdk.leaderboard.callback.TapTapLeaderboardResponseCallback;
import com.taptap.sdk.leaderboard.data.response.UserScoreResponse;
TapTapLeaderboard.loadCurrentPlayerLeaderboardScore(
"your_leaderboard_id", // 排行榜ID
LeaderboardCollection.PUBLIC, // 总榜
null, // periodToken - 时间周期标识
new TapTapLeaderboardResponseCallback<UserScoreResponse>() {
@Override
public void onSuccess(UserScoreResponse data) {
// 获取成功
Score score = data.getCurrentUserScore();
Log.d("Leaderboard", "用户分数: " + score);
}
@Override
public void onFailure(int code, String message) {
// 获取失败
Log.e("Leaderboard", "获取用户分数失败: code=" + code + ", message=" + message);
}
}
);
import com.taptap.sdk.leaderboard.androidx.TapLeaderboard
import com.taptap.sdk.leaderboard.data.request.LeaderboardCollection
import com.taptap.sdk.leaderboard.callback.TapTapLeaderboardResponseCallback
import com.taptap.sdk.leaderboard.data.response.UserScoreResponse
TapTapLeaderboard.loadCurrentPlayerLeaderboardScore(
leaderboardId = "your_leaderboard_id", // 排行榜ID
leaderboardCollection = LeaderboardCollection.PUBLIC, // 总榜
periodToken = null, // 时间周期标识
callback = object : TapTapLeaderboardResponseCallback<UserScoreResponse> {
override fun onSuccess(data: UserScoreResponse) {
// 获取成功
val score = data.currentUserScore
Log.d("Leaderboard", "用户分数: $score")
}
override fun onFailure(code: Int, message: String) {
// 获取失败
Log.e("Leaderboard", "获取用户分数失败: code=$code, message=$message")
}
}
)
获取用户相近分数
查询当前用户相近的其他用户成绩(上下X位)。
- Unity
- Android Java
- Android Kotlin
using TapSDK.Leaderboard
// 获取用户相近分数
string leaderboardId = "your_leaderboard_id";
string leaderboardCollection = "friends"; // 好友榜
string periodToken = "weekly"; // 时间周期标识
int? maxCount = 10; // 最大返回数量
var callback = new TapTapLeaderboardResponseCallback<LeaderboardScoreResponse>
{
OnSuccessAction = (result) =>
{
// 获取成功
if (result.scores != null)
{
// 处理相近用户分数数据
}
},
OnFailureAction = (code, message) =>
{
// 获取失败
}
};
TapTapLeaderboard.LoadPlayerCenteredScores(
leaderboardId,
leaderboardCollection,
periodToken,
maxCount,
callback
);
import com.taptap.sdk.leaderboard.androidx.TapLeaderboard;
import com.taptap.sdk.leaderboard.data.request.LeaderboardCollection;
import com.taptap.sdk.leaderboard.callback.TapTapLeaderboardResponseCallback;
import com.taptap.sdk.leaderboard.data.response.LeaderboardScoresResponse;
TapTapLeaderboard.loadPlayerCenteredScores(
"your_leaderboard_id", // 排行榜ID
LeaderboardCollection.FRIENDS, // 好友榜
"weekly", // periodToken - 时间周期标识
10, // maxCount - 最大返回数量
new TapTapLeaderboardResponseCallback<LeaderboardScoresResponse>() {
@Override
public void onSuccess(LeaderboardScoresResponse data) {
// 获取成功
List<Score> scores = data.getScores();
Log.d("Leaderboard", "相近用户数量: " + scores.size());
}
@Override
public void onFailure(int code, String message) {
// 获取失败
Log.e("Leaderboard", "获取相近分数失败: code=" + code + ", message=" + message);
}
}
);
import com.taptap.sdk.leaderboard.androidx.TapLeaderboard
import com.taptap.sdk.leaderboard.data.request.LeaderboardCollection
import com.taptap.sdk.leaderboard.callback.TapTapLeaderboardResponseCallback
import com.taptap.sdk.leaderboard.data.response.LeaderboardScoresResponse
TapTapLeaderboard.loadPlayerCenteredScores(
leaderBoardId = "your_leaderboard_id", // 排行榜ID
leaderboardCollection = LeaderboardCollection.FRIENDS, // 好友榜
periodToken = "weekly", // 时间周期标识
maxCount = 10, // 最大返回数量
callback = object : TapTapLeaderboardResponseCallback<LeaderboardScoresResponse> {
override fun onSuccess(data: LeaderboardScoresResponse) {
// 获取成功
val scores = data.scores
Log.d("Leaderboard", "相近用户数量: ${scores?.size}")
}
override fun onFailure(code: Int, message: String) {
// 获取失败
Log.e("Leaderboard", "获取相近分数失败: code=$code, message=$message")
}
}
)
错误处理
排行榜 SDK 的所有异步操作都通过 TapTapLeaderboardResponseCallback
返回结果,开发者需要在 onFailure
方法中处理错误情况。
错误码说明
错误码 | 错误类型 | 描述 |
---|---|---|
500000 | 排行榜周期已过期 | 提示用户排行榜周期已结束,引导查看其他周期 |
500001 | 排行榜 ID 未找到 | 检查排行榜ID是否正确,提示用户排行榜不存在 |
500002 | 排行榜参数错误 | leaderboard_id 与 client_id 不匹配 |
500101 | 当前用户未授权获取此产品(服务) | 提示用户权限不足,联系管理员 |
500102 | 用户未登录 | 引导用户登录 |
500199 | 未知错误 | 通用错误处理,建议重试或联系技术支持 |
错误处理示例
- Unity
- Android Java
- Android Kotlin
using TapSDK.Leaderboard
var callback = new TapTapLeaderboardResponseCallback<LeaderboardScoreResponse>
{
OnSuccessAction = (data) =>
{
// 处理成功结果
},
OnFailureAction = (code, message) =>
{
// 根据错误码处理不同的错误情况
switch (code)
{
case 500000:
// 排行榜周期已过期
break;
case 500001:
// 排行榜 ID 未找到
break;
case 500002:
// 排行榜参数错误
break;
case 500101:
// 用户未授权
break;
case 500102:
// 用户未登录
break;
case 500199:
// 未知错误
break;
default:
// 其他错误
break;
}
}
};
// 示例:获取排行榜数据
TapTapLeaderboard.LoadLeaderboardScores(
"your_leaderboard_id",
"public",
null,
null,
callback
);
new TapTapLeaderboardResponseCallback<LeaderboardScoresResponse>() {
@Override
public void onSuccess(LeaderboardScoresResponse data) {
// 处理成功结果
}
@Override
public void onFailure(int code, String message) {
// 根据错误码处理不同的错误情况
switch (code) {
case 500000:
// 排行榜周期已过期
// showMessage("排行榜周期已结束,请查看其他周期排行榜");
break;
case 500001:
// 排行榜 ID 未找到
// showMessage("排行榜不存在,请检查排行榜ID");
break;
case 500002:
// 排行榜参数错误
// showMessage("参数错误,请检查输入参数");
break;
case 500101:
// 用户未授权
// showMessage("权限不足,请联系管理员");
break;
case 500102:
// 用户未登录
// showMessage("请先登录");
// redirectToLogin();
break;
case 500199:
// 未知错误
// showMessage("未知错误,请稍后重试");
break;
default:
// 其他错误
// showMessage("操作失败: " + message);
break;
}
}
}
object : TapTapLeaderboardResponseCallback<LeaderboardScoresResponse> {
override fun onSuccess(data: LeaderboardScoresResponse) {
// 处理成功结果
}
override fun onFailure(code: Int, message: String) {
// 根据错误码处理不同的错误情况
when (code) {
500000 -> {
// 排行榜周期已过期
// showMessage("排行榜周期已结束,请查看其他周期排行榜")
}
500001 -> {
// 排行榜 ID 未找到
// showMessage("排行榜不存在,请检查排行榜ID")
}
500002 -> {
// 排行榜参数错误
// showMessage("参数错误,请检查输入参数")
}
500101 -> {
// 用户未授权
// showMessage("权限不足,请联系管理员")
}
500102 -> {
// 用户未登录
// showMessage("请先登录")
// redirectToLogin()
}
500199 -> {
// 未知错误
// showMessage("未知错误,请稍后重试")
}
else -> {
// 其他错误
// showMessage("操作失败: $message")
}
}
}
}
最佳实践
1. 内存管理
记得在适当的时机取消注册回调,避免内存泄漏:
- Unity
- Android Java
- Android Kotlin
using TapSDK.Leaderboard
LeaderboardCallback callback = new LeaderboardCallback();
TapTapLeaderboard.RegisterLeaderboardCallback(callback);
TapTapLeaderboard.UnregisterLeaderboardCallback(callback);
class LeaderboardCallback : ITapTapLeaderboardCallback
{
public LeaderboardCallback(){}
public void OnLeaderboardResult(int code, string message)
{
// 处理排行榜 SDK 的状态码
// 500102:需要登录
}
}
@Override
protected void onDestroy() {
super.onDestroy();
// 取消注册回调
TapTapLeaderboard.unregisterLeaderboardCallback(callback);
}
override fun onDestroy() {
super.onDestroy()
// 取消注册回调
TapTapLeaderboard.unregisterLeaderboardCallback(callback)
}
2. 用户登录检测
在使用排行榜功能前,建议先检查用户登录状态:
- Unity
- Android Java
- Android Kotlin
using TapSDK.Leaderboard
// 排行榜回调处理
var leaderboardCallback = new LeaderboardCallback();
TapTapLeaderboard.RegisterLeaderboardCallback(leaderboardCallback);
TapTapLeaderboard.UnregisterLeaderboardCallback(leaderboardCallback);
class LeaderboardCallback : ITapTapLeaderboardCallback
{
public void OnLeaderboardResult(int code, string message)
{
switch (code)
{
case 500102:
// 引导用户登录
break;
}
}
}
// 在排行榜回调中处理未登录状态
TapLeaderboardCallback callback = new TapLeaderboardCallback() {
@Override
public void onLeaderboardResult(int code, String message) {
if (code == 500102) {
// 引导用户登录
}
}
};
// 在排行榜回调中处理未登录状态
val callback = object : TapTapLeaderboardCallback {
override fun onLeaderboardResult(code: Int, message: String) {
when (code) {
500102 -> {
// 引导用户登录
}
}
}
}