接完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傳入的:
修改後: