实名认证和防沉迷开发指南
使用合规认证服务之前,需要在 开发者中心后台 > 游戏服务 > 开发与构建 > 合规认证 处开通服务,可选择「已有版号」或「暂无版号」方案。
权限说明
- Unity
- Android Java
- Android Kotlin
- iOS Swift
- iOS Objective-C
该模块需要如下权限:
权限 | 使用目的 | 权限申请时机 |
---|---|---|
网络权限 | 用于正常网络请求 | 用户首次使用该功能时会申请权限 |
获取网络状态权限 | 用于检测当前网络连接是否有效 | 用户首次使用该功能时会申请权限 |
该模块将在应用中添加如下权限:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
该模块需要如下权限:
权限 | 使用目的 | 权限申请时机 |
---|---|---|
网络权限 | 用于正常网络请求 | 用户首次使用该功能时会申请权限 |
获取网络状态权限 | 用于检测当前网络连接是否有效 | 用户首次使用该功能时会申请权限 |
该模块将在应用中添加如下权限:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
集成前准备
- 参考 准备工作 创建应用、开启应用配置。
- 参考合规认证功能介绍中准备工作开通防沉迷服务。
- 合规认证模块依赖于 TapTap 登录模块,开发者接入前应先接入 TapTap 登录 相关依赖。
SDK 配置
可以在 下载页 获得 TapSDK,引入防沉迷模块。
- Unity
- Android Java
- Android Kotlin
- iOS Swift
- iOS Objective-C
第一步:添加 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.5.7",
"com.taptap.sdk.login":"4.5.7",
"com.taptap.sdk.compliance":"4.5.7",
}
但需要注意的是,需在 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.5.7",
"com.taptap.sdk.login":"https://github.com/taptap/TapSDKLogin-Unity.git#4.5.7",
"com.taptap.sdk.compliance":"https://github.com/taptap/TapSDKCompliance-Unity.git#4.5.7",
}
在 Unity 顶部菜单中选择 Window > Package Manager 可查看已经安装在项目中的包。
本地文件导入
- 在 下载页 下载下列模块对应
unitypackage
文件,并在 Unity 项目中依次通过 Assets > Import Packages > Custom Packages 进行导入,包括:
TapSDK_Core.unitypackage
TapTapSDK 核心模块,必选。TapSDK_Login.unitypackage
TapTapSDK 登录模块,必选。TapSDK_Compliance.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.5.7'
implementation 'com.taptap.sdk:tap-compliance:4.5.7'
// 实名认证模块依赖登录
implementation 'com.taptap.sdk:tap-login:4.5.7'
// 需添加json解析对应依赖
implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.4.1'
}
- 项目根目录的 build.gradle 添加仓库地址:
allprojects {
repositories {
google()
mavenCentral()
}
}
- app module 的 build.gradle 添加对应依赖:
dependencies {
implementation 'com.taptap.sdk:tap-core:4.5.7'
implementation 'com.taptap.sdk:tap-compliance:4.5.7'
// 实名认证模块依赖登录
implementation 'com.taptap.sdk:tap-login:4.5.7'
// 需添加json解析对应依赖
implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.4.1'
}
iOS 提供通过添加 cocoaPods 远程依赖和使用本地文件导入两种集成方式,推荐使用远程依赖方式。
远程依赖
- 在工程 Podfile 文件中对应模块下添加依赖:
pod 'TapTapComplianceSDK', '~> 4.5.5'
- 执行
Pod install
下载对应依赖文件 - 将工程 Pods 目录下
TapTapComplianceSDK/Frameworks/TapTapComplianceResource.bundle
和TapTapLoginSDK/Frameworks/TapTapLoginResource.bundle
等资源文件导入工程中
本地文件依赖
合规认证依赖于初始化和 TapTap 登录模块,使用本地文件方式添加依赖时,需先参考 TapSDK 集成 和 TapTap 登录 添加对应本地文件依赖项。
- 在下载页下载如下文件:
TapTapComplianceSDK.xcframework
合规认证依赖库TapTapComplianceResource.bundle
合规认证资源文件
- 在工程中添加
framework
静态库,注意添加时选择 Embed 方式为 Do Not Embed,导入bundle
资源文件
iOS 提供通过添加 cocoaPods 远程依赖和使用本地文件导入两种集成方式,推荐使用远程依赖方式。
远程依赖
- 在工程 Podfile 文件中对应模块下添加依赖:
pod 'TapTapComplianceSDK', '~> 4.5.5'
- 执行
Pod install
下载对应依赖文件 - 将工程 Pods 目录下
TapTapCompilanceSDK/Frameworks/TapTapComplianceResource.bundle
和TapTapLoginSDK/Frameworks/TapTapLoginResource.bundle
等资源文件导入工程中
本地文件依赖
合规认证依赖于初始化和 TapTap 登录模块,使用本地文件方式添加依赖时,需先参考 TapSDK 集成 和 TapTap 登录 添加对应本地文件依赖项。
- 在下载页下载如下文件:
TapTapComplianceSDK.xcframework
合规认证依赖库TapTapComplianceResource.bundle
合规认证资源文件
- 在工程中添加
framework
静态库,注意添加时选择 Embed 方式为 Do Not Embed,导入bundle
资源文件
防沉迷 SDK 需要联网和发送请求数据的权限,请开发者注意在项目中声明相应权限。
初始化
合规认证模块支持设置是否显示切换账号和使用年龄段信息,开发者可在 TapSDK 初始化 时添加对应的配置,具体如下:
- Unity
- Android Java
- Android Kotlin
- iOS Swift
- iOS Objective-C
using TapSDK.Core;
using TapSDK.Compliance;
// 核心配置
TapTapSdkOptions coreOptions = new TapTapSdkOptions();
// TODO: coreOptions 应用参数配置
// 合规认证配置
TapTapComplianceOption complianceOption = new TapTapComplianceOption
{
showSwitchAccount = true,
useAgeRange = false
};
// 其他模块配置项
TapTapSdkBaseOptions[] otherOptions = new TapTapSdkBaseOptions[]
{
complianceOption
};
// TapSDK 初始化
TapTapSDK.Init(coreOptions, otherOptions);
import com.taptap.sdk.compliance.option.TapTapComplianceOptions;
import com.taptap.sdk.core.TapTapLanguage;
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;
TapTapSdkOptions tapSdkOptions = new TapTapSdkOptions(
clientId, // 游戏 Client ID
clientToken, // 游戏 Client Token
TapTapRegion.CN // 游戏可玩区域: [TapTapRegion.CN]=国内 [TapTapRegion.GLOBAL]=海外
);
tapSdkOptions.setEnableLog(enableLog);
// 可选配置 合规模块
TapTapComplianceOptions tapComplianceOptions = new TapTapComplianceOptions(
true, // 是否显示切换账号按钮,默认为 false
true // 游戏是否需要获取真实年龄段信息,默认为 true
);
// 初始化 TapSDK
TapTapSdk.init(context, tapSdkOptions, tapComplianceOptions);
import com.taptap.sdk.core.TapTapSdk
import com.taptap.sdk.core.TapTapSdkOptions
import com.taptap.sdk.compliance.option.TapTapComplianceOptions
import com.taptap.sdk.core.TapTapLanguage
import com.taptap.sdk.core.TapTapRegion
TapTapSdk.init(
context = context,
sdkOptions = TapTapSdkOptions(
clientId = clientId,
clientToken = clientToken,
region = TapTapRegion.CN,
preferredLanguage = TapTapLanguage.ZH_HANS,
enableLog = false
),
options = arrayOf(
TapTapComplianceOptions(
//
showSwitchAccount = true,
//
useAgeRange = false,
)
)
)
import TapTapComplianceSDK
import TapTapCoreSDK
// 核心配置
let coreOptions = TapTapSdkOptions()
// TODO: coreOptions 应用参数配置
// 合规认证配置
let complianceOptions = TapTapComplianceOptions()
complianceOptions.useAgeRange = false
complianceOptions.showSwitchAccount = true
// 其他模块配置项
let otherOptions = [complianceOptions]
// TapSDK 初始化
TapTapSDK.initWith(coreOptions, otherOptions: otherOptions)
#import <TapTapCoreSDK/TapTapSDK.h>
#import <TapTapComplianceSDK/TapTapComplianceOptions.h>
TapTapSdkOptions *coreOptions = [[TapTapSdkOptions alloc] init];
// TODO: coreOptions 应用参数配置
/// 合规认证配置
TapTapComplianceOptions *complianceOptions = [[TapTapComplianceOptions alloc] init];
complianceOptions.useAgeRange = NO; // 是否使用年龄段信息
complianceOptions.showSwitchAccount = YES; // 是否显示切换账号
// 其他模块配置项
NSArray *otherOptions = @[complianceOptions];
// TapSDK 初始化
[TapTapSDK initWithOptions:coreOptions otherOptions:otherOptions];
参数说明
showSwitchAccount
是否显示切换账号按钮,默认为 false 。如果游戏支持切换账号功能则可以设置为 true,当玩家点击切换账号按钮后,SDK 会触发1001
回调,游戏可根据该回调 code 做相应处理useAgeRange
游戏是否需要获取真实年龄段信息,默认为 true 。当为 true 时,使用 Tap 实名时会需要用户主动授权,当设置为 false 时,使用 Tap 实名时会进行无 UI 交互的静默授权
回调设置
为了处理用户在进行合规认证时触发的不同事件,游戏需通过设置回调进行监听。示例如下:
- Unity
- Android Java
- Android Kotlin
- iOS Swift
- iOS Objective-C
using TapSDK.Compliance;
private Action<int, string> callback => (code, s) => {
// do something
};
TapTapCompliance.RegisterComplianceCallback(callback);
import com.taptap.sdk.compliance.TapTapCompliance;
import com.taptap.sdk.compliance.TapTapComplianceCallback;
import com.taptap.sdk.compliance.constants.ComplianceMessage;
TapTapCompliance.registerComplianceCallback(new TapTapComplianceCallback() {
@Override
public void onComplianceResult(int code, @Nullable Map<String, ?> extra) {
// 合规结果
switch (code) {
case ComplianceMessage.LOGIN_SUCCESS:
// do something
break;
case ComplianceMessage.EXITED:
// do something
break;
case ComplianceMessage.SWITCH_ACCOUNT:
// do something
break;
case ComplianceMessage.PERIOD_RESTRICT:
// do something
break;
case ComplianceMessage.DURATION_LIMIT:
// do something
break;
case ComplianceMessage.INVALID_CLIENT_OR_NETWORK_ERROR:
// do something
break;
default:
break;
}
}
});
import com.taptap.sdk.compliance.TapTapCompliance
import com.taptap.sdk.compliance.TapTapComplianceCallback
import com.taptap.sdk.compliance.constants.ComplianceMessage
TapTapCompliance.registerComplianceCallback(
callback = object : TapTapComplianceCallback {
override fun onComplianceResult(code: Int, extra: Map<String, Any>?) {
when (code) {
ComplianceMessage.LOGIN_SUCCESS -> {
// 登录成功
}
ComplianceMessage.EXITED -> {
// 退出登录
}
ComplianceMessage.SWITCH_ACCOUNT -> {
// 切换账号
}
}
}
}
)
import TapTapComplianceSDK
// 实现 TapTapComplianceDelegate 协议
extension GameMainController: TapTapComplianceDelegate {
func complianceCallback(with code: TapComplianceResultHandlerCode, extra: String?) {
print("TapCompliance result code = \(code.rawValue)")
}
}
// 注册合规认证回调
TapTapCompliance.register(self)
#import <TapTapComplianceSDK/TapTapCompliance.h>
@interface GameMainController() <TapTapComplianceDelegate>
@end
@implementation GameMainController
- (void)complianceCallbackWithCode:(TapComplianceResultHandlerCode)code extra:(NSString * _Nullable)extra {
// 登录成功
if (code == TapComplianceResultHandlerLoginSuccess) {
// ....
}
}
// 注册合规认证回调
- (void) registerCallback {
[TapTapCompliance registerComplianceDelegate:self];
}
回调参数中 code 用于标识回调类型, extra 为对应提示信息
回调 code | 回调类型 | 触发逻辑 |
---|---|---|
500 | LOGIN_SUCCESS | 玩家未受到限制,正常进入游戏 |
1000 | EXITED |