VersionChecker.cs 7.9 KB

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