164 lines
6.5 KiB
C#
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);
|
|
}
|
|
}
|
|
} |