实名认证和防沉迷开发指南
使用 TDS 实名认证和防沉迷服务之前,需要在 开发者中心后台 > 游戏服务 > 开发与构建 > 合规认证 处开通服务,可选择「已有版号」或「暂无版号」方案。
环境要求
- Unity
- Android
- iOS
- UE4
- Unity 2019.4 或更高版本
- iOS 11 或更高版本,Xcode 16 及以上版本
- Android 5.0(API level 21)或更高版本
Android 5.0(API level 21)或更高版本
iOS 11 或更高版本,Xcode 16 及以上版本
- 支持 UE 4.26.2
- iOS 12 或更高版本
- Android 5.0(API level 21)或更高版本
- macOS 10.14.0 或更高版本
- Windows 7 或更高版本
支持平台:Android / iOS / Windows / macOS
权限说明
- Unity
- Android
- iOS
- UE4
该模块需要如下权限:
权限 | 使用目的 | 权限申请时机 |
---|---|---|
网络权限 | 用于正常网络请求 | 用户首次使用该功能时会申请权限 |
获取网络状态权限 | 用于检测当前网络连接是否有效 | 用户首次使用该功能时会申请权限 |
该模块将在应用中添加如下权限:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
集成前准备
- 参考 准备工作 创建应用、开启应用配置。
- 参考实名认证和防沉迷功能介绍中准备工作开通防沉迷服务。
- 防沉迷模块依赖于 TapTap 登录模块,开发者接入防沉迷前应先接入 TapTap 登录 相关依赖。
SDK 配置
可以在 下载页 获得 TapSDK,引入防沉迷模块。
- Unity
- Android
- iOS
- UE4
SDK 可以通过 Unity Package Manager 导入或手动导入,二者任选其一。请 根据项目需要选择。
方法一:使用 Unity Package Manager
NPMJS 安装
从 3.25.0 版本开始,TapSDK 支持了 NPMJS 安装,优势是只需要配置版本号,并且支持嵌套依赖。
在项目的 Packages/manifest.json
文件中添加以下依赖:
"dependencies":{
"com.tapsdk.antiaddiction":"3.29.7",
"com.taptap.tds.common":"3.29.7",
"com.taptap.tds.login":"3.29.7",
}
但需要注意的是,要在 Packages/manifest.json
中 dependencies
同级下声明 scopedRegistries
:
"scopedRegistries": [
{
"name": "NPMJS",
"url": "https://registry.npmjs.org/",
"scopes": ["com.tapsdk", "com.taptap"]
}
]
GitHub 安装
在项目的 Packages/manifest.json
文件中添加以下依赖:
"dependencies":{
"com.taptap.tds.common":"https://github.com/TapTap/TapCommon-Unity.git#3.29.7",
"com.tapsdk.antiaddiction":"https://github.com/TapTap/TapAntiAddiction-Unity.git#3.29.7",
"com.taptap.tds.login":"https://github.com/TapTap/TapLogin-Unity.git#3.29.7",
"com.leancloud.storage":"https://github.com/leancloud/csharp-sdk-upm.git#storage-2.3.0",
}
在 Unity 顶部菜单中选择 Window > Package Manager 可查看已经安装在项目中的包。
方法二:手动导入
-
在 下载页 找到 TapSDK Unity 下载地址,下载
TapSDK-UnityPackage.zip
。 -
在 Unity 项目中依次转到 Assets > Import Packages > Custom Packages,从解压后的
TapSDK-UnityPackage.zip
中,选择希望在游戏中使用的 TapSDK 包导入,其中:
TapTap_Common.unitypackage
TapSDK 基础库,必选。TapTap_AntiAddiction.unitypackage
TapTap 防沉迷库,必选。
- 从 LeanCloud-SDK 下载页 中下载并解压 LeanCloud-SDK-Storage-Unity.zip,然后将 Plugins 文件夹拖拽至 Unity 即可。
iOS 平台配置:
使用 Xcode 13.0 beta 5 编译,检查 Unity 输出的 Xcode 工程:
查看 Unity 输出的 Xcode 工程详情配置
- 请确保设置
Xcode
-General
-Frameworks, Libraries, and Embedded Content
中的AntiAddictionService.framework
和AntiAddictionUI.framework
为Do Not Embed
。
- 如果编译报错找不到头文件或者模块,请确保
Xcode
-Build Settings
-Framework Search Paths
中的路径以保证 Xcode 正常编译。
- 确保 Xcode 工程的
Build Settings
的Swift Compile Language
/Swift Language Version
为Swift5
。
- 添加依赖库
libz.tbd
、libc++.tbd
。
-
开始代码接入。
-
将
AntiAddiction-Unity/Assets/Plugins/iOS/Resource/AntiAdictionResources.bundle
拷贝到 Unity 导出的 Xcode 工程目录下(如果 Unity 项目没有正确导入AntiAddictionResources.bundle
)。假设你的 Unity 项目名称为 AntiDemo,则默认导出 Xcode 工程名为 antidemoxcode,需要将AntiAdictionResources.bundle
拷贝到 antidemoxcode 目录里。拷贝成功后在项目的Build Phases
>Copy Bundle Resources
里添加拷贝的AntiAdictionResources.bundle
。
- 将 防沉迷 SDK
AntiAddiction_3.29.7.aar
拷贝到游戏目录下的src/main/libs
目录中 - 将 防沉迷 SDK
AntiAddictionUI_3.29.7.aar
拷贝到游戏目录下的src/main/libs
目录中 - 将
TapCommon_3.29.7.aar
拷贝到游戏目录下的src/main/libs
目录中 - 将
TapLogin_3.29.7.aar
拷贝到游戏目录下的src/main/libs
目录中 - 将
TapBootstrap_3.29.7.aar
拷贝到游戏目录下的src/main/libs
目录中 (可选)
在游戏目录下 build.gradle
文件中添加代码
repositories{
flatDir{
dirs 'src/main/libs'
}
}
dependencies {
// ...
implementation(name: "AntiAddiction_3.29.7", ext: "aar") // 防沉迷 SDK
implementation(name: "AntiAddictionUI_3.29.7", ext: "aar") // 防沉迷 SDK
implementation(name: "TapCommon_3.29.7", ext: "aar")
implementation(name: "TapLogin_3.29.7", ext: "aar")
implementation(name: "TapBootstrap_3.29.7", ext: "aar") // 可选
// ...
}
iOS 防沉迷 SDK 结构:
AntiAddictionService
防沉迷基础库,源码由 Swift 编写。AntiAddictionUI
带 UI 的防沉迷库,依赖AntiAddictionService
,源码由 Objective-C 编写。AntiAddictionResources.bundle
资源文件
其他依赖:
TapCommonSDK.framework
基础 库TapLoginSDK.framework
基础库TapCommonResource.bundle
资源文件TapLoginResource.bundle
资源文件TapBootstrap.framework
基础库(可选)LibProtocolBuffers.framework
基础库 // 3.29.4 版本需要添加 LibProtocolBuffers
添加防沉迷库文件:
-
添加
AntiAddictionService.framework
、AntiAddictionUI.framework
、TapLoginSDK.framework
、TapBootstrap.framework
(可选) 和TapCommonSDK.framework
、LibProtocolBuffers.framework (仅 3.29.4 ) 静态库。注意添加时选择 Embed 方式为 Do Not Embed。 -
引用代码:
// AntiAddictionUI
#import <AntiAddictionUI/AntiAddictionUI.h>
添加系统依赖库:
请检查项目中是否已自动添加以下依赖项:
libc++.tdb
libz.tdb
若运行时遇到相关依赖库加载报错,可改为 Optional 尝试。
配置编译选项:
-
在 Build Setting 中的 Other Link Flag 中添加
-ObjC
和-Wl -ld_classic
。 -
在 Build Setting 中的 Always Embed Swift Standard Libraries 设置为 YES,即始终引入 Swift 标准库,避免 App 启动时报错「无法找到 Swift 标准库之类」。如果项目中找不到,可以建立一个空 Swift 文件,Xcode 会自动建立桥接关系。
-
在 Build Setting 中的 Swift Compiler - Language/Swift Language Version 选择 Swift 5。
安装插件
- 下载 TapSDK UE4,TapSDK-UE4-xxx.zip 解压后将
AntiAddiction
、TapCommon
、TapLogin
、TapBootstrap(可选)
文件夹 Copy 到项目的Plugins
目录中 - 重启 Unreal Editor
- 打开 编辑 > 插件 > 项目 > TapTap,开启
AntiAddiction
模块
添加依赖
在 Project.Build.cs 中添加所需模块:
PublicDependencyModuleNames.AddRange(new string[] { "Core",
"CoreUObject",
"Engine",
"Json",
"InputCore",
"JsonUtilities",
"SlateCore",
"TapCommon",
"TapLogin",
"TapBootstrap", // 可选
"AntiAddiction"
});
导入头文件
#include "AntiAddictionUE.h"
iOS 打包 Objective-C 和 Swift 的混编解决方案
目前有两种解决方案
一、防沉迷库替换成动态库
优缺点:
- 优点:可以不用修改引擎的代码
- 缺点:
- 包体积略微增大
- 最低支持 iOS 13,低于该系统版本会造成闪退
操作步骤:
-
下载 TapSDK-iOS 相同版本的库文件
-
把
Plugins/AntiAddiction/Source/AntiAddiction/ios/framework/AntiAddictionService.zip
中的AntiAddictionService.framework
替换成刚下载到的Dylib/AntiAddictionService.framework
(解压缩 -> 替换 -> 压缩) -
把
AntiAddiction.Build.cs
文件中new Framework(
"AntiAddictionService",
"../AntiAddiction/ios/framework/AntiAddictionService.zip"
)替换成:
new Framework(
"AntiAddictionService",
"../AntiAddiction/ios/framework/AntiAddictionService.zip",
null,
true
) -
重新编译即可
二、修改 UnrealBuildTool
-
修改
XcodeProject.cs
文件路径:
Engine/Source/Programs/UnrealBuildTool/ProjectFiles/Xcode/XcodeProject.cs
在函数:
private void AppendProjectBuildConfiguration(StringBuilder Content, string ConfigName, string ConfigGuid)
中添加如下代码:
// Enable Swift
Content.Append("\t\t\t\tCLANG_ENABLE_MODULES = YES;" + ProjectFileGenerator.NewLine);
Content.Append("\t\t\t\tSWIFT_VERSION = 5.0;" + ProjectFileGenerator.NewLine);
Content.Append("\t\t\t\tLIBRARY_SEARCH_PATHS = \"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\";" + ProjectFileGenerator.NewLine);
if (ConfigName == "Debug")
{
Content.Append("\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";" + ProjectFileGenerator.NewLine);
}
Content.Append("\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;" + ProjectFileGenerator.NewLine);
Content.Append("\t\t\t\tEMBEDDED_CONTENT_CONTAINS_SWIFT = YES;" + ProjectFileGenerator.NewLine);参考如下:
-
修改
IOSToolChain.cs
文件路径:
Engine/Source/Programs/UnrealBuildTool/Platform/IOS/IOSToolChain.cs
在函数:
string GetLinkArguments_Global(LinkEnvironment LinkEnvironment)
中添加如下代码:
// 该行代码需要前置(前置的代码位置见下面示例图片)
// Added by uwellpeng: enable swift support, make sure '/usr/lib/swift' goes before '@executable_path/Frameworks'
Result += " -rpath \"/usr/lib/swift\"";
// enable swift support
Result += " -rpath \"@executable_path/Frameworks\"";
// /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/lib/swift/
String swiftLibPath = String.Format(" -L {0}Platforms/{1}.platform/Developer/SDKs/{1}{2}.sdk/usr/lib/swift",
Settings.Value.XcodeDeveloperDir, bIsDevice? Settings.Value.DevicePlatformName : Settings.Value.SimulatorPlatformName, Settings.Value.IOSSDKVersion);
Result += swiftLibPath;
Log.TraceInformation("Add swift lib path : {0}", swiftLibPath);
///Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphoneos
swiftLibPath = String.Format(" -L {0}Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/{1}",
Settings.Value.XcodeDeveloperDir, bIsDevice? Settings.Value.DevicePlatformName.ToLower() : Settings.Value.SimulatorPlatformName.ToLower());
Result += swiftLibPath;
Log.TraceInformation("Add swift lib path : {0}", swiftLibPath);
///Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift-5.0/iphoneos
swiftLibPath = String.Format(" -L {0}Toolchains/XcodeDefault.xctoolchain/usr/lib/swift-5.0/{1}",
Settings.Value.XcodeDeveloperDir, bIsDevice? Settings.Value.DevicePlatformName.ToLower() : Settings.Value.SimulatorPlatformName.ToLower());
Result += swiftLibPath;
// Xcode 12 多了 swiftcompatabiliy51 的库,需要新增以下代码
if (Settings.Value.IOSSDKVersionFloat >= 14.0f)
{
Result += String.Format(" -lswiftCompatibility51");
}需要注意的是
Result += " -rpath \"/usr/lib/swift\"";
这段代码需要加在@executable_path/Frameworks
前面参考:
-
重新编译 UBT
使用
msbuild
工具重新编译UnrealBuildTool
,即在Engine/Source/Programs/UnrealBuildTool
目录运行Terminal
指令msbuild
来重新编译(如果引擎目录在一些不可编辑的目录下,可以加上sudo
命令,即sudo msbuild
)。完成上述三个步骤即可在解决 UnrealEngine 上 Swift 的混编问题
防沉迷 SDK 需要联网和发送请求数据的权限,请开发者注意在项目中声明相应权限。
初始化与回调设置
回调设置
因初始化接 口依赖或需结合使用防沉迷回调对象参数,开发者应先自定义防沉迷回调对象来处理不同类型事件。
- Unity
- Android
- iOS
- UE4
Action<int, string> callback = (code, extra) => {
// 防沉迷回调
UnityEngine.Debug.LogFormat($"code: {code} error Message: {extra}");
};
AntiAddictionUICallback callback = new AntiAddictionUICallback() {
@Override
public void onCallback(int code, Map<String, Object> extras) {
// 防沉迷回调
}
};
//设置需要实现以下协议方法来接收回调的`delegate` 对象
- (void)antiAddictionCallbackWithCode:(AntiAddictionResultHandlerCode)code extra:(NSString * _Nullable)extra {
// 防沉迷回调
}
void UAntiAddictionWidget::OnCallBack(AntiAddictionUE::ResultHandlerCode Code, const FString& Extra) {
// 防沉迷回调
}
回调参数中 code 用于标识回调类型, extra 为对应提示信息
回调 code | 回调类型 | 触发逻辑 |
---|---|---|
500 | LOGIN_SUCCESS | 玩家未受到限制,正常进入游戏 |
1000 | EXITED | 退出防沉迷认证及检查,当开发者调用 Exit 接口时或用户认证信息无效时触发,游戏应返回到登录页 |
1001 | SWITCH_ACCOUNT | 用户点击切换账号,游戏应返回到登录页 |
1030 | PERIOD_RESTRICT | 用户当前时间无法进行游戏,此时用户只能退出游戏或切换账号 |
1050 | DURATION_LIMIT | 用户无可玩时长,此时用户只能退出游戏或切换账号 |
1100 | AGE_LIMIT | 当前用户因触发应用设置的年龄限制无法进入游戏,该回调的优先级高于 1030,触发该回调无弹窗提示 |
1200 | INVALID_CLIENT_OR_NETWORK_ERROR | 数据请求失败,游戏需检查当前设置的应用信息是否正确及判断当前网络连接是否正常 |
9002 | REAL_NAME_STOP | 实名过程中点击了关闭实名窗,游戏可重新开始防沉迷认证 |
初始化
从 3.27.0
版本开始,防沉迷初始化有两种方式,使用 TapBootstrap
模块 和 单独调用防沉迷接口初始化,游戏根据需要选择一种即可, 3.27.0
之前的版本只支持单独调用防沉迷接口初始化。
TapBootstrap 初始化(不推荐)
使用 TapBootstrap
初始化时,需要在 TapConfig
中设置 TapAntiAddicitionConfig
配置, 但不需要再额外调用登录初始化接口,同时防沉迷回调对象需单独设置。示例如下:
- Unity
- Android
- iOS
- UE4
var config = new TapConfig.Builder()
.ClientID(clientId)
.ClientToken(clientToken)
.ServerURL(serverUrl)
.RegionType(regionType)
// showSwitchAccount bool 类型 是否显示切换账号按钮; useAgeRange bool 类型 是否需要获取真实年龄段信息
.AntiAddictionConfig(showSwitchAccount, useAgeRange);
TapBootstrap.Init(config);
// 设置回调, callback 为开发者实现的自定义防沉迷回调对象
AntiAddictionUIKit.SetAntiAddictionCallback(callback);
// TapAntiAddicitonConfig 构造方法中参数为是否显示切换账号,是否使用年龄段
TapAntiAddictionConfig tapAntiAddictionConfig = new TapAntiAddictionConfig(true, true);
TapConfig tapConfig = new TapConfig.Builder()
.withAppContext(activity)
.withClientId(clientId)
.withClientToken(clientToken)
.withServerUrl(serverUrl)
.withRegionType(regionType)
.withAntiAddictionConfig(tapAntiAddictionConfig)
.build();
TapBootstrap.init(activity, tapConfig);
//设置回调, callback 为开发者实现的自定义防沉迷回调对象
AntiAddictionUIKit.setAntiAddictionCallback(callback);
TapConfig *config = [TapConfig new];
config.clientId = @"your_client_id"; // 必须,开发者中心对应 Client ID
config.clientToken = @"your_client_token"; // 必须,开发者中心对应 Client Token
config.serverURL = @"https://your_server_url";
config.tapAntiAddictionConfig = [[TapAntiAddictionConfig alloc] init];
config.tapAntiAddictionConfig.showSwitchAccount = true;
config.tapAntiAddictionConfig.useAgeRange = true;
[TapBootstrap initWithConfig:config];
//设置回调, callback 为开发者实现的自定义防沉迷回调对象
[AntiAddiction setDelegate:delegate];
FTUConfig Config;
Config.ClientID = ETB_Init_ClientID->GetText().ToString();
Config.ClientToken = ETB_Init_ClientToken->GetText().ToString();
Config.ServerURL = ETB_Init_ServerURL->GetText().ToString();
Config.TapAntiAddictionConfig = MakeShared<FTapAntiAddictionConfig>();
Config.TapAntiAddictionConfig->bShowSwitchAccount = true;
Config.TapAntiAddictionConfig->bUseAgeRange = true;
FTapBootstrap::Init(Config);
// 绑定开发者实现的自定义防沉迷回调对象 AntiAddictionUE::OnCallBack
AntiAddictionUE::OnCallBack.BindUObject(this, &UAntiAddictionWidget::OnCallBack);
参数说明
TapAntiAddictionConfig 为防沉迷模块使用的配置,其参数如下:
- Unity
- Android
- iOS
- UE4
-
showSwitchAccount
是否显示切换账号按钮。如果游戏不支持切换账号功能,应设置为 false;如果游戏支持则设置为 true,当玩家点击切换账按钮后,SDK 会触发1001
回调,游戏可根据这个回调 code 做相应处理。 -
useAgeRange
游戏是否需要获取真实年龄段信息,当设置为 true 时,使用 Tap 实名时会需要用户主动授权,当设置为 false 时,使用 Tap 实名时会进行无 UI 交互的静默授权,未设置时默认为 true
防沉迷初始化参数包括:
showSwitchAccount
:是否显示切换账号按钮。如果游戏不支持切换账号功能,应设置为 false;如果游戏支持则设置为 true,当玩家点击切换账按钮后,SDK 会触发1001
回调,游戏可根据这个回调 code 做相应处理。useAgeRange
游戏是否需要获取真实年龄段信息,当设置为 true 时,使用 Tap 实名时会需要用户主动授权,当设置为 false 时,使用 Tap 实名时会进行无 UI 交互的静默授权,未设置时默认为 true
showSwitchAccount
是否显示切换账号按钮。如果游戏不支持切换账号功能,应设置为 false;如果游戏支持则设置为 true,当玩家点击切换账按钮后,SDK 会触发1001
回调,游戏可根据这个回调 code 做相 应处理。useAgeRange
游戏是否需要获取真实年龄段信息,当设置为 true 时,使用 Tap 实名时会需要用户主动授权,当设置为 false 时,使用 Tap 实名时会进行无 UI 交互的静默授权,未设置时默认为 true
ShowSwitchAccount
是否显示切换账号按钮。如果游戏不支持切换账号功能,应设置为 false;如果游戏支持则设置为 true,当玩家点击切换账按钮后,SDK 会触发1001
回调,游戏可根据这个回调 code 做相应处理。UseAgeRange
游戏是否需要获取真实年龄段信息,当设置为 true 时,使用 Tap 实名时会需要用户主动授权,当设置为 false 时,使用 Tap 实名时会进行无 UI 交互的静默授权,未设置时默认为 true
防沉迷接口单独初始化(推荐)
因防沉迷模块依赖于 TapLogin
模块,所以在防沉迷模块初始化前必须完成 TapLogin
模块初始化。
初始化防沉迷 UI 模块,包括设置启动防沉迷功能的配置、注册防沉迷的消息监听。
- Unity
- Android
- iOS
- UE4
using TapTap.AntiAddiction;
using TapTap.AntiAddiction.Model;
AntiAddictionConfig config = new AntiAddictionConfig()
{
gameId = "your_client_id", // TapTap 开发者中心对应 Client ID
showSwitchAccount = false, // 是否显示切换账号按钮
useAgeRange = true // 是否使用年龄段信息
};
//设置配置及回调,callback 为开发者实现的自定义防沉迷回调对象
AntiAddictionUIKit.Init(config);
AntiAddictionUIKit.SetAntiAddictionCallback(callback);
// Android SDK 的各接口第一个参数是当前 Activity,以下不再说明
Config config = new Config.Builder()
.withClientId("your_client_id") // TapTap 开发者中心对应 Client ID
.showSwitchAccount(false) // 是否显示切换账号按钮
.useAgeRange(true) //是否使用年龄段信息
.build();
//设置配置与回调,callback 为开发者实现的自定义防沉迷回调对象
AntiAddictionUIKit.init(activity, config);
AntiAddictionUIKit.setAntiAddictionCallback(callback);
AntiAddictionConfig *config = [[AntiAddictionConfig alloc] init];
config.clientID = @"your_client_id"; // TapTap 开发者中心对应 Client ID
config.showSwitchAccount = YES;
config.useAgeRange = YES; //是否使用年龄段信息
//设置配置与回调, delegate 为开发者实现的自定义防沉迷回调对象
[AntiAddiction initWithConfig:config];
[AntiAddiction setDelegate:delegate];
FAAUConfig Config;
Config.ClientID = TEXT("your_client_id"); // TapTap 开发者中心对应 Client ID
Config.ShowSwitchAccount = false;
Config.UseAgeRange = true; //是否使用年龄段信息
AntiAddictionUE::Init(Config);
// 绑定 开发者实现的自定义防沉迷回调对象 AntiAddictionUE::OnCallBack
AntiAddictionUE::OnCallBack.BindUObject(this, &UAntiAddictionWidget::OnCallBack);