[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傳入的:

        修改後:

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