Cocos creator 接入 TapTap登录、实名认证、防沉迷

cocos 版本 3.8.2 

一、使用cocos构建安卓平台项目

cocos编辑器菜单-项目-构建发布-选择安卓平台-构建

二、集成相关SDK

1、使用Android studio打开项目,将视图更换为project

2、打开项目根目录\app\build.gradle,在dependencies{}块中添加以下代码

dependencies {
    // 其他代码
    ... 

    // 添加以下代码
    implementation 'com.taptap.sdk:tap-core:4.5.4'
    implementation 'com.taptap.sdk:tap-kit:4.5.4'
    implementation 'com.taptap.sdk:tap-login:4.5.4'
    implementation 'com.taptap.sdk:tap-compliance:4.5.4'

    // 继续添加TapSDK相关的强制依赖
    implementation 'com.google.code.gson:gson:2.8.9'
    implementation 'com.squareup.okhttp3:okhttp:4.9.1'
    implementation 'androidx.appcompat:appcompat:1.3.1'
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4'
    implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.4.1'
}

3、如果targetSdkVersion < 29,打开项目根目录\app\AndroidManifest.xml,在manifest中添加xmlns:tools="http://schemas.android.com/tools",在application中添加tools:remove="android:requestLegacyExternalStorage"

4、打开项目根目录\app\proguard-rules,添加相关代码跳过对 TapSDK 的混淆

# ========== TapSDK 核心保留规则(必选) ==========
# 保留 TapTap SDK 相关的类,防止 R8 移除
-keep class com.taptap.sdk.** { *; }
-keep class com.taptap.sdk.compliance.api.** { *; }
-keep class com.taptap.sdk.core.** { *; }
-keep class com.taptap.sdk.login.** { *; }
-keep class com.taptap.sdk.servicemanager.** { *; }

# ========== 其他相关的保留规则(可选) ==========
# 防止移除 Kotlin 相关的序列化类
-keep class kotlinx.serialization.** { *; }
# 解决 `Companion` 类丢失的问题
-keepclassmembers class * {
    public static final kotlin.jvm.internal.DefaultConstructorMarker Companion;
}
# 防止混淆 Kotlin `Companion` 对象
-keepnames class *$Companion
# 处理 R8 的代码优化
-dontwarn com.taptap.sdk.**
-dontwarn kotlinx.serialization.**
# 保留 Kotlin 协程相关类,防止 R8 移除
-keep class kotlinx.coroutines.** { *; }
-keepclassmembers class kotlinx.coroutines.** { *; }
-dontwarn kotlinx.coroutines.**

5、打开项目根目录\app\src\你的游戏包名\AppActivity.java,添加相关代码

package com.cocos.game; // 确认这个包名无误,在cocos打包时包名是什么就填什么

import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import java.util.Map;
import com.cocos.lib.CocosHelper;
import com.cocos.lib.CocosJavascriptJavaBridge;
import com.taptap.sdk.core.TapTapRegion;
import com.taptap.sdk.core.TapTapSdk;
import com.taptap.sdk.core.TapTapSdkOptions;
import com.taptap.sdk.kit.internal.callback.TapTapCallback;
import com.taptap.sdk.kit.internal.exception.TapTapException;
import com.taptap.sdk.login.Scopes;
import com.taptap.sdk.compliance.TapTapCompliance;
import com.taptap.sdk.login.TapTapAccount;
import com.taptap.sdk.login.TapTapLogin;
import com.taptap.sdk.compliance.TapTapComplianceCallback;
import com.taptap.sdk.compliance.constants.ComplianceMessage;

public class AppActivity extends CocosActivity {

    // 在onCreate里赋值实例用
    private static AppActivity instance;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        instance = this;  // 赋值实例

        // 初始化 TapTap SDK
        initTapTapSdk();

