公告指南
接入 TDS 公告服务 SDK 之前,请参考《功能介绍》文档完成服务开通、域名配置。
SDK 配置
可以在 下载页 获得 TapSDK,引入公告模块。
- Unity
- Android
- iOS
- UE4
Unity 模块是通过引入 iOS 和 Android 模块后增加桥接文件打包出的 .unitypackage
,方便以 Unity 开发的游戏直接引入。其他引擎/平台的游戏可以通过 iOS/Android 原生的方式接入,详见 iOS/Android 接入文档。
Unity 开发环境要求:Unity 2019.4 或更高版本
支持版本:
- Android:最低支持 5.0
- iOS:最低支持 iOS 10.0
"dependencies":{
"com.taptap.tds.billboard": "https://github.com/TapTap/TapBillboard-Unity.git#3.18.2",
"com.taptap.tds.common": "https://github.com/TapTap/TapCommon-Unity.git#3.18.2",
}
repositories{
flatDir {
dirs 'libs'
}
}
dependencies {
implementation (name:'TapBillboard_3.18.2', ext:'aar') // TapTap 公告系统
implementation (name:'TapCommon_3.18.2', ext:'aar')
}
// 公告系统
TapBillboardResource.bundle
TapCommonResource.bundle
TapBillboardSDK.framework
TapCommonSDK.framework
安装插件
- 下载 TapSDK UE4,TapSDK-UE4-xxx.zip 解压后将
TapCommon
、TapBillboard
文件夹 Copy 到项目的Plugins
目录中 - 重启 Unreal Editor
- 打开 编辑 > 插件 > 项目 > TapTap,开启
TapBillboard
模块
添加依赖
在 Project.Build.cs 中添加所需模块:
PublicDependencyModuleNames.AddRange(new string[] {
// ... ... 添加你依赖的其它模块
"TapCommon",
"TapBillboard"
});
导入头文件
#include "TapBillboardModule.h"
#include "TapBillboardCommon.h"
初始化
以下两种初始化方式任选其一。
TapSDK 初始化
如果你已经参考快速开始完成了初始化,这里只需要引入公告模块,然后添加下面初始化代码中高亮的部分到项目中即可。
注意:公告配置中 ServerUrl 必须为完整的包含 https:// 的链接地址,不能只设置域名。
- Unity
- Android
- iOS
- UE4
using TapTap.Common;
using TapTap.Bootstrap;
using TapTap.Billboard;
var dimensionSet = new HashSet<KeyValuePair<string, string>>();
KeyValuePair<string, string> platformPair = new KeyValuePair<string, string>("platform", "TapTap");
KeyValuePair<string, string> locationPair = new KeyValuePair<string, string>("location", "CN");
dimensionSet.Add(platformPair);
dimensionSet.Add(locationPair);
var templateType = "navigate"; // 可选
var billboardServerUrl = "https://your-billboard-server-url"; // 开发者中心 > 你的游戏 > 游戏服务 > 应用配置 > 域名配置 > 公告 , 这里必须包含 https://
var config = new TapConfig.Builder()
.ClientID("your_client_id") // 必须,开发者中心对应 Client ID
.ClientToken("your_client_token") // 必须,开发者中心对应 Client Token
.ServerURL("https://your_server_url") // 必须,开发者中心 > 你的游戏 > 游戏服务 > 基本信息 > 域名配置 > 云服务 API
.RegionType(RegionType.CN) // 可选项,CN 表示中国大陆,IO 表示其他国家或地区
.TapBillboardConfig(dimensionSet, templateType, billboardServerUrl)
.ConfigBuilder();
TapBootstrap.Init(config);
注意:Android SDK 初始化需要放在 Android 主线程中进行。
国内版初始化:
Set<Pair<String, String>> dimensionSet = new HashSet<>();
dimensionSet.addAll(Arrays.asList(Pair.create("location", "CN"), Pair.create("platform", "TapTap")));
String billboardServerUrl = "https://your-billboard-server-url"; // 开发者中心 > 你的游戏 > 游戏服务 > 应用配置 > 域名配置 > 公告, 这里必须包含 https://
TapBillboardConfig billboardCnConfig = new TapBillboardConfig.Builder()
.withDimensionSet(dimensionSet) // 可选
.withServerUrl(billboardServerUrl) // 必须,公告的自定义域名地址,这里需为包含 https:// 的完整地址
.build();
TapConfig tapConfig = new TapConfig.Builder()
.withAppContext(gameMainActivity) // 必须,传入游戏主 Activity
.withClientId("your_client_id") // 必须,开发者中心应用配置里的 Client ID
.withClientToken("your_client_token") // 必须,开发者中心应用配置里的 Client Token
.withServerUrl("https://your_server_url") // 必须,开发者中心 > 你的游戏 > 游戏服务 > 基本信息 > 域名配置 > 云服务 API
.withBillboardConfig(billboardCnConfig) // 必须
.withRegionType(TapRegionType.CN)
.build();
TapBootstrap.init(gameMainActivity, tapConfig);
海外版初始化:
Set<Pair<String, String>> dimensionSet = new HashSet<>()
dimensionSet.addAll(Arrays.asList(Pair.create("location", "XX"), Pair.create("platform", "TapTap")));
TapBillboardConfig billboardIntlConfig = new TapBillboardConfig.Builder()
.withDimensionSet(dimensionSet) // 可选
.build();
TapConfig tapConfig = new TapConfig.Builder()
.withAppContext(gameMainActivity) // 必须,传入游戏主 Activity
.withClientId("your_client_id") // 必须,开发者中心应用配置里的 Client ID
.withClientToken("your_client_token") // 必须,开发者中心应用配置里的 Client Token
.withServerUrl("https://your_server_url") // 必须,开发者中心 > 你的游戏 > 游戏服务 > 基本信息 > 域名配置 > 云服务 API
.withBillboardConfig(billboardIntlConfig) // 必须
.withRegionType(TapRegionType.IO)
.build();
TapBootstrap.init(gameMainActivity, tapConfig);
国内版初始化:
NSMutableSet <NSArray *> *dimensionSet = [[NSMutableSet alloc] init];
[dimensionSet addObject:[NSArray arrayWithObjects:@"platform", @"ios", nil]];
[dimensionSet addObject:[NSArray arrayWithObjects:@"location", @"CN", nil]];
TapBillboardConfig *billboardCnConfig = [TapBillboardConfig new];
billboardCnConfig.diemensionSet = dimensionSet; // 可选项
billboardCnConfig.serverUrl = @"https://your-billboard-server-url"; // 开发者中心 > 你的游戏 > 游戏服务 > 应用配置 > 域名配置 > 公告, 这里必须包含 https://
TapConfig *config = [TapConfig new];
config.clientId = @"your_client_id"; // 必须,开发者中心对应 Client ID
config.clientToken = @"your_client_token"; // 必须,开发者中心对应 Client Token
config.region = TapSDKRegionTypeCN; // TapSDKRegionTypeCN:中国大陆,TapSDKRegionTypeIO:其他国家或地区
config.serverURL = "https://your_server_url"; // 必须,开发者中心 > 你的游戏 > 游戏服务 > 基本信息 > 域名配置 > 云服务 API
config.tapBillboardConfig = billboardCnConfig;
[TapBootstrap initWithConfig:config];
海外版初始化:
NSMutableSet <NSArray *> *dimensionSet = [[NSMutableSet alloc] init];
[dimensionSet addObject:[NSArray arrayWithObjects:@"platform", @"ios", nil]];
[dimensionSet addObject:[NSArray arrayWithObjects:@"location", @"XX", nil]];
TapBillboardConfig *billboardIntlConfig = [TapBillboardConfig new];
billboardIntlConfig.diemensionSet = dimensionSet; // 可选项
TapConfig *config = [TapConfig new];
config.clientId = @"your_client_id"; // 必须,开发者中心对应 Client ID
config.clientToken = @"your_client_token"; // 必须,开发者中心对应 Client Token
config.region = TapSDKRegionTypeIO; // TapSDKRegionTypeCN:中国大陆,TapSDKRegionTypeIO:其他国家或地区
config.serverURL = "https://your_server_url"; // 必须,开发者中心 > 你的游戏 > 游戏服务 > 基本信息 > 域名配置 > 云服务 API
config.tapBillboardConfig = billboardIntlConfig;
[TapBootstrap initWithConfig:config];
#include "ServiceWidgetBillboard.h"
#include "ServiceWidgetBootstrap.h"
#include "TapBillboardCommon.h"
#include "TapUECommon.h"
FTapBillboardPtr TapBillboard = FTapBillboardModule::GetTapBillboardInterface();
FTUConfig Config;
Config.ClientID = "your_client_id"; //开发者中心应用 ID
Config.ClientToken = "your_client_token"; //开发者中心对应 Client Token
Config.RegionType = ERegionType::CN; //区域:国内或者海外
Config.ServerURL = ""; // 开发者中心 > 你的游戏 > 游戏服务 > 基本信息 > 域名配置 > 云服务 API
Config.BillboardConfig = MakeShared<FBillboardConfig>();
Config.BillboardConfig->BillboardUrl = "";// 开发者中心 > 你的游戏 > 游戏服务 > 应用配置 > 域名配置 > 公告, 这里必须包含 https://
Config.BillboardConfig->Dimensions = {{TEXT("location"), TEXT("CN")}} // 开发者中心 > 你的游戏 > 游戏服务 > 运营工具 > 公告 > 维度配置
TapBillboard->Init(Config);
公告系统单独初始化
如果游戏不通过上面提供的 TapBootstrap
方法初始化 TapSDK,仅希望初始化公告系统,可以这么做:
- 复制上面提供的第一种初始化方式代码。
- 修改最后一行为:
- Unity
- Android
- iOS
- UE4
TapBillboard.Init(config);
TapBillboard.init(tapConfig);
[TapBillboard initWithConfig:config];
FTapBootstrap::Init(Config);
参数说明
- 初始化需要两个域名,分别是 API 域名和公告域名。参考文档关于域名的说明,在 开发者中心 > 你的游戏 > 游戏服务 > 应用配置 > 域名配置 处完成配置之后填入。
dimensionSet
参考公告系统维度配置,这里使用了两个预设维度:渠道(platform)和地区(location)。client_id
、client_token
、RegionType
信息可在 开发者中心 > 你的游戏 > 游戏服务 > 应用配置 查看。
打开公告
- Unity
- Android
- iOS
- UE4
TapBillboard.OpenPanel((any, error) =>
{
if (error != null)
{
// 打开公告失败,可以根据 error.code 和 error.errorDescription 来判断错误原因
} else
{
// 打开公告成功
}
}, () => {
// 公告已关闭
});
TapBillboard.openPanel(BillboardActivity.this, new Callback<Void>() {
@Override
public void onError(TapBillboardException tapBillboardException) {
// 打开公告失败,可以根据 tapBillboardException.code 和 tapBillboardException.message 来判断错误原因
}
@Override
public void onSuccess(Void result) {
// 打开公告成功
}
},new PanelShowStateListener() {
@Override
public void onClose() {
// 公告已关闭,如果有 UI 更新,请切换到 Android 主线程
}
});
[TapBillboard openPanel:^(bool _, NSError *_Nullable error) {
if (error) {
// 打开公告失败,可以根据 error.code 和 error.errorDescription 判断错误原因
} else {
// 打开公告成功
}
} closeCallback:^(void){
// 公告已关闭
}];
TapBillboard->OpenPanel(
FSimpleDelegate::CreateLambda([](){ /** 打开成功 */}),
FTapFailed::CreateLambda([](const FTUError& Error){ /** 打开失败 */}),
FSimpleDelegate::CreateLambda([](){ /** 公告关闭 */}));
打开开屏公告
开屏公告用户无法主动关闭,当时间到达开发者配置的关闭时间时会自动关闭,或者开发者可调用关闭开屏公告接口主动关闭。
- Unity
- Android
- iOS
- UE4
TapBillboard.OpenSplashPanel(async (result, err) => {
if (result) {
Debug.Log("打开开屏公告成功");
} else {
Debug.Log($"打开开屏公告失败: {err.code}, {err.errorDescription}");
}
}, () => {
Debug.Log("关闭开屏公告");
});
TapBillboard.openSplashPanel(this, new Callback<Void>() {
@Override
public void onSuccess(Void result) {
// 打开开屏公告成功
}
@Override
public void onError(TapBillboardException tapBillboardException) {
// 打开开屏公告失败,可以根据 tapBillboardException.code 和 tapBillboardException.message 来判断错误原因
}, new PanelShowStateListener() {
@Override
public void onClose() {
//开屏公告已关闭
}
});
[TapBillboard openSplashPanel:^(bool result, NSError * _Nullable error) {
if(error){
NSLog(@"open splash fail error = %@", error.description);
}else{
NSLog(@"open splash success ");
}
} closeCallback:^{
NSLog(@"close splash");
}];
TapBillboard->OpenSplashPanel(
FSimpleDelegate::CreateLambda([](){ /** 打开成功 */}),
FTapFailed::CreateLambda([](const FTUError& Error){ /** 打开失败 */}),
FSimpleDelegate::CreateLambda([](){ /** 公告关闭 */}));
关闭开屏公告
当开屏公告展示时,开发者可调用该接口主动关闭。
- Unity
- Android
- iOS
- UE4
TapBillboard.CloseSplashPanel();
TapBillboard.closeSplashPanel();
[TapBillboard closeSplashPanel];
TapBillboard->CloseSplashPanel();
获取小红点
可以用来获取是否有新的公告信息。SDK 内部对小红点信息进行了缓存,如果两次请求间隔小于 5 分钟,会直接返回上一次成功结果。
- Unity
- Android
- iOS
- UE4
TapBillboard.QueryBadgeDetails((badgeDetails, error) =>
{
if (error != null)
{
// 获取小红点信息失败,可以根据 error.code 和 error.errorDescription 来判断错误原因
}
else
{
// 获取小红点信息成功
if (badgeDetails.showRedDot == 1) {
// 有新的公告信息
} else {
// 没有新的公告信息
}
}
});
TapBillboard.getBadgeDetails(new Callback<BadgeDetails>() {
@Override
public void onError(TapBillboardException tapBillboardException) {
// 获取小红点信息失败,可以根据 tapBillboardException.code 和 tapBillboardException.message 来判断错误原因
}
@Override
public void onSuccess(BadgeDetails badgeDetails) {
if (badgeDetails.showRedDot == 1) {
// 有新的公告信息
} else {
// 没有新的公告信息
}
}
});
[TapBillboard getBadgeDetails:^(BadgeDetails * _Nullable result, NSError *_Nullable error) {
if (error) {
// 获取小红点信息失败,可以根据 error.code 和 error.errorDescription 来判断错误原因
} else {
if ([result.showRedDot intValue] == 1) {
// 有新的公告信息
} else {
// 没有新的公告信息
}
}
}];
TapBillboard->GetBadgeDetails(
FTapBadgeDetailsResult::CreateLambda([](const FBadgeDetails& BadgeDetails){ /** 获取成功 */}),
FTapFailed::CreateLambda([](const FTUError& Error){ /** 获取失败 */}));
注册自定义事件监听
当游戏发布的公告配置的跳转链接为「游戏内模块」,或者游戏正文添加了链接并且链接类型为「游戏内模块」的时候,可以通过监听自定义事件来获取消息,并做相应处理。
- Unity
- Android
- iOS
- UE4
TapBillboard.RegisterCustomLinkListener(url =>
{
// 这里返回的 url 地址和游戏在公告系统内配置的地址是一致的
});
TapBillboard.registerCustomLinkListener(new CustomLinkListener() {
@Override
public void onCustomUrlClick(String url) {
// 这里返回的 url 地址和游戏在公告系统内配置的地址是一致的
// 注意如果有 UI 操作需要切换到 Android 主线程处理
}
});
[TapBillboard registerCustomLinkListener:^(NSString * _Nullable customUrl) {
// 这里返回的 url 地址和游戏在公告系统内配置的地址是一致的
}];
FDelegateHandle CustomUrlClickedHandle = TapBillboard->RegisterCustomLinkListener(FOnCustomLinkClicked::FDelegate::CreateLambda([](const FString& Url){ /** 自定义Url点击 */}));
解除已注册的自定义事件监听
如果不想再接收公告的自定义事件监听可以调用下面的接口:
- Unity
- Android
- iOS
- UE4
// 已注册的回调对象需要游戏保存,取消注册的时候要把对象传给 SDK
TapBillboard.UnRegisterCustomLinkListener(registerdListener);
// 已注册的回调对象需要游戏保存,取消注册的时候要把对象传给 SDK
TapBillboard.unRegisterCustomLinkListener(registerdListener);
// 已注册的回调对象需要游戏保存,取消注册的时候要把对象传给 SDK
[TapBillboard unRegisterCustomLinkListener:registerdListener];
// 已注册的回调对象需要游戏保存,取消注册的时候要把对象传给 SDK
TapBillboard->UnregisterCustomLinkListener(CustomUrlClickedHandle);
展示跑马灯数据
开始获取跑马灯数据,当请求到内容时,会按照开发者配置的位置及样式进行展示。内部请求采用轮询方式,每 5 分钟发起一次请求。
- Unity
- Android
- iOS
- UE4
TapBillboard.StartFetchMarqueeData();
//参数为展示跑马灯所在页面的 Activity 对象
TapBillboard.startFetchMarqueeData(this);
[TapBillboard startFetchMarqueeData];
TapBillboard->StartFetchMarqueeData();
停止获取跑马灯数据
停止轮询获取跑马灯数据,参数为当展示时是否立刻关闭跑马灯窗口。
- Unity
- Android
- iOS
- UE4
TapBillboard.StopFetchMarqueeData(closeNow);
TapBillboard.stopFetchMarqueeData(true);
[TapBillboard stopFetchMarqueeData:YES];
TapBillboard->StopFetchMarqueeData(true);;
注册公告内容输出状态监听
当公告展示时输出及关闭音频时,通过该回调通知开发者。
- Unity
- Android
- iOS
- UE4
TapBillboard.RegisterOutputStateListener(new OutputStateListener {
OnPlayVoice = () => {
Debug.Log("公告页面播放声音");
},
OnStopVoice = () => {
Debug.Log("公告页面关闭声音");
}
});
TapBillboard.registerOutputStateListener(new OutputStateListener() {
@Override
public void onPlayVoice() {
Toast.makeText(BillboardActivity.this, "公告音频开始输出",Toast.LENGTH_SHORT).show();
}
@Override
public void onStopVoice() {
Toast.makeText(BillboardActivity.this, "公告音频停止输出",Toast.LENGTH_SHORT).show();
}
});
TapBillboard.RegisterOutputStateListener(new OutputStateListener {
OnPlayVoice = () => {
Debug.Log($"公告页面播放声音");
},
OnStopVoice = () => {
Debug.Log($"公告页面关闭声音");
}
});
TapBillboard->RegisterOutputStateListener(FAudioOutputStateChanged::FDelegate::CreateLambda([](bool bPlaying){ /** 公告音频输出状态改变 */}));
解除公告内容输出状态监听
- Unity
- Android
- iOS
- UE4
TapBillboard.UnRegisterOutputStateListener();
TapBillboard.unRegisterOutputStateListener();
[TapBillboard unRegisterOutputStateListener];
TapBillboard->UnregisterOutputStateListener();
国际化
公告支持设置语言:
- Unity
- Android
- iOS
- UE4
TapCommon.SetLanguage(TapLanguage.AUTO);
支持如下语言:
namespace TapTap.Common
{
public enum TapLanguage
{
AUTO = 0, // 自动
ZH_HANS = 1, // 简体中文
EN = 2, // 英文
ZH_HANT = 3, // 繁体中文
JA = 4, // 日文
KO = 5, // 韩文
TH = 6, // 泰文
ID = 7, // 印尼语
}
}
int auto = 0;
TapBootstrap.setPreferredLanguage(auto);
支持如下语言:
0 Auto
1 简体中文
2 英文
3 繁体中文
4 日文
5 韩文
6 泰文
7 印尼语
[TapBootstrap setPreferredLanguage:TapLanguageType_Auto];
支持如下语言:
typedef NS_ENUM (NSInteger, TapLanguageType) {
TapLanguageType_Auto = 0, // 自动
TapLanguageType_zh_Hans, // 简体中文
TapLanguageType_en, // 英文
TapLanguageType_zh_Hant, // 繁体中文
TapLanguageType_ja, // 日文
TapLanguageType_ko, // 韩文
TapLanguageType_th, // 泰文
TapLanguageType_id, // 印度尼西亚语
};
TapUECommon::SetLanguage(ELanguageType::AUTO);
支持如下语言:
UENUM(BlueprintType)
enum class ELanguageType : uint8
{
AUTO = 0, // 自动
ZH, // 简体中文
EN, // 英文,海外默认语言
ZHTW, // 繁体中文
JA, // 日语
KO, // 韩语
TH, // 泰文
ID, // 印尼文
};
「自动」会尝试根据系统语言设置语言,如果系统语言不在上述支持的语言之中,那么会根据 SDK 初始化时配置的区域设置语言。 区域为中国大陆时会设置为简体中文,否则会设置为英文。
错误码
code | 场景 |
---|---|
400 | 初始化参数错误 |
403 | 用户无权限访问该服务,需检查开发者中心是否开通了公告服务 |
50x | 服务端内部错误,错误内容可以参考 description |
19999 | 其它错误,内容可以参考 description |
REST API
下面我们介绍公告系统相关的 REST API 接口。
请求格式
对于 POST 和 PUT 请求,请求的主体必须是 JSON 格式,而且 HTTP Header 的 Content-Type 需要设置为 application/json
。
请求的鉴权是通过 HTTP Header 里面包含的键值对来进行的,参数如下表:
Key | Value | 含义 | 来源 |
---|---|---|---|
X-LC-Id | {{appid}} | 当前应用的 App Id (即 Client Id ) | 可在控制台查看 |
X-LC-Sign | {{appSign}} | 由 sign,timestamp 组成的字符串。其中 timestamp 为客户端产生本次请求的 unix 时间戳(UTC),精确到毫秒。sign 是 timestamp 拼接 App Key (即 Client Token )组成的字符串,再对它做 MD5 签名后的结果。 | 参考下方的计算方式 |
使用 App Key 来计算 appSign
:
md5( timestamp + App Key )
= md5(1453014943466UtOCzqb67d3sN12Kts4URwy8)
= d5bcbb897e19b2f6633c716dfdfaf9be
-H "X-LC-Sign: d5bcbb897e19b2f6633c716dfdfaf9be,1453014943466"
除了在 X-LC-Id
这个 HTTP Header 中传入 Client Id
外,还需要在 URL 中指定 Client Id
,两者的值需要一致。
异常时返回 400 (HTTP 状态码)错误,例如:
{
"success": false,
"data": {
"code": 0,
"error": "invalid_request",
"msg": "invalid params",
"error_description": ""
},
"now": 1659084246
}
Base URL
REST API 请求的 Base URL(下文 curl 示例中用 {{host}}
表示)即应用的 API 自定义域名,可以在控制台绑定、查看。详见文档关于域名的说明。
获取模版
参数 | 约束 | 说明 |
---|---|---|
client_id | 必须 | 开发者中心后台游戏服务 > 应用配置 中的 Client ID |
template | 必须 | 公告模版类型,目前仅支持导航模版。可填写:导航模版-navigate 、图片模版-image 。 |
curl -X GET
-H 'X-LC-Id: {{appid}}' \
-H 'X-LC-Sign: {{appSign}}' \
https://{{host}}/billboard/rest-api/v1/pattern/detail?client_id={{appid}}&template={{template}}
返回的主体是一个 JSON 对象,包含创建模版时传入的所有参数:
{
"success": true,
"data": {
"empty_img": {
"url": "https://tds-billboard.tds1.tapfiles.cn/20220727/aWkG63mpT2WeFrtT0Dxojj4QLfabWHh3.png"
},
"highlight_text_color": "#15C5CE",
...
},
"now": 1659085552
}
获取公告列表
参数 | 约束 | 说明 |
---|---|---|
client_id | 必须 | 开发者中心后台游戏服务 > 应用配置 中的 Client ID |
lang | 必须 | 详见语言代码列表 |
template | 必须 | 公告模版类型,目前仅支持导航模版。可填写:导航模版-navigate 、图片模版-image 、开屏模版-splash 、跑马灯模版-marquee 。 |
dimension_list | 可选 | [{"维度参数":"维度字段参数"},...] ,示例:[{"platform":"ios"},{"location":"CN"}] |
type | 必须 | 公告类型。可填写:活动公告-activity 、其他统称游戏公告-game 。 |
uuid | 选填 | 设备唯一 id 字符串,用于支持数据分析。示例:"4e4105c7-781e-45c0-92ea-d595c75a3c2c" |
curl -X POST
-H 'X-LC-Id: {{appid}}' \
-H 'X-LC-Sign: {{appSign}}' \
-H 'Content-Type: application/json' \
-d '{
"lang":{{lang}},
"template":{{template}},
"type":{{type}},
"dimension_list":{{dimension_list}}
}' \
https://{{host}}/billboard/rest-api/v1/announcement/list?client_id={{appid}}&uuid={{uuid}}
返回的 JSON 对象包含公告列表 list
和最新发布的一条公告详情 lastest
。
参数 | 说明 |
---|---|
id | 公告 id |
type | 公告类型:更新公告-update、维护公告-maintenance、上新公告-new、活动公告-activity、玩法公告-play_method、测试公告-test、停服公告-discontinued |
expire_time | 过期时间:秒级时间戳,0-表示不过期 |
short_title | 短标题 |
jump_location | 跳转位置:content-正文、link-跳转链接、game-游戏内模块 |
jump_link | 跳转位置选择「跳转链接」时为对应的链接,选择「游戏内模块」时为对应的模块参数 |
publish_time | 发布时间:秒级时间戳 |
{
"success": true,
"data": {
"list": [
{
"id": 2,
"type": "activity",
"expire_time": 0,
"short_title": "公告跳转链接地址",
"jump_location": "link",
"jump_link": "https://www.taptap.cn",
"publish_time": 1659077524
},
...
],
"lastest": {
"id": 2,
"content": "正文",
"short_title": "公告跳转链接地址",
"long_title": "测试情报|「起着测试」4月14日开启"
}
},
"now": 1659085756
}
获取公告详情
参数 | 约束 | 说明 |
---|---|---|
client_id | 必须 | 开发者中心后台游戏服务 > 应用配置 中的 Client ID |
lang | 必须 | 详见语言代码列表 |
id | 必须 | 公告 id |
uuid | 选填 | 设备唯一 id 字符串,用于支持数据分析。示例:"4e4105c7-781e-45c0-92ea-d595c75a3c2c" |
curl -X GET
-H 'X-LC-Id: {{appid}}' \
-H 'X-LC-Sign: {{appSign}}' \
https://{{host}}/billboard/rest-api/v1/announcement/detail?client_id={{appid}}&lang={{lang}}&id={{id}}&uuid={{uuid}}
返回的 JSON 对象
参数 | 说明 |
---|---|
id | 公告 id |
content | 正文 |
long_title | 长标题 |
short_title | 短标题 |
{
"success": true,
"data": {
"id": 82,
"content": "正文",
"short_title": "短标题",
"long_title": "长标题"
},
"now": 1659087990
}
获取小红点
参数 | 约束 | 说明 |
---|---|---|
client_id | 必须 | 开发者中心后台游戏服务 > 应用配置 中的 Client ID |
uuid | 必须 | 设备唯一 id 字符串,示例:"4e4105c7-781e-45c0-92ea-d595c75a3c2c" |
template | 必须 | 公告模版类型,目前仅支持导航模版。可填写:导航模版-navigate 、图片模版-image 。 |
dimension_list | 可选 | [{"维度参数":"维度字段参数"},...] ,示例:[{"platform":"ios"},{"location":"CN"}] |
curl -X POST \
-H 'X-LC-Id: {{appid}}' \
-H 'X-LC-Sign: {{appSign}}' \
-H 'Content-Type: application/json' \
-d '{
"uuid": {{uuid}},
"template":{{template}},
"dimension_list":{{dimension_list}}
}' \
'https://{{host}}/billboard/rest-api/v1/dot/read?client_id={{client_id}}'
返回的 JSON 对象
参数 | 说明 |
---|---|
show_red_dot | 是否展示小红点:0-不展示 1-展示 |
close_button_img | 从导航接口中得到的关闭按钮 URL |
{
"success": true,
"data": {
"show_red_dot": 0,
"close_button_img": "https://tds-billboard.tds1.tapfiles.cn/20220727/aMHoqDTHT4zrXYPNprkZjXkdLK6vFg8E.png"
},
"now": 1658896487
}
提交小红点
参数 | 约束 | 说明 |
---|---|---|
client_id | 必须 | 开发者中心后台游戏服务 > 应用配置 中的 Client ID |
uuid | 必须 | 设备唯一id字符串,示例:"4e4105c7-781e-45c0-92ea-d595c75a3c2c" |
read_all | 必须 | 标记公告全部已读:true-是,false-否 |
curl -X POST \
-H 'X-LC-Id: {{appid}}' \
-H 'X-LC-Sign: {{appSign}}' \
-H 'Content-Type: application/json' \
-d '{
"uuid": {{uuid}},
"read_all":{{read_all}}
}' \
'https://{{host}}/billboard/rest-api/v1/dot/submit?client_id={{client_id}}'
返回的 JSON 对象
{
"success": true,
"data": {
"msg": "ok"
},
"now": 1658895192
}
批量查询公告详情
参数 | 约束 | 说明 |
---|---|---|
client_id | 必须 | 开发者中心后台游戏服务 > 应用配置 中的 Client ID |
uuid | 必须 | 设备唯一id字符串,示例:"4e4105c7-781e-45c0-92ea-d595c75a3c2c" |
ids | 必须 | 公告唯一id字符串,用逗号分隔。示例:"1,2" |
lang | 必须 | 语言。示例:"zh_CN" |
curl -X GET \
-H 'X-LC-Id: {{appid}}' \
-H 'X-LC-Sign: {{appSign}}' \
'https://{{host}}/billboard/rest-api/v1/announcement/detail/multi?client_id={{client_id}}&ids={ids}&uuid={uuid}&lang={lang}'
返回的 JSON 对象
参数 | 说明 |
---|---|
id | 公告 id |
content | 公告正文 |
type | 公告类型:更新公告-update、维护公告-maintenance、上新公告-new、活动公告-activity、玩法公告-play_method、测试公告-test、停服公告-discontinued |
template | 公告模版类型 |
short_title | 短标题 |
long_title | 长标题 |
jump_location | 跳转位置:content-正文、link-跳转链接、game-游戏内模块 |
jump_link | 跳转位置选择「跳转链接」时为对应的链接,选择「游戏内模块」时为对应的模块参数 |
publish_time | 发布时间:秒级时间戳,0-表示不存在 |
expire_time | 过期时间:秒级时间戳,0-表示不过期 |
{
"success": true,
"data": {
"list": [
{
"id": 1,
"content": "[{\"type\":\"paragraph\",\"children\":[{\"text\":\"测试公告排序哈哈哈哈 \"}]},{\"type\":\"block-link\",\"info\":{\"url\":\"test://action\",\"type\":\"game\",\"noLinkTitle\":false},\"children\":[{\"text\":\"测试内部跳转1\"}]},{\"type\":\"paragraph\",\"children\":[{\"text\":\"\"}]},{\"type\":\"block-link\",\"info\":{\"url\":\"test://action2\",\"type\":\"game\",\"noLinkTitle\":false},\"children\":[{\"text\":\"测试内部跳转2\"}]}]",
"type": "",
"template": "",
"short_title": "测试公告排序",
"long_title": "测试公告排序",
"jump_location": "",
"jump_link": "",
"publish_time": 0,
"expire_time": 0
},
{
"id": 2,
"content": "",
"type": "",
"template": "",
"short_title": "",
"long_title": "",
"jump_location": "",
"jump_link": "",
"publish_time": 0,
"expire_time": 0
}
]
},
"now": 1676010120
}
未读公告-设备维度
参数 | 约束 | 说明 |
---|---|---|
client_id | 必须 | 开发者中心后台游戏服务 > 应用配置 中的 Client ID |
uuid | 必须 | 设备唯一id字符串,示例:"4e4105c7-781e-45c0-92ea-d595c75a3c2c" |
template | 必须 | 公告模版类型,目前仅支持导航模版。可填写:开屏模版-splash 、跑马灯模版-marquee 。 |
dimension_list | 可选 | [{"维度参数":"维度字段参数"},...] ,示例:[{"platform":"ios"},{"location":"CN"}] |
curl -X POST \
-H 'X-LC-Id: {{appid}}' \
-H 'X-LC-Sign: {{appSign}}' \
-H 'Content-Type: application/json' \
-d '{
"uuid": {{uuid}},
"template":{{template}},
"dimension_list":{{dimension_list}}
}' \
'https://{{host}}/billboard/rest-api/v1/announcement/unread?client_id={clientId}'
返回的 JSON 对象
参数 | 说明 |
---|---|
id | 公告 id |
publish_time | 发布时间:秒级时间戳,0-表示不存在 |
expire_time | 过期时间:秒级时间戳,0-表示不过期 |
{
"success": true,
"data": {
"list": [
{
"id":1,
"publish_time": 1669203905,
"expire_time": 1670672278
},
{
"id":2,
"publish_time": 1669203905,
"expire_time": 1670672278
}
]
},
"now": 1666853298
}
标记已读-设备维度
注:该设备中,未读公告接口中不在返回已标记的公告id。ids当前仅限跑马灯类型的公告,否则返回异常信息
参数 | 约束 | 说明 |
---|---|---|
client_id | 必须 | 开发者中心后台游戏服务 > 应用配置 中的 Client ID |
uuid | 必须 | 设备唯一id字符串,示例:"4e4105c7-781e-45c0-92ea-d595c75a3c2c" |
ids | 必须 | 公告唯一id数组。示例:[1,3] |
curl -X POST \
-H 'X-LC-Id: {{appid}}' \
-H 'X-LC-Sign: {{appSign}}' \
-H 'Content-Type: application/json' \
-d '{
"uuid": {{uuid}},
"ids":{{ids}}
}' \
'https://{{host}}/billboard/rest-api/v1/announcement/mark?client_id={clientId}'
返回的 JSON 对象
{
"success": true,
"data": {
"msg": "ok"
},
"now": 1670318366
}
取消已读标记-设备维度
注:该设备中,维度公告接口中再次返回取消标记的公告id
参数 | 约束 | 说明 |
---|---|---|
client_id | 必须 | 开发者中心后台游戏服务 > 应用配置 中的 Client ID |
uuid | 必须 | 设备唯一id字符串,示例:"4e4105c7-781e-45c0-92ea-d595c75a3c2c" |
curl -X POST \
-H 'X-LC-Id: {{appid}}' \
-H 'X-LC-Sign: {{appSign}}' \
-H 'Content-Type: application/json' \
-d '{
"uuid": {{uuid}},
}' \
'https://{{host}}/billboard/rest-api/v1/announcement/unmark?client_id={clientId}'
返回的 JSON 对象
{
"success": true,
"data": {
"msg": "ok"
},
"now": 1670318366
}
语言代码列表
使用 ISO 639-1 中定义的双小写字母语言代码(例如,en
表示英语,jp
表示日语),但:
- ISO 639-1 中未包括的语言,使用 ISO 632-2 中定义的三小写字母语言代码(例如,
fil
表示菲律宾语) - 仅使用语言代码无法表示所需语言时,附加 ISO 3166-1 中定义的地区代码(例如,
zh_CN
表示简体中文)
当前 REST API 支持的语言代码如下:
代码 | 语言 |
---|---|
zh_CN | 简体中文 |
zh_TW | 繁体中文 |
en_US | 英语(美国) |
ja_JP | 日文 |
ko_KR | 韩文 |
pt_PT | 葡萄牙语 |
vi_VN | 越南语 |
hi_IN | 印度语 |
id_ID | 印尼语 |
ms_MY | 马来语 |
th_TH | 泰语 |
es_ES | 西班牙语 |
af | 南非荷兰语 |
am | 阿姆哈拉语 |
bg | 保加利亚语 |
ca | 加泰罗尼亚语 |
hr | 克罗地亚语 |
cs | 捷克语 |
da | 丹麦语 |
nl | 荷兰语 |
et | 爱沙尼亚语 |
fil | 菲律宾语 |
fi | 芬兰语 |
fr | 法语 |
de | 德语 |
el | 希腊语 |
he | 希伯来语 |
hu | 匈牙利语 |
is | 冰岛语 |
it | 意大利语 |
lv | 拉脱维亚语 |
lt | 立陶宛语 |
no | 挪威语 |
pl | 波兰语 |
ro | 罗马尼亚语 |
ru | 俄语 |
sr | 塞尔维亚语 |
sk | 斯洛伐克语 |
sl | 斯洛文尼亚语 |
sw | 斯瓦希里语 |
sv | 瑞典语 |
tr | 土耳其语 |
uk | 乌克兰语 |
zu | 祖鲁语 |
注意,上表中的部分语言虽然 REST API 支持,但客户端 SDK 并没有支持。