导航菜单
首页 » 问答 » 正文

关于独立游戏开发者及团队接入TapSDK及实名认证和防沉迷系统的相关学习

准备工作

请配合Tap开发者手册 开发者文档阅读本篇文章。

unity部分

首先你的游戏工程文件得是安卓

由于Tap开发者手册中推荐最低版本为10及以上,也就是api 。查看unity的apk打包中有无此版本的安卓包,如果没有则需要去到相关网站并下载 tool 再下载指定的安卓包版本。流程详见下载 SDK tools完成 SDK 安装、配置环境变量_6墨沫9的博客-CSDN博客 sdk tools。

由于Tap仅支持上架64位apk包,而在unity中用mono后端打包无法指定生成64位,所以我们要选择打包,取消勾选ARMv7,勾选ARM64。

tap开发者中心板块

创建游戏,游戏服务-开启服务,在应用配置界面-开通登录

配置签名证书,如果没有则去到香蕉云编-app打包上架工具类平台 ()制作个人签名,并在香蕉云编-查看app的sha1值|怎样查看apk的sha1 ()查看签名的MD5值(去掉符号),并下载 Names 软件到手机查看游戏包名(一般是com.开发商名.游戏名)。进入登录界面,然后在登录界面把自己的账号添加进测试人员名单。

最后在合规认证选择无版号然后开通服务。

导包

前言:如果按照开发者手册中的第二种方法即手动导包还要配置一大堆东西,稍微出点错即使没有出错也会导致无法正常导入或引用的问题,所以我们无论如何也得学会第一种导包方式,这种导包方式对以后的其他导包也有帮助。

配置git:首先你得下载git并安装,Git ()。

然后关闭unity和后台程序,根据开发者手册指示修改文件

上图只是的包,我们还需要实名认证的包,故按照上述操作顺序修改完整的.json如下,添加完4个包名

    "com.leancloud.realtime": "https://github.com/leancloud/csharp-sdk-upm.git#realtime-0.10.14",
    "com.leancloud.storage": "https://github.com/leancloud/csharp-sdk-upm.git#storage-0.10.14",
    "com.taptap.tds.bootstrap": "https://github.com/TapTap/TapBootstrap-Unity.git#3.12.1",
    "com.taptap.tds.common": "https://github.com/TapTap/TapCommon-Unity.git#3.12.1",
    "com.taptap.tds.login": "https://github.com/TapTap/TapLogin-Unity.git#3.12.1",

最后经过实测,如果按上述方法导入Anti防沉迷包会出现无法引用的问题,所以我们科学上网另外在官方提供的网站下载该包,并直接拖入工程asset文件夹中手动导包。

然后先科学上网,再打开unity进入工程,因为unity需要在网站下载相关Tap包。不行就再关闭unity及后台再科学上网,再不行就在 反复切换注册表中的包和项目中的包并配以手动刷新。直到出现以下画面

关于开发者手册中在untiy配置安卓的问题

经实测,勾不勾选都不影响打包后的apk实装手机运行,并且如果勾选且按开发者手册步骤修改xml文件会导致打包出来的apk文件实装手机后打不开软件,提示app isn't 的问题,所以我们选择跳过该步骤不勾选此项。

至此,准备工作就绪,正式开始实现功能之前,请先浏览一遍各项功能实现的顺序:初始化——初始化实名认证——开始Tap账号登录——开始实名认证并启动防沉迷系统——Tap登录和实名认证板块对接——实现静默登录——实现反沉迷一系列功能。

项目引用

using System;
using TapTap.Bootstrap;
using TapTap.Common;
using TapTap.Login;
using UnityEngine;
using Plugins.AntiAddictionUIKit;
using System.Collections;

初始化

private void InitTapSdk()
    {
        var config = new TapConfig.Builder()
            .ClientID("xxxxxxx")
            .ClientToken("xxxxxxxxxxxxxxxxx")
            .ServerURL("https://xxxxxxxxxxxxxx.cloud.tds1.tapapis.cn")
            .RegionType(RegionType.CN)
            .ConfigBuilder();
        TapBootstrap.Init(config);
    }

(接入反沉迷系统的前言:Tap官方声明自2022年8月起请确保上架应用需要接入及防沉迷系统,所以此篇文章默认和反沉迷板块都得实现,所以此篇文章将登录模块和防沉迷系统合并实现。)

初始化防沉迷模块

    //游戏的ClientID
    string gameIdentifier = "xxxxxxxxxxx";
    // 是否启用时长限制功能
    bool useTimeLimit = true;
    // 是否启用消费限制功能
    bool usePaymentLimit = false;
    // 是否显示切换账号按钮
    bool showSwitchAccount = false;
public IEnumerator InitAnti() //用协程来写该函数的原因在对接登录和实名认证模块解释
    {
        AntiAddictionUIKit.Init(gameIdentifier, useTimeLimit, usePaymentLimit, showSwitchAccount,
                   (antiAddictionCallbackData) =>
                   {
                       int code = antiAddictionCallbackData.code;
                       MsgExtraParams extras = antiAddictionCallbackData.extras;
                       // 根据 code 不同提示玩家不同信息,详见下面的说明
                       if (code == 500)//该回调可忽略,详见开发者手册的回调部分
                       {
                           // 开始计时
                           AntiAddictionUIKit.EnterGame();
                           Debug.Log("玩家登录后判断当前玩家可以进行游戏");
                       }
                   },
                   (exception) =>
                   {
                       // 处理异常
                   }
               );
        yield return new WaitForSeconds(1);//后文解释
        OnLoginClicked();//开始TapTap登录
        yield return new WaitForSeconds(1);//后文解释
        StartAnti();//开始实名认证
    }

完成两部分的初始化函数后,首先我们在Awake()函数中进行两部分的初始化,经实测,两部分的初始化顺序无冲突。

    public void Awake()
    {
        InitTapSdk();
        StartCoroutine(InitAnti());
    }

实现登录功能

该功能会拉起登录界面。经实测,第一次登录需要联网,后续如果实现了静默登录后则不需要联网即可登录。

    bool useTapLogin = false;//在Login后传入true
    string userIdentifier = "玩家的唯一标识";//在Login后传入该玩家的唯一标识

public async void OnLoginClicked()//官方Demo通过用Button来执行登录功能,故函数名为此,各位根据实际需求来修改
    {
            try
            {
                var tdsUser = await TDSUser.LoginWithTapTap(null);
                userIdentifier = tdsUser.ObjectId;
                label = $"login Success:{tdsUser}";
                Debug.Log($"login Success:{tdsUser}");
                useTapLogin = true;
            }
            catch (Exception e)
            {
                if (f is TapException error)
                {
                    label = $"Login Error:{error.code} message:{error.message}";
                }
                else
                {
                    label = $"Login Error:{e}";
                }
                throw;
            }
        }
    }

实现实名认证及防沉迷系统

public void StartAnti()
    {
        AntiAddictionUIKit.Startup(useTapLogin, userIdentifier);//从登录功能执行后获取到的两变量
        int ageRange = AntiAddictionUIKit.CurrentUserAgeLimit();//此临时变量是玩家年龄段,详见开发者手册,如果显示-1则需要刷新重新显示
        AntiAddictionUIKit.EnterGame();
        //GameManager.m_game.m_loadingScreen.LoadScene();此处即可跳转场景了,各位根据需求选择是否实现
    }

调试快速登录后与实名认证的对接

这部分本不应该出现,出现的原因是因为打包后需要从函数包中调取该函数名来构成完整函数,及函数抽壳的加密方式,详见关于unity的打包后反编译探索的个人学习成果。此过程需要时间来执行,所以导致我用mono打包时能正常执行但是用打包后执行出现时间差,导致登录后获取的两变量来不及传入实名认证板块时就已经执行了实名认证,最终报错,卡在实名认证页面不能进入游戏(首次登录正常但后续登录都报错)。作者想到的临时解决办法是,用协程来编写初始化实名认证及防沉迷板块,在登录和实名认证两部分插入1s的等待时间,使登录有足够的时间来传入变量。代码即上面()函数中已编写。

public IEnumerator InitAnti()
{
        yield return new WaitForSeconds(1);//此处解释
        OnLoginClicked();//开始TapTap登录
        yield return new WaitForSeconds(1);//此处解释
        StartAnti();//开始实名认证
}

