为啥要接GCloud呢?因为我们项目采用的方式有问题,这是腾讯专家说的,然后只能改了。先说下我们这边的方式,客户端是请求PHP后台生成的一个txt文件(Json格式的),然后获取CDN和区服相关信息,根据参数是否显示审核服还是正式服,接着再去请求一堆区服数据的txt。如果在选服界面的话,还需要每隔5秒或者10秒重新请求,判断是否有新的服务器开了或服务器状态变化了(比如变成维护了)。
        具体情况说完,开始接入,然后发现又踩坑里去了。先说下SDK版本,是在官网下载的Unity插件,版本是GCloud1.1.5.185491.2018111900.unityPackage,然后开始编译,各种失败,iOS和Android各种编译不通过。iOS的之前有遇到过同样的问题,猜是不是XCode10的问题,向官方要支持XCode10的framework,然后给了个Cocos和UE4版本的,嗯,什么鬼?framework全部替换成Cocos和UE4的,iOS编译通过,运行也没问题,能获取到区服数据。


        接下来是Android的问题,错误经常看到,就猜到是jar包重复,检查了下,发现MSDK和GCloud都包含了android-support-v4.jar,随意删除一个,编译成功。以为这样就结束了,太天真了。运行时一直获取不到区服数据,调试发现IsConnected接口,一直返回没有成功连接上服务器,然后去官方文档上仔细看了下,猜估计是主Activity没有继承GCloud的Activity。然后就艹了,啥玩意呀,都什么年代了,还用这么老的技术,MSDK都是用命令行修改一堆参数生成一个Jar包,接下来啥的都不用管,一到GCloud,要怎么麻烦,我们怎么接。
        咋办,大厂时间都定好了,没几天了,只能硬上了,找到编译成MSDK jar包的源码,修改源码,生成一个支持GCloud的MSDK jar包。
        在DeployAndroid.cs脚本的GenerateAdapter()接口中,添加如下代码,不要忘了拷贝相关的Jar包到该目录:


        找到Assets\Msdk\Adapter\Android\java\src\com\example\wegame目录,对MGameActivity.java进行修改。其实也就是添加下代码,代码不是乱写的呀,也不要去看文档,直接用反编译工具反编译GCloudSDK中的GCloudUnity.jar包,然后开始拷贝代码就行:
        MGameActivity.java原来的:

package com.example.wegame;import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;import com.tencent.bugly.msdk.crashreport.CrashReport;
import com.tencent.msdk.WeGame;
import com.tencent.msdk.adapter.MsdkActivity;
import com.tencent.msdk.api.LoginRet;
import com.tencent.msdk.api.WGPlatform;
import com.tencent.msdk.consts.CallbackFlag;
import com.tencent.msdk.consts.EPlatform;
import com.tencent.msdk.consts.TokenType;
import com.tencent.msdk.tools.Logger;/**.* 游戏主Activity需要继承MsdkActivity*/public class MGameActivity extends MsdkActivity {private static Activity activity = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);activity = this;}@Overrideprotected void onDestroy() {super.onDestroy();activity = null;}// MSDKDemo Functions/*** TODO Game 拉起支付示例,游戏需要参考米大师文档自己编写支付相关代码* 需要先安装支付示例工程AndroidPaySample(位于MSDKzip包中的Tencent AndroidPayRelease.zip中)* 才能拉起支付Demo*/public static void launchPayDemo() {Logger.d("called");Intent i = new Intent("com.tencent.pay.sdksample.AndroidPaySample");LoginRet lr = new LoginRet();WGPlatform.WGGetLoginRecord(lr);// 注意:这里需要判断登录态是否有效if (lr.flag != CallbackFlag.eFlag_Succ) {if (lr.platform == EPlatform.ePlatform_Weixin.val()) {// accesstoken过期,尝试刷新票据if (lr.flag == CallbackFlag.eFlag_WX_AccessTokenExpired) {WGPlatform.WGRefreshWXToken();return;} else {// 微信登录态失效,引导用户重新登录授权return;}} else {// 手Q登录态失效,引导用户重新登录授权return;} }i.putExtra("userId", lr.open_id);i.putExtra("offerId", WeGame.getInstance().offerId);if (lr.platform == WeGame.WXPLATID) {i.putExtra("userKey", lr.getTokenByType(TokenType.eToken_WX_Access));i.putExtra("sessionType", "wc_actoken");i.putExtra("sessionId", "hy_gameid");} else if (lr.platform == WeGame.QQPLATID) {i.putExtra("userKey", lr.getTokenByType(TokenType.eToken_QQ_Pay));i.putExtra("sessionType", "kp_actoken");i.putExtra("sessionId", "openid");}i.putExtra("pf", WGPlatform.WGGetPf(""));i.putExtra("zoneId", "1");i.putExtra("pfKey", WGPlatform.WGGetPfKey());i.putExtra("acctType", "common");i.putExtra("saveValue", "60");i.putExtra("msdk", true);activity.startActivity(i);}/*** 游戏崩溃后会将堆栈信息上报到腾讯组件————灯塔中。这时制造native层崩溃测试异常上报*/public static void nativeCrashTest() {// Native异常测试Logger.d("called");CrashReport.testNativeCrash();}/*** 游戏崩溃后会将堆栈信息上报到腾讯组件————灯塔中。这时制造空指针异常测试异常上报*/public static void nullPointerExceptionTest() {// 空指针异常测试Logger.d("called");Handler mainHandler = new Handler(Looper.getMainLooper());mainHandler.post(new Runnable() {@Overridepublic void run() {String str = null;str.equals("");}});}
}

MGameActivity.java修改后:

package com.example.wegame;import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;import com.tencent.bugly.msdk.crashreport.CrashReport;
import com.tencent.msdk.WeGame;
import com.tencent.msdk.adapter.MsdkActivity;
import com.tencent.msdk.api.LoginRet;
import com.tencent.msdk.api.WGPlatform;
import com.tencent.msdk.consts.CallbackFlag;
import com.tencent.msdk.consts.EPlatform;
import com.tencent.msdk.consts.TokenType;
import com.tencent.msdk.tools.Logger;
import java.util.ArrayList;
import java.util.List;
import android.util.Log;
import com.tencent.gcloud.GCloud;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;/**.* 游戏主Activity需要继承MsdkActivity*/public class MGameActivity extends MsdkActivity {private static Activity activity = null;private static final String tag = "GCloud";private static final int REQUEST_CODE_ASK_PERMISSION = 101;private boolean bEnableRequestPermission = true;public void setEnableRequestPermission(boolean paramBoolean){this.bEnableRequestPermission = paramBoolean;}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);activity = this;Object localObject = GCloud.Instance;if (!((GCloud)localObject).initialize(this)){Log.i("GCloud", "Warning!Reduplicate game activity was detected.Activity will finish immediately.");finish();return;}}protected void onNewIntent(Intent paramIntent){try{super.onNewIntent(paramIntent);GCloud.Instance.onNewIntent(paramIntent);}catch (Exception localException){Log.w("Exception", "onNewIntent Exception:" + localException.toString());}}protected void onPause(){try{super.onPause();GCloud.Instance.onPause();}catch (Exception localException){Log.w("Exception", "onPause Exception:" + localException.toString());}}protected void onResume(){try{super.onResume();GCloud.Instance.onResume();}catch (Exception localException){Log.w("Exception", "onResume Exception:" + localException.toString());}}protected void onRestart(){try{super.onRestart();GCloud.Instance.onRestart();}catch (Exception localException){Log.w("Exception", "onDestroy Exception:" + localException.toString());}}@Overrideprotected void onDestroy() {super.onDestroy();activity = null;try{super.onDestroy();GCloud.Instance.onDestroy();}catch (Exception localException){Log.w("Exception", "onDestroy Exception:" + localException.toString());}}public void onConfigurationChanged(Configuration paramConfiguration){super.onConfigurationChanged(paramConfiguration);Log.i("GCloud", "onConfigurationChanged");}public void onSaveInstanceState(Bundle paramBundle){super.onSaveInstanceState(paramBundle);Log.i("GCloud", "onSaveInstanceState");}protected void onActivityResult(int paramInt1, int paramInt2, Intent paramIntent){super.onActivityResult(paramInt1, paramInt2, paramIntent);GCloud.Instance.onActivityResult(paramInt1, paramInt2, paramIntent);}// MSDKDemo Functions/*** TODO Game 拉起支付示例,游戏需要参考米大师文档自己编写支付相关代码* 需要先安装支付示例工程AndroidPaySample(位于MSDKzip包中的Tencent AndroidPayRelease.zip中)* 才能拉起支付Demo*/public static void launchPayDemo() {Logger.d("called");Intent i = new Intent("com.tencent.pay.sdksample.AndroidPaySample");LoginRet lr = new LoginRet();WGPlatform.WGGetLoginRecord(lr);// 注意:这里需要判断登录态是否有效if (lr.flag != CallbackFlag.eFlag_Succ) {if (lr.platform == EPlatform.ePlatform_Weixin.val()) {// accesstoken过期,尝试刷新票据if (lr.flag == CallbackFlag.eFlag_WX_AccessTokenExpired) {WGPlatform.WGRefreshWXToken();return;} else {// 微信登录态失效,引导用户重新登录授权return;}} else {// 手Q登录态失效,引导用户重新登录授权return;} }i.putExtra("userId", lr.open_id);i.putExtra("offerId", WeGame.getInstance().offerId);if (lr.platform == WeGame.WXPLATID) {i.putExtra("userKey", lr.getTokenByType(TokenType.eToken_WX_Access));i.putExtra("sessionType", "wc_actoken");i.putExtra("sessionId", "hy_gameid");} else if (lr.platform == WeGame.QQPLATID) {i.putExtra("userKey", lr.getTokenByType(TokenType.eToken_QQ_Pay));i.putExtra("sessionType", "kp_actoken");i.putExtra("sessionId", "openid");}i.putExtra("pf", WGPlatform.WGGetPf(""));i.putExtra("zoneId", "1");i.putExtra("pfKey", WGPlatform.WGGetPfKey());i.putExtra("acctType", "common");i.putExtra("saveValue", "60");i.putExtra("msdk", true);activity.startActivity(i);}/*** 游戏崩溃后会将堆栈信息上报到腾讯组件————灯塔中。这时制造native层崩溃测试异常上报*/public static void nativeCrashTest() {// Native异常测试Logger.d("called");CrashReport.testNativeCrash();}/*** 游戏崩溃后会将堆栈信息上报到腾讯组件————灯塔中。这时制造空指针异常测试异常上报*/public static void nullPointerExceptionTest() {// 空指针异常测试Logger.d("called");Handler mainHandler = new Handler(Looper.getMainLooper());mainHandler.post(new Runnable() {@Overridepublic void run() {String str = null;str.equals("");}});}    @TargetApi(23)public void onRequestPermissionsResult(int paramInt, String[] paramArrayOfString, int[] paramArrayOfInt){Log.i("GCloud", "onRequestPermissionsResult: " + paramInt);super.onRequestPermissionsResult(paramInt, paramArrayOfString, paramArrayOfInt);switch (paramInt){case 101: if ((paramArrayOfString.length <= 0) || (paramArrayOfInt.length <= 0)) {Log.e("GCloud", "onRequestPermissionsResult: permissions or grantResults is empty");} else {for (int i = 0; i < paramArrayOfString.length; i++) {if (paramArrayOfInt[0] == 0) {Log.i("GCloud", "onRequestPermissionsResult: " + paramArrayOfString[i] + " Granted!");} else {Log.i("GCloud", "onRequestPermissionsResult: " + paramArrayOfString[i] + " Denied!");}}}break;}}static{System.loadLibrary("abase");System.loadLibrary("TDataMaster");System.loadLibrary("gcloud");}
}

然后重新使用MSDK自带的Deploy按钮重新生成一个MSDK jar包,只需要这个,其他的都不需要,这样易于管理。编译通过,运行也没有问题,可以获取到区服数据。说句老实话,GCloud也不咋样,获取区服数据有点慢,需要1到10秒左右,怪不得完美世界(手游)在登陆后要播放CG,估计就是在等获取区服数据,为啥,反编译看到有GCloud的相关库。

顺带说下,之前项目没有采用GVoice语音,用的是另外公司的SDK,主要是免费,嗯,免费。但最近在线上测试中,Crash率几乎一半都在语音SDK上,所以商量后,决定采用GVoice语音来减少Crash率(大厂对Crash率要求有点高)。之前稍微接过GVoice玩了下,因此接起来还是很快的。官方还提供了XCode10版本的,因此iOS上编译也没有太大问题。就有一个小问题,语音转文字,不要用GCloudVoiceMode.RSTT模式,要用GCloudVoiceMode.Translation模式。这个稍微坑了下,官方demo用这个模式可以转换文字,我们项目就不行,用GCloudVoiceMode.Translation就可以,有点小坑。

[Unity]腾讯SDK踩坑之路(4)--GCloud+GVoice坑相关推荐

  1. [Unity]腾讯SDK踩坑之路(2)--配置Xcode工程(MSDK和米大师配置代码冲突)

    前不久接完MSDK,又花了几天时间改之前的打包工具和MSDK的一些代码,主要是这边有骚操作,需要不带SDK的包和带SDK的包,还有很多杂七杂八的包.然后顺带着打了个iOS测试包,检测SDK有没有接好. ...

  2. [Unity]腾讯SDK踩坑之路(5)--应用宝省流量更新+米大师托管模式坑

    之前项目平台没有定好是大厂独代模式,所以在大厂提出省流量更新问题的时候,大厂给的建议是用大厂自家的应用宝省流量更新功能,说是项目组自己去写这个功能的话,需要的时间估计会有点超过预期,想了一下,也对,对 ...

  3. Android SDK 开发——发布使用踩坑之路

    前言 在 Android 开发过程中,有些功能是通用的,或者是多个业务方都需要使用的. 为了统一功能逻辑及避免重复开发,因此将该功能开发成一个 SDK 是相当有必要的. 背景 刚好最近自己遇到了类似需 ...

  4. Unity打包ARCore程序踩过的坑

    个人纪录Unity打包ARCore程序踩过的坑 首先一定要挂梯子,因为新的ARCore要求高版本的gradle,Unity里面的gradle版本可能过低(使用2019 LTS版时,ARCore的SDK ...

  5. mybatis mapper.xml dtd_全栈开发踩坑之路4-用MyBatis实现服务

    1.前言 上一篇文章介绍了如何设计后端的Mysql数据库:Alex Wang:全栈开发踩坑之路3-MySql数据库设计,本文介绍如何用MyBatis实现后端服务. 本后端项目的Github地址(撰写中 ...

  6. html2canvas的踩坑之路

    前言 早有耳闻这个html2canvas比较坑,但无奈于产品需求的压迫,必须实现html转图片的功能,自此走上了填坑之路,好在最后的效果还算令人满意,这才没有误了产品上线周期. html2canvas ...

  7. jmeter 3版本到5版本踩坑之路

    jmeter 3-5版本升级踩坑路 新版本下载安装 踩坑之路 新版本下载安装 下载新版本软件 ,链接: https://jmeter.apache.org/download_jmeter.cgi: 配 ...

  8. 高德定位SDK踩坑-高精度模式下获取不到GPS定位(无网络环境)

    高德定位SDK踩坑-高精度模式下获取不到GPS定位(无网络环境) 关键字:定位模式 高精度模式 GPS定位 无网络 一句话描述问题:高精度模式在断网环境下不可靠.有几率重复报错或使用缓存定位,不使用G ...

  9. 微信小程序实现大转盘抽奖----踩坑之路

    微信小程序实现大转盘抽奖----踩坑之路 需求:现在有一个小程序抽奖页面如下,此类抽奖方式为大转盘 思路:由服务端获取抽奖次数和奖品,根据服务端的中奖概率来决定是否中奖,最后利用小程序动画将转盘转起来 ...

最新文章

  1. 「游戏圈地震级消息」687亿美元,微软收购游戏巨头动视暴雪
  2. 《走出软件作坊》书评活动图书奖品名单
  3. 总分的公式计算机,装机模拟器各配件跑分及计算公式分享 3DMark分数怎么算 3DMark分数计算公式_游侠网...
  4. ASP.NET上传文件对文件类型的高级判断
  5. Ubuntu20.04 远程桌面共享vnc
  6. AnkhSVN 1.0.2778 简体中文版发布
  7. Kafka笔记-kafka外网搭建及构建生产者
  8. 信息学奥赛一本通C++语言——1005:地球人口承载力估计
  9. CSS3常用选择器(三)
  10. c程序设计语言读书笔记,C程序设计语言读书笔记
  11. 数据库增量同步开源软件
  12. top 显示按照内存、CPU排序
  13. 关于图像高速缩放算法,目前看到的最好的最清晰的一篇文章2
  14. android fastboot 最新版,用adb、fastboot拯救你的安卓手机
  15. curl: (51)Unable to communicate securely with peer
  16. go java gc_Golang GC算法
  17. Maven项目配置依赖时报错:Duplicated tag: ‘plugins‘...不会解决
  18. 分子动力学软件-VMD(win版)
  19. android帧动画tulian,Flash小游项目任务书.doc
  20. QTableView 例三(代理)

热门文章

  1. oracle 启动错误1067,oracle监听器启动1067错误处理的方法
  2. 基础练习 心理阴影面积 C语言
  3. as学习-生成和引用aar包
  4. 【干货#002】小程序开发最佳图标库:阿里图标库
  5. 一图带你看懂什么是智慧城市
  6. Spark中dataframe里data.drop()和data.na.drop()的区别
  7. 2021年高压电工考试报名及高压电工复审考试
  8. 可视化之donut chart
  9. 【星戈瑞解析】荧光标记多肽的优缺点-穿膜肽/靶向肽/肽链
  10. VS Code 折腾记 - (14) 再来推荐一波大前端适用系列(Node/React/Vue/小程序/主题/代码体验等)的插件