188 lines
6.2 KiB
C#
188 lines
6.2 KiB
C#
using Axibug;
|
||
using Axibug.Runtime;
|
||
using System.Collections.Generic;
|
||
using System.IO;
|
||
using System.Security.Cryptography;
|
||
using UnityEngine;
|
||
using static Axibug.Utility;
|
||
|
||
namespace Game
|
||
{
|
||
public class UpdateComponent : GameComponent
|
||
{
|
||
private float _process = 0;
|
||
public float ProcessValue { get { return _process; } }
|
||
|
||
public bool CheckVersionList()
|
||
{
|
||
//1 判断 版本号 是不是需要重新下载新的版本? 1.0 2.0
|
||
string[] arr1 = HotData.curHot.version_local.Split('.');
|
||
string[] arr2 = HotData.curHot.version_remote.Split('.');
|
||
|
||
if (HotData.curHot.filename == HotPlatform.versionTxt)
|
||
{
|
||
if (arr1.Length == arr2.Length && arr1.Length == 2)
|
||
{
|
||
if (arr1[0] != arr2[0])
|
||
{
|
||
//@Test 暂时不实现此功能
|
||
Log.Info($"请下载最新版本...local: {HotData.curHot.version_local} /remote: {HotData.curHot.version_remote}");
|
||
|
||
//网络错误,提示是否重新下载
|
||
AppEntry.ShowMessageBox("系统提示", "当前游戏版本过旧,是否前往更新", "确定", "退出",
|
||
() => { GotoUpdateApp(); },
|
||
() => { AppEntry.QuitGame(); });
|
||
|
||
return false;
|
||
}
|
||
}
|
||
}
|
||
|
||
#if UNITY_IOS
|
||
//1 如果是送检版本 不需要热更新
|
||
if (Application.version == HotData.xml.versionCheck || HotData.xml.versionCheck == "0.0")
|
||
{
|
||
//开始加载
|
||
HotData.curHot.state = 1;
|
||
HotData.curHot.diffCount = 0;
|
||
HotData.curHot.diff.Clear();
|
||
Debug.Log("送检版本 beginLoad..." + HotData.xml.versionCheck);
|
||
return false;
|
||
}
|
||
#endif
|
||
|
||
//如果没有本地文件,直接返回
|
||
//if (HotData.curHot.local.Count == 0)
|
||
//{
|
||
// _process = 1;
|
||
// HotData.curHot.diff = new List<FileData>(HotData.curHot.remote.Values);
|
||
// return true;
|
||
//}
|
||
|
||
|
||
//2 查找差分文件
|
||
HotData.curHot.curBytes = 0;
|
||
HotData.curHot.totalBytes = 0;
|
||
int idx = 0;
|
||
foreach (var d in HotData.curHot.remote.Values)
|
||
{
|
||
idx++;
|
||
_process = (float)idx / HotData.curHot.remote.Count;
|
||
|
||
FileData jd = null;
|
||
HotData.curHot.local.TryGetValue(d.filename, out jd);
|
||
//从本地版本文件查找
|
||
if (jd != null)
|
||
{
|
||
//如果有,并且哈希和文件长度一样
|
||
if (jd.hash == d.hash && jd.length == d.length)
|
||
{
|
||
//默认本地路径为Application.persistentDataPath路径,不再判断StreamAssets路径
|
||
string path = Utility.Path.GetUpdateWriteFilePath(d.filename);
|
||
bool isexitst = File.Exists(path);
|
||
//最后判断文件是否存在,如果在,就不需要更新
|
||
if (isexitst)
|
||
continue;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (!HadFile(d))
|
||
continue;
|
||
}
|
||
//没有的文件是否删除?
|
||
HotData.curHot.totalBytes += d.length;
|
||
HotData.curHot.diff.Add(d);
|
||
}
|
||
|
||
HotData.curHot.diffCount = HotData.curHot.diff.Count;
|
||
|
||
return HotData.curHot.diffCount > 0;
|
||
}
|
||
|
||
private bool HadFile(FileData d)
|
||
{
|
||
//如果本地版本文件里不存在
|
||
string path = Utility.Path.GetUpdateWriteFilePath(d.filename);
|
||
bool isexitst = File.Exists(path);
|
||
//判断文件是否存在,如果在
|
||
if (isexitst)
|
||
{
|
||
string filemd5 = string.Empty;
|
||
int fileLen = 0;
|
||
try
|
||
{
|
||
//计算md5
|
||
using (var fileStream = File.OpenRead(path))
|
||
{
|
||
fileLen = (int)fileStream.Length;
|
||
var md5 = MD5.Create();
|
||
var fileMD5Bytes = md5.ComputeHash(fileStream);//计算指定Stream 对象的哈希值
|
||
filemd5 = System.BitConverter.ToString(fileMD5Bytes).Replace("-", "").ToLower();//将byte[]装换成字符串
|
||
}
|
||
}
|
||
catch (System.Exception ex) { }
|
||
|
||
//并且哈希和文件长度一样,则不需要下载
|
||
if (d.hash == filemd5 && d.length == fileLen)
|
||
return false;
|
||
}
|
||
|
||
|
||
return true;
|
||
}
|
||
|
||
private void GotoUpdateApp()
|
||
{
|
||
string url = null;
|
||
#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN
|
||
url = AppEntry.BuiltinData.BuildInfo.WindowsAppUrl;
|
||
#elif UNITY_IOS
|
||
url = AppEntry.BuiltinData.BuildInfo.IOSAppUrl;
|
||
#elif UNITY_ANDROID
|
||
url = AppEntry.BuiltinData.BuildInfo.AndroidAppUrl;
|
||
#endif
|
||
if (!string.IsNullOrEmpty(url))
|
||
{
|
||
UnityEngine.Application.OpenURL(url);
|
||
}
|
||
}
|
||
|
||
public string GetByteLengthString(long byteLength)
|
||
{
|
||
if (byteLength < 1024L) // 2 ^ 10
|
||
{
|
||
return Text.Format("{0} Bytes", byteLength);
|
||
}
|
||
|
||
if (byteLength < 1048576L) // 2 ^ 20
|
||
{
|
||
return Text.Format("{0:F2} KB", byteLength / 1024f);
|
||
}
|
||
|
||
if (byteLength < 1073741824L) // 2 ^ 30
|
||
{
|
||
return Text.Format("{0:F2} MB", byteLength / 1048576f);
|
||
}
|
||
|
||
if (byteLength < 1099511627776L) // 2 ^ 40
|
||
{
|
||
return Text.Format("{0:F2} GB", byteLength / 1073741824f);
|
||
}
|
||
|
||
if (byteLength < 1125899906842624L) // 2 ^ 50
|
||
{
|
||
return Text.Format("{0:F2} TB", byteLength / 1099511627776f);
|
||
}
|
||
|
||
if (byteLength < 1152921504606846976L) // 2 ^ 60
|
||
{
|
||
return Text.Format("{0:F2} PB", byteLength / 1125899906842624f);
|
||
}
|
||
|
||
return Text.Format("{0:F2} EB", byteLength / 1152921504606846976f);
|
||
}
|
||
}
|
||
}
|
||
|