实现静默登录功能

静默登录即首次登录后,后续登录从游戏缓存中获取上一次的登录信息,即不需要再手动登录,从而实现编码重复登录的功能。开发者手册中预留了该功能接口.(),详见文档:检查登录状态和用户信息。 我们实现静默登录直接修改我们一开始的登录部分函数即可,修改后的登录函数如下

public async void OnLoginClicked()
    {
        try//此try catch加入静默登录功能
        {
            var accesstoken = await TapLogin.GetAccessToken();
            Debug.Log("已登录");
            // 直接进入游戏
            var profile = await TapLogin.GetProfile();
            userIdentifier = profile.openid;
            useTapLogin = true;
        }
        catch (Exception e)
        {
            Debug.Log(e);
            Debug.Log("当前未登录");
            // 开始登录
            try
            {
                var tdsUser = await TDSUser.LoginWithTapTap(null);
                userIdentifier = tdsUser.ObjectId;
                label = $"login Success:{tdsUser}";
                Debug.Log($"login Success:{tdsUser}");
                useTapLogin = true;
            }
            catch (Exception f)
            {
                if (f is TapException error)
                {
                    label = $"Login Error:{error.code} message:{error.message}";
                }
                else
                {
                    label = $"Login Error:{f}";
                }
                throw;
            }
        }
    }

实现防沉迷系统的相关功能

根据Tap开发者团队的解释。我们只需要开始和停止记录游戏时长即可,该模块会自动轮番上报游戏时长,且自动弹出未成年人超时界面。

我们主要在实名认证函数内执行开始记录游戏时长的接口,上文已添加,此处不做修改,需要读者在退出游戏的函数内自行添加执行停止计时的接口。

public void StopAnti()
    {
        AntiAddictionUIKit.LeaveGame();//停止计时
    }

至此,所有工作完成,把该脚本挂载到进入游戏后的登录scene的上,并将其丢进don't ,建议挂载到上,方便调用且一直保留到退出游戏进程。最后,祝愿各位独立游戏开发者及独立游戏开发团队的游戏能成功上架,希望所有用心开发的国产游戏都能被下发游戏版号。

以下内容无关紧要,纯粹是作者叙述学习的过程以及替大家踩过的坑。

7天!整整7天啊!折腾了7天,熬夜熬了5天,气不过啊。每天9点起床,看电脑,吃午饭,看电脑,吃晚饭,看电脑,气的睡不着就熬到3点4点。那些已经上架游戏的前辈没有一个愿意分享的,开发者手册更离谱,把所有人都当大佬看,张口就是改xml文件,我当时看的时候压根都不知道xml是什么玩意。满意的地方还是有的,tap开发者团队在工单中回答我的问题非常详细且耐心,甚至主动提出帮我调试apk,在此感谢Tap开发团队。

1、第一步导包就不会了,没学过啊,折磨了我两天,整整两天。按照修改.json的方法下载包,结果不是报错搜索包错误就是进入工程时出错,科学上网也不行,然后就尝试手动导包,导了半天,引用无效的全改好了,结果还要配置一大堆文件,然后叫我勾选自定义主要清单选项,然后就是打包apk后实装打不开游戏,提示app未安装,迷了,取消勾选后打包出来的apk包就只有,我的游戏本体没了。真是吐血,最后在unity溯源报错,一条条点一条条搜,最后才知道原来要下载安装Git软件才能通过修改.json导包,哈?那你开发者手册怎么不说?谁知道啊?错误示例没有解释也没有。两天!才完成第一步导包。

