VersionChecker.cs 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. using System;
  2. using System.IO;
  3. using System.Text;
  4. using Fort23.Core;
  5. using Fort23.GameData;
  6. using Fort23.UTool;
  7. using hirdParty.DownloadSystem;
  8. using ThirdParty;
  9. using ThirdParty.DownloadSystem;
  10. using UnityEngine;
  11. using UnityEngine.Networking;
  12. public class VersionChecker
  13. {
  14. private string versionUrl;
  15. string savePath;
  16. private AssetMD5Info _assetMD5Info;
  17. private VersionInfo versionInfo = null;
  18. public async CTask Start()
  19. {
  20. versionUrl = $"{HotSyncContent.AssetURL}/{versionInfo.apkVersion}/version.json";
  21. savePath = Path.Combine(Application.persistentDataPath, versionInfo.apkVersion + "update.apk");
  22. versionInfo = await GetRemoteVersion();
  23. string local = Application.version;
  24. if (versionInfo != null && versionInfo.apkVersion != local)
  25. {
  26. await GetMd5();
  27. if (!await Cheek())
  28. {
  29. Debug.Log("检测到新版本,开始下载...");
  30. await DownloadAndInstall();
  31. }
  32. }
  33. }
  34. private async CTask GetMd5()
  35. {
  36. CTask cTask = CTask.Create();
  37. DownloadFileData downloadFileData2 = new DownloadFileData();
  38. downloadFileData2.remoteUrl = $"{HotSyncContent.AssetURL}/{versionInfo.apkVersion}/MD5.txt";
  39. downloadFileData2.maxCount = int.MaxValue;
  40. downloadFileData2.timeOut = 10;
  41. DownloadHander downloadHander2 = FileDownloadSystem.Instance.DownloadFile(downloadFileData2);
  42. DownLoadHanderGroup downLoadHanderGroup = new DownLoadHanderGroup();
  43. downLoadHanderGroup.AddHander(downloadHander2);
  44. downLoadHanderGroup.OnCallBack = async delegate
  45. {
  46. if (downloadHander2.HttpDownloadBasic.DownloadHander.HttpDownloadBasic.Result() !=
  47. UnityWebRequest.Result.Success)
  48. {
  49. LogTool.Warning("获取MD5失败,尝试重新获取");
  50. await GetMd5();
  51. cTask.SetResult();
  52. return;
  53. }
  54. string json = UTF8Encoding.UTF8.GetString(downloadHander2.Data);
  55. _assetMD5Info = JsonHelper.FromJson<AssetMD5Info>(json);
  56. cTask.SetResult();
  57. };
  58. downLoadHanderGroup.StartUpdate();
  59. await cTask;
  60. }
  61. private CTask<bool> Cheek()
  62. {
  63. CTask<bool> cheekTask = CTask<bool>.Create();
  64. CheckFilePool _checkFileThrans = new CheckFilePool();
  65. _checkFileThrans.isStreamingAssetsPath = false;
  66. _checkFileThrans.streamingAssetsPath = Application.persistentDataPath;
  67. _checkFileThrans.Start(Application.persistentDataPath,
  68. _assetMD5Info.fileInfo);
  69. _checkFileThrans.OnFinish = async delegate
  70. {
  71. //失败
  72. if (_checkFileThrans.shiBaiFile.Count > 0)
  73. {
  74. cheekTask.SetResult(false);
  75. }
  76. else
  77. {
  78. cheekTask.SetResult(true);
  79. }
  80. };
  81. return cheekTask;
  82. }
  83. private async CTask<VersionInfo> GetRemoteVersion()
  84. {
  85. UnityWebRequest req = UnityWebRequest.Get(versionUrl);
  86. var s = req.SendWebRequest();
  87. CTask cTask = CTask.Create();
  88. s.completed += operation => cTask.SetResult();
  89. await cTask;
  90. if (req.result != UnityWebRequest.Result.Success)
  91. {
  92. LogTool.Error("版本号获取失败:" + req.error);
  93. return await GetRemoteVersion();
  94. }
  95. var json = req.downloadHandler.text;
  96. var data = JsonUtility.FromJson<VersionInfo>(json);
  97. return data;
  98. }
  99. private async CTask DownloadAndInstall()
  100. {
  101. CTask cTask = CTask.Create();
  102. Debug.Log("APK 下载路径:" + savePath);
  103. DownLoadHanderGroup downLoadHanderGroup = new DownLoadHanderGroup();
  104. DownloadFileData downloadFileData = new DownloadFileData();
  105. downloadFileData.remoteUrl = versionInfo.apkUrl;
  106. Debug.Log("下载文件" + downloadFileData.remoteUrl);
  107. downloadFileData.localPath = savePath;
  108. DownloadHander fileDow = FileDownloadSystem.Instance.DownloadFile(downloadFileData);
  109. downLoadHanderGroup.AddHander(fileDow);
  110. float m = downLoadHanderGroup.size / 1024f / 1024f;
  111. float speed = fileDow.UnityWebRequestAsyncOperation.webRequest.downloadedBytes / 1024f;
  112. LogTool.Log(
  113. $"Downloading: {m.ToString("0.00")}M / {_assetMD5Info.fileInfo[0].size.ToString("0.00")}M speed {HotSyncContent.FormatSpeed(speed)}");
  114. downLoadHanderGroup.OnCallBack = async () =>
  115. {
  116. if (fileDow.HttpDownloadBasic.DownloadHander.HttpDownloadBasic.Result() != UnityWebRequest.Result.Success)
  117. {
  118. await DownloadAndInstall();
  119. cTask.SetResult();
  120. return;
  121. }
  122. Debug.Log("APK 下载成功");
  123. if (!await Cheek())
  124. {
  125. LogTool.Warning("md5对比失败,重新下载");
  126. await DownloadAndInstall();
  127. return;
  128. }
  129. InstallAPK(savePath);
  130. cTask.SetResult();
  131. };
  132. downLoadHanderGroup.StartUpdate();
  133. await cTask;
  134. }
  135. static void InstallAPK(string apkPath)
  136. {
  137. #if UNITY_ANDROID
  138. try
  139. {
  140. AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
  141. AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
  142. AndroidJavaClass intentClass = new AndroidJavaClass("android.content.Intent");
  143. AndroidJavaObject intent = new AndroidJavaObject("android.content.Intent");
  144. string ACTION_VIEW = intentClass.GetStatic<string>("ACTION_VIEW");
  145. intent.Call<AndroidJavaObject>("setAction", ACTION_VIEW);
  146. AndroidJavaClass fileClass = new AndroidJavaClass("java.io.File");
  147. AndroidJavaObject fileObj = new AndroidJavaObject("java.io.File", apkPath);
  148. AndroidJavaClass uriClass = new AndroidJavaClass("androidx.core.content.FileProvider");
  149. AndroidJavaObject context = currentActivity.Call<AndroidJavaObject>("getApplicationContext");
  150. AndroidJavaObject uri = uriClass.CallStatic<AndroidJavaObject>("getUriForFile",
  151. context,
  152. "com.yourgame.fileprovider",
  153. fileObj);
  154. intent.Call<AndroidJavaObject>("setDataAndType", uri, "application/vnd.android.package-archive");
  155. intent.Call<AndroidJavaObject>("addFlags", 1 << 25); // FLAG_GRANT_READ_URI_PERMISSION
  156. intent.Call<AndroidJavaObject>("addFlags", 1 << 31); // FLAG_ACTIVITY_NEW_TASK
  157. currentActivity.Call("startActivity", intent);
  158. }
  159. catch (Exception ex)
  160. {
  161. Debug.LogError("安装 APK 出错:" + ex.Message);
  162. }
  163. #endif
  164. }
  165. }
  166. [Serializable]
  167. public class VersionInfo
  168. {
  169. public string apkVersion;
  170. public string apkUrl;
  171. }