using System;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using GameCore;
using ResUpdate;
using System.Linq;
namespace GameLogic
{
public class Version
{
Hashtable info;
public Version(string json)
{
info = MiniJSON.jsonDecode(json) as Hashtable;
}
public string ToJson()
{
return MiniJSON.jsonEncode(info);
}
public string GetInfo(string key)
{
if (info.ContainsKey(key))
{
return info[key] as string;
}
return null;
}
public void RemoveInfo(string key)
{
if (info.ContainsKey(key))
{
info.Remove(key);
}
}
public void SetInfo(string key, string value)
{
info[key] = value;
}
}
///
/// 版本管理器
///
public class VersionManager : Singleton
{
///
/// 版本号文件
///
const string VersionsFile = "version";
///
/// 外部版本号
///
Version externalVersion;
///
/// 流媒体目录中的游戏及其版本号
///
Version internalVersion;
public void Initialize()
{
InitVersions();
}
///
/// 初始化资源版本号
///
public void InitVersions()
{
try
{
if (File.Exists(VersionsFilePath))
{
externalVersion = new Version(File.ReadAllText(VersionsFilePath, System.Text.Encoding.UTF8));
}
}
catch (Exception e) {
Debug.LogError(e);
}
try
{
internalVersion = new Version(Resources.Load(VersionsFile).text);
}
catch(Exception e)
{
Debug.LogError(e);
}
}
///
/// 保存版本号
///
///
public void SetInfo(string key, string value)
{
if (externalVersion != null)
{
externalVersion.SetInfo(key, value);
return;
}
if (internalVersion != null)
{
internalVersion.SetInfo(key, value);
return;
}
}
///
/// 保存版本号
///
///
public void SaveVersion(string version)
{
if (externalVersion != null)
{
externalVersion.SetInfo("version", version);
SaveToFiles(externalVersion);
return;
}
if (internalVersion != null)
{
internalVersion.SetInfo("version", version);
SaveToFiles(internalVersion);
return;
}
}
///
/// 获取版本号
/// 1.优先从外部拿
/// 2.拿不到返回-1
///
///
public string GetLocalVersion()
{
if (externalVersion != null)
{
return externalVersion.GetInfo("version");
}
if (internalVersion != null)
{
return internalVersion.GetInfo("version");
}
return null;
}
///
/// 对比版本号,返回不一样的位数 -1表示对比异常,0表示相同,其余表示按位不同
///
///
///
///
public static int VersionCompare(string ver1, string ver2)
{
string[] vs1 = ver1.Split('.');
string[] vs2 = ver2.Split('.');
if(vs1.Length != vs2.Length)
{
return -1;
}
int v1, v2;
for (int i = 0; i < vs1.Length; i++)
{
if (!int.TryParse(vs1[i], out v1))
{
return -1;
}
if (!int.TryParse(vs2[i], out v2))
{
return -1;
}
if (v1 != v2)
{
return i + 1;
}
}
return 0;
}
///
/// 获取版本内容,优先拿外部
///
///
///
public string GetVersionInfo(string key)
{
if (externalVersion != null)
{
return externalVersion.GetInfo(key);
}
if (internalVersion != null)
{
return internalVersion.GetInfo(key);
}
return null;
}
///
/// 保存到文件
///
void SaveToFiles(Version version)
{
string directoryPath = Path.GetDirectoryName(VersionsFilePath);
if (!Directory.Exists(directoryPath)) Directory.CreateDirectory(directoryPath);
File.WriteAllText(VersionsFilePath, version.ToJson(), System.Text.Encoding.UTF8);
}
///
/// 版本文件路径
///
string VersionsFilePath
{
get
{
return AppConst.PersistentDataPath + VersionsFile + ".txt";
}
}
///
/// 检测包版本,用于比较本地包与线上包的差异,有差异则需要更换新包
///
public static bool CheckPackageVersionSame(string checkVersion)
{
string localPackageVersion = Instance.GetVersionInfo("packageVersion");
if(localPackageVersion != null && checkVersion != null)
{
return localPackageVersion.Equals(checkVersion);
}else if(localPackageVersion == null && checkVersion == null)
{
return true;
}
return false;
}
}
}