2、接入进行Tap账号登录测试的时候不管在unity中调试还是实装手机后调试,不是闪退卡画面就是弹出的登录界面ui不显示二维码,一开始我以为是网络问题,因为我项目没有接入联网设置,然后折腾了一会发现不是这个问题,重新跟着开发者手册步骤做了几次才发现要配置签名并添加测试人员,哈?那你怎么放到最后才说,你怎么不一开始就做好这个工作才实现登录功能?然后就是开发者手册中的MD5值,手册提供了一个软件来获取APK签名的MD5值,结果呢,没一个软件能搜到的,这个软件一开口就叫你输入包名查找软件,嗯?包名是什么?软件的名称?apk包的名称?做了一堆尝试试了一堆错后,这个软件还是一个都搜不到,真**气人,啥也不知道,又不知道包名对不对,又不知道你软件权限给没给,又不知道你软件过期没,你软件联网没。最后我的判断就是这个软件是个水货,坏的!期间我自己找软件才找到 Names 这个软件来查找包名,然后自己找软件找网站试错,最终找到这个良心网站获取MD5,sha1值,还能自助制作签名。最后配置好签名并添加好测试人员,终于能拉起二维码了,一天半,我就干了这个。

3、开发者手册中提供的接口和函数都是部分代码,新人压根不知道怎么用,怎么调用接口,怎么使用回调函数,怎么try catch,怎么错误,好就好在它还给你提供一个官方的的Demo,折腾好久才自己写好一个像样的脚本。但是!但是!为什么实名认证和防沉迷系统没有Demo!分家了是吗?然后就是艰辛的学习代码,研究代码的过程,我甚至去研究它Anti程序集的代码和结构,折磨!我都不知道当时怎么成功拉起的实名认证界面,人都学傻了,当时整个人的精神状态就是,迷糊!

4、最后就是神奇的响应时间,为什么我要把初始化实名认证板块用协程来编写,最主要的还是我的能力有限,我能想到的办法有很多,但是这个能实现,且完美解决问题,就行了,人和代码,有一个能跑就行!回到故事,我真是服了,谁能想到登录账号后获取玩家唯一识别码的时间这么长(虽然才零点几秒),但就是这零点几秒折腾了我整整两天。

首先出现卡画面拉不起实名认证时我的第一反应是“完了,功能没实现”,然后反查代码,断点调试,最终我的判断是,功能能实现,代码逻辑问题不大,因为首次登录是完全没有问题的,后续登录才会卡界面。

然后我的第二反应就是try catch里错误报告,但是这个就更有意思了,我一开始接入实名认证板块的时候在unity调试全是报错的,一直改代码,断点调试,CSDN知乎b站群找了个遍都没有一点有用的方法,最后实在走投无路了,找客服,客服叫我开工单,然后我也不会用工单问问题,两个问题开了两个工单被开发者团队训了一遍,不同问题在同一个工单内解决。开发者团队给我的答复是unity平台不支持调试防沉迷,叫我实装手机上调试。嗯,你怎么不早说,都是同一家的东西,账号登录能unity调试,实名认证防沉迷你和我说不能在unity里调试。这谁又能想到,实装手机调试后,问题完美解决,本来就没有问题却折腾了我好一段时间。这是我第一次接入实名认证板块的故事。

然后我的第三反应是不会是进行代码混淆时的问题吧,因为开发者手册中明确提及到已进行了混淆代码处理,再次进行代码混淆会出现不可预期的错误。我当时对这个想法抱有很大的可能性,然后去学习,学是怎样进行代码裁切的,学习如何跳过对特定程序集的裁切进行保留源码。题外话,学习到通过在asset文件下新建一个link.xml文件来识别要跳过的程序集,我当时连程序集是什么都不知道,连xml是什么都不知道,连xml格式都不知道,甚至连怎么创建xml文件都不知道。然后就是学,学破头地学,一个个问题学,全学完了,保留了裁切,问题还是依旧,后续登录还是卡页面,我也不知道程序集有没有保留,我也不知道是不是被二次混淆导致的错误。然后我彻底冷静下来,开始头脑风暴,想一堆导致这个错误的可能性,全写下来一个个试。

然后我头脑中一个想法飘过,总该不会是登录账号后没来得及传给实名认证系统玩家唯一标识?这不太可能啊,这也太可笑了,哈哈哈时间不够。然后不抱希望地改用协程试了一下,差点没当场给我气晕过去。当时我写协程每一行代码下面都插一行yield (3s),等他个3秒,实装手机后不管重复登录还是静默登录还是删缓存重登都没问题了,问题顺利解决,人都气麻了。接个和实名认证防沉迷系统折磨了我7天,这7天谁知道我怎么过来的。

评论(0)

二维码