        // 注册TapTap防沉迷回调
        TapTapCompliance.registerComplianceCallback(new TapTapComplianceCallback() {
            @Override
            public void onComplianceResult(int code, @Nullable Map<String, ?> extra) {
                Log.d("TapTapCompliance", "认证结果 Code: " + code);
                switch (code) {
                    case ComplianceMessage.LOGIN_SUCCESS:
                        Log.d("TapTapCompliance", "认证成功,允许进入游戏");
                        callCocosLoginSuccess();  // 通知 Cocos 端登录成功
                        break;
                    case ComplianceMessage.EXITED:
                        Log.d("TapTapCompliance", "用户退出认证");
                        break;
                    case ComplianceMessage.SWITCH_ACCOUNT:
                        Log.d("TapTapCompliance", "切换账号");
                        break;
                    case ComplianceMessage.PERIOD_RESTRICT:
                        Log.d("TapTapCompliance", "未成年人时间限制");
                        break;
                    case ComplianceMessage.DURATION_LIMIT:
                        Log.d("TapTapCompliance", "游戏时间已用完");
                        break;
                    case ComplianceMessage.INVALID_CLIENT_OR_NETWORK_ERROR:
                        Log.d("TapTapCompliance", "客户端或网络错误");
                        break;
                    default:
                        Log.d("TapTapCompliance", "未知认证结果");
                        break;
                }
            }
        });
    }

    
    // 初始化 TapTap SDK 方法
    private void initTapTapSdk() {
        String clientId = "你的 Client ID";  // 在Tap后台获取
        String clientToken = "你的 Client Token";  // 在Tap后台获取

        // 是否开启 log,Debug 开启,Release 关闭
        boolean enableLog = BuildConfig.DEBUG;

        TapTapSdkOptions tapSdkOptions = new TapTapSdkOptions(
                clientId,       // 游戏 Client ID
                clientToken,    // 游戏 Client Token
                TapTapRegion.CN // 游戏区域
        );

        Log.d("TapTapLogin", "TapTap SDK 初始化成功!");

        TapTapSdk.init(this, tapSdkOptions);
    }


    // 登录TapTap账号方法,这个方法需要在cocos那边做一个按钮,把这个方法绑定到那个按钮上
    public static AppActivity getInstance() {
        return instance;
    }
    public static void tapTapLogin() {
        Log.d("TapTapLogin", "开始 TapTap 登录...");

        AppActivity activity = getInstance(); // 获取实例
        if (activity == null) {
            Log.e("TapTapLogin", "AppActivity 实例为空,无法进行登录");
            return;
        }

        // 定义授权范围
        String[] scopes = new String[]{Scopes.SCOPE_PUBLIC_PROFILE, Scopes.SCOPE_BASIC_INFO};

        // 执行 TapTap 登录
        TapTapLogin.loginWithScopes(activity, scopes, new TapTapCallback<TapTapAccount>()                 {
            @Override
            public void onSuccess(TapTapAccount tapTapAccount) {
                String openId = tapTapAccount.getOpenId();

                Log.d("TapTapLogin", "登录成功:" + openId);

                // 启动 TapTap 防沉迷认证
                String unionId = tapTapAccount.getUnionId();
                if (unionId.trim().isEmpty()) {
                    Log.e("TapTapLogin", "unionId 为空,无法启动防沉迷认证");
                } else {
                    TapTapCompliance.startup(activity, unionId);
                }
            }

            @Override
            public void onFail(@NonNull TapTapException exception) {
                Log.e("TapTapLogin", "登录失败:" + exception.getMessage());
            }

            @Override
            public void onCancel() {
                Log.d("TapTapLogin", "用户取消登录");
            }
        });
    }


    // 通知 Cocos 端登录成功(这里我的游戏不需要传参给cocos端,需要传参的可以自己加上)
    private static void callCocosLoginSuccess() {
        CocosHelper.runOnGameThread(() -> {
            try {
                CocosJavascriptJavaBridge.evalString("window.onTapTapLoginSuccess && window.onTapTapLoginSuccess()");
            } catch (Exception e) {
                Log.e("CocosBridge", "evalString 执行失败", e);
            }
        });
    }

    // ✅ 退出认证
    public static void exitTapTapCompliance() {
        TapTapCompliance.exit();
    }
}

6、打开cocos端,在你的相关脚本上添加调用代码和回调代码

// 先定义一个回调函数,用于处理登录成功的逻辑
declare global {
    interface Window {
        onTapTapLoginSuccess: () => void;
    }
}

export class LoginPage extends Component {
    onLoad() {
        // 绑定全局登录成功回调
        window.onTapTapLoginSuccess = this.onTapTapLoginSuccess.bind(this);
    }


    // TapTap登录 (这个方法绑定到登录按钮上,用于调用AppActivity.java里的tapTapLogin)
    onTapLogin() {
        console.log("开始调用 Android TapTap 登录...");

        (globalThis as any).jsb.reflection.callStaticMethod(
            "com/cocos/game/AppActivity", // Java 类路径,注意要填写你项目的实际路径
            "tapTapLogin", // AppActivity.java里的方法名
            "()V"
        );
    }

    
    // 登录成功且java那边回调为500时,调用onTapTapLoginSuccess显示进入游戏界面
    onTapTapLoginSuccess() {
        // 这里写你的登录成功逻辑,我的游戏主要就是一些UI显示
        this.background.node.active = true;
        this.nicknameInput.node.active = true;
        this.loginButton.node.active = true;
        this.TapLoginButton.node.active = false;
    }
}

7、后面就是构建、打包、测试,在tap后台-游戏服务-合规认证,可以申请各种条件下的测试账号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值