[Unity]腾讯SDK踩坑之路(3)--米大师坑 + MSDK坑 (2)

        接完MSDK的登录后,就开始对接MSDK其他的功能,在对接过程中遇到很多坑,一一记录下来,给后来者提供方便,也为自己提供方便。(前面已经有一篇是关于MSDK坑的文章了,但是坑太多,还是分开来记录)

一、公告问题:
        1.首先是调用接口中的参数问题,是公告栏ID,不是公告ID。如果你是第一次对接,而且看不到后台的时候,请确认下,不然会很坑的。
        2.图片公告不显示的问题,在联调公告的时候,普通公告和网页公告都没问题,但图片公告又遇到了不显示的问题。从Android Studio的log上看,是在查询图片ID的公告,但没有公告数据。从大厂运营发过来的截图上看到,图片公告有3个选项,竖屏、横屏和旋转,猜是不是这个参数有影响,然后和MSDK技术沟通,得到的反馈是主Activity的方向要和图片公告的方向一致,测试,有公告数据,能显示公告,但不显示图片。然后再沟通,他们也不清楚,只好再猜公告的Activity要和图片公告的方向一致,修改,测试没问题,然后反馈给MSDK技术人员。
二、输入框文字颜色为白色


        在没有接MSDK的时候,我们游戏没有这个bug,接完后,就有bug,而且是一部分手机和模拟器会出现的bug,向MSDK技术人员沟通,他们一致认为是我们游戏的bug,但我用的是空工程,只有MSDK的插件,打成APK,也就40M,硬要说我们的问题,我也是服了。后面查出是MSDK中的自动生成的AndroidMainfest.xml文件有问题,是android:theme问题,在<application>元素中添加android:theme="@style/UnityThemeSelector"就可以解决。把主Activity的修改成android:theme="@style/UnityThemeSelector"也可以解决,都测试过,没有问题。

三、安卓8.0闪退问题

        之前有说过安卓9坑,其实安卓8.0也不差,也有闪退问题,做机型适配测试的时候,大厂反馈安卓8.0米大师充值闪退问题很多。调试得到java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation,查到还是google的bug:如果是透明的Activity,就不能固定它的方向,因为它的方向其实是依赖其父Activity的(因为透明)。然而这个bug只有在8.0中有,8.1中已经修复。反馈回来的时候,我又想到公告也是透明的,在8.0上测试,也会闪退。所以不仅仅是米大师充值闪退问题,还有一个是MSDK公告闪退问题。

网上搜到4个解决方案:

1.降级targetSDKVersion到26以下(最终方案

2.移除mainfest文件里的screenOrientation属性

3.取消Activity主题里的windowIsTranslucent属性或者windowSwipeToDismiss属性或者windowIsFloating属性

4.移除manifest文件里的screenOrientation属性,并在Activity的onCreate方法里设置屏幕方向

        最简单的方案是2,经测试,完全能解决掉8.0闪退问题,但是请看公告问题中图片公告是有Activity方向限定的,如果把这个参数去掉的话,图片公告就不能显示,所以不能采用。第3个方案和第4分方案不可能,用的是大厂的SDK,都封装起来了,这个是最无奈的。所以只能选择第一个方案,降级,项目使用的Unity版本为2017.4.7f1,默认的targetSDKVersion就是26(尝试在PlayerSetting中修改targetSDKVersion小于26,但编译各种报错)只能进行骚操作,先将Unity工程导出AndroidStudio工程,在修改targetSDKVersion版本,再Build出APK。测试安卓8.0米大师充值和MSDK公告闪退问题解决,也可以显示图片公告。

        因为之前有一套一键生成AAR的代码,稍加修改,就可以改成一键生成AndroidStudio工程,再批处理生成APK文件,修改起来也方便,可以采用。记得修改2份build.gradle,其中一份是MSDK的。还有就是Java heap space错误,之前有写过这种问题的解决方案。Unity导出的工程中没有gradle.properties文件,可以自己手动创建一份,也可以放到某个目录,然后代码在拷贝过来,避免重复操作。

    /// <summary>
    /// 修改build.gradle
    /// </summary>
    /// <param name="filePath"></param>
    /// <returns></returns>
    private static bool UpdateBuildGradle(string filePath, bool bIsTest)
    {
        if (!File.Exists(filePath))
            return false;

        try
        {
            StreamReader reader = new StreamReader(filePath);
            var content = reader.ReadToEnd().Trim();
            reader.Close();

            var startIndex = content.IndexOf("compileSdkVersion");
            if(startIndex > 0)
            {
                var lastIndex = content.IndexOf("\n", startIndex);
                var findStr = content.Substring(startIndex, lastIndex - startIndex);
                content = content.Replace(findStr, "compileSdkVersion 25");
            }

            startIndex = content.IndexOf("buildToolsVersion");
            if (startIndex > 0)
            {
                var lastIndex = content.IndexOf("\n", startIndex);
                var findStr = content.Substring(startIndex, lastIndex - startIndex);
                content = content.Replace(findStr, "buildToolsVersion '25.0.0'");
            }

            startIndex = content.IndexOf("targetSdkVersion");
            if (startIndex > 0)
            {
                var lastIndex = content.IndexOf("\n", startIndex);
                var findStr = content.Substring(startIndex, lastIndex - startIndex);
                content = content.Replace(findStr, "targetSdkVersion 25");
            }

            StreamWriter writer = new StreamWriter(new FileStream(filePath, FileMode.Create));
            writer.WriteLine(content);
            writer.Flush();
            writer.Close();
        }
        catch (Exception e)
        {
            UnityEngine.Debug.Log("UpdateBuildGradle - Failed: " + e.Message);
            return false;
        }

        return true;
    }

    /// <summary>
    /// 修改APP Name
    /// </summary>
    /// <param name="filePath"></param>
    /// <param name="bIsTest"></param>
    /// <returns></returns>
    private static bool UpdateAppName(string filePath, bool bIsTest)
    {
        if (!File.Exists(filePath))
            return false;

        try
        {
            StreamReader reader = new StreamReader(filePath);
            var content = reader.ReadToEnd().Trim();
            reader.Close();

            var appName = "<string name=\"app_name\">";
            var startIndex = content.IndexOf(appName) + appName.Length;
            if (startIndex > 0)
            {
                var lastIndex = content.IndexOf("<", startIndex);
                var findStr = content.Substring(startIndex, lastIndex - startIndex);
                content = content.Replace(findStr, GetProjectName(bIsTest));
            }

            StreamWriter writer = new StreamWriter(new FileStream(filePath, FileMode.Create));
            writer.WriteLine(content);
            writer.Flush();
            writer.Close();
        }
        catch (Exception e)
        {
            UnityEngine.Debug.Log("UpdateAppName - Failed: " + e.Message);
            return false;
        }

        return true;
    }

4.米大师iOS充值游戏币失败问题

        用的是米大师Unity插件版,几乎没有文档,全部照着Demo写的,幸运的是安卓一路接下来没啥问题,但iOS充值一直报错,报无效的物品。后来尝试注释iOS上的参数,成功,记录一下,靠猜真心累。

5.隐藏米大师安卓测试界面问题

        之前以为测试环境才会显示,正式环境不显示测试界面,后来切换到正式环境也显示,就询问米大师技术,得到的反馈是isCanChange开启了,然后看了代码,发现大厂把这个代码给注释了,还以为弃之不用,正准备自己写的时候,反编译下了Jar包,才知道这些参数作为json传入的:

        修改后:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章