SDK_UnityMoney/Assets/ThinkupTpnPlugin/Script/IntegrationManager/Editor/ATIntergrationHotFix.cs

164 lines
6.5 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Xml.Linq;
using UnityEditor;
using UnityEngine;
using UnityEngine.Networking;
using UnityEditor.PackageManager.Requests;
using UnityEditor.PackageManager;
using System.Threading.Tasks;
using System.Threading;
namespace AnyThink.Scripts.IntegrationManager.Editor
{
public class ATIntegrationHotFix {
public static ATIntegrationHotFix Instance = new ATIntegrationHotFix();
private ATIntegrationHotFix()
{
}
private static string plugin_hot_fix_data_file_name = "plugin_hot_fix_data.json";
public void loadHotFixData()
{
var downloadUrl = ATNetInfo.getHotfixPluginDownloadUrl(ATConfig.PLUGIN_VERSION);
ATLog.log("loadHotFixData() >>> downloadUrl: " + downloadUrl);
ATEditorCoroutine.startCoroutine(loadHotFixDataWithIEnumerator(downloadUrl));
}
private IEnumerator loadHotFixDataWithIEnumerator(string url) {
var hotFixDataRequest = UnityWebRequest.Get(url);
var webRequest = hotFixDataRequest.SendWebRequest();
while (!webRequest.isDone)
{
yield return new WaitForSeconds(0.1f);
}
#if UNITY_2020_1_OR_NEWER
if (hotFixDataRequest.result != UnityWebRequest.Result.Success)
#elif UNITY_2017_2_OR_NEWER
if (hotFixDataRequest.isNetworkError || hotFixDataRequest.isHttpError)
#else
if (hotFixDataRequest.isError)
#endif
{
// Debug.Log("loadPluginData failed.");
// callback(null);
ATLog.log("load hotfix data failed.");
}
else
{
//解析热修复的数据
try {
string hotFixData = hotFixDataRequest.downloadHandler.text;
var hotFixDataObj = JsonUtility.FromJson<HotfixPluginData>(hotFixData);
ATLog.log("loadHotFixDataWithIEnumerator() >>> hotFixData: " + hotFixData);
//判断status是否需要进行热更新
if (hotFixDataObj.status != 1) {
ATLog.log("loadHotFixDataWithIEnumerator() >>> 热更新被禁止");
} else {
var localHotFixDataObj = getHotfixPluginData();
if (localHotFixDataObj == null) {
//本地未曾下载过热更新
ATLog.log("loadHotFixDataWithIEnumerator() >>> 本地未曾下载过热更新");
ATEditorCoroutine.startCoroutine(loadHotFixPlugin(hotFixDataObj));
} else {
var compareVersionResult = ATDataUtil.CompareVersions(localHotFixDataObj.hot_fix_version, hotFixDataObj.hot_fix_version);
ATLog.log("loadHotFixDataWithIEnumerator() >>> compareVersionResult: " + compareVersionResult);
//本地版本比远端版本低,则需要更新
if (compareVersionResult == VersionComparisonResult.Lesser) {
ATEditorCoroutine.startCoroutine(loadHotFixPlugin(hotFixDataObj));
} else {
//不需要热更新
saveHotfixData(hotFixData);
}
}
}
} catch(Exception e) {
ATLog.logError("parseNetworksJson() >>> failed: " + e);
}
}
}
private IEnumerator loadHotFixPlugin(HotfixPluginData hotFixDataObj) {
var path = Path.Combine(Application.temporaryCachePath, hotFixDataObj.file_name);
ATLog.log("downloadPluginWithEnumerator() >>> path: " + path);
#if UNITY_2017_2_OR_NEWER
var downloadHandler = new DownloadHandlerFile(path);
#else
var downloadHandler = new ATDownloadHandler(path);
#endif
var downloadUrl = hotFixDataObj.download_url;
UnityWebRequest downloadPluginRequest = new UnityWebRequest(downloadUrl)
{ method = UnityWebRequest.kHttpVerbGET,
downloadHandler = downloadHandler
};
#if UNITY_2017_2_OR_NEWER
var operation = downloadPluginRequest.SendWebRequest();
#else
var operation = downloadPluginRequest.Send();
#endif
while (!operation.isDone)
{
yield return new WaitForSeconds(0.1f); // Just wait till downloadPluginRequest is completed. Our coroutine is pretty rudimentary.
if (operation.progress != 1 && operation.isDone)
{
}
}
#if UNITY_2020_1_OR_NEWER
if (downloadPluginRequest.result != UnityWebRequest.Result.Success)
#elif UNITY_2017_2_OR_NEWER
if (downloadPluginRequest.isNetworkError || downloadPluginRequest.isHttpError)
#else
if (downloadPluginRequest.isError)
#endif
{
ATLog.log(downloadPluginRequest.error);
}
else
{
AssetDatabase.ImportPackage(path, false);
AssetDatabase.Refresh();
string hotFixData = JsonUtility.ToJson(hotFixDataObj);
saveHotfixData(hotFixData);
}
downloadPluginRequest.Dispose();
downloadPluginRequest = null;
}
private void saveHotfixData(string hotfixPluginData) {
var directoryPath = ATConfig.plugin_setting_data_path;
// 确保目标文件夹存在
if (!Directory.Exists(directoryPath))
{
// 如果目录不存在,则创建它
Directory.CreateDirectory(directoryPath);
}
string fullPath = Path.Combine(directoryPath, plugin_hot_fix_data_file_name);
ATLog.log("saveHotfixData() >>> fullPath: " + fullPath + " hotfixPluginData: " + hotfixPluginData);
File.WriteAllText(fullPath, hotfixPluginData);
}
private HotfixPluginData getHotfixPluginData() {
string fullPath = Path.Combine(ATConfig.plugin_setting_data_path, plugin_hot_fix_data_file_name);
if (!File.Exists(fullPath)) {
return null;
}
string json = File.ReadAllText(fullPath);
if(json == "") {
return null;
}
return JsonUtility.FromJson<HotfixPluginData>(json);
}
}
}