//-------------------------------------------------------- // [Author]: 第二世界 // [ Date ]: Thursday, March 15, 2018 //-------------------------------------------------------- using UnityEngine; using System.Collections; using UnityEngine.UI; using System.Collections.Generic; using System; using LitJson; using System.IO; using vnxbqy.UI; using System.Text; public class VersionUtility : Singleton { public static readonly string[] VERSION_URL = new string[] { "http://vncenter.daojmengxvn.com:11000/center/appversion_new.php/?"}; public string androidRoot { get { return StringUtility.Contact(ynmbxxjUtil.Instance.DeviceRootPath, "/", VersionConfig.Get().bundleIdentifier); } } public DownloadTask downloadTask; private string versionUrl; public float progress { get { return downloadTask == null ? 0 : (downloadTask.downloadedBytes / ((float)GetApkSize() * 1024)); } } public VersionInfo versionInfo { get; private set; } Dictionary apkDownUrls = new Dictionary(); public bool completed { get { return step == Step.Completed; } } Step m_Step = Step.None; public Step step { get { return m_Step; } private set { if (m_Step != value) { m_Step = value; if (downLoadStepChangeEvent != null) { downLoadStepChangeEvent(m_Step); } } } } public event Action downLoadStepChangeEvent; int urlIndex = 0; public void RequestVersionCheck() { m_Step = Step.None; //var tables = new Dictionary(); //tables["channel"] = VersionConfig.Get().appId; //tables["versioncode"] = VersionConfig.Get().version; //if (VersionConfig.Get().branch != 0) //{ // tables["branch"] = VersionConfig.Get().branch.ToString(); //} //tables["game"] = VersionConfig.Get().gameId; //var url = StringUtility.Contact(VERSION_URL[urlIndex % 2], HttpRequest.HashtablaToString(tables)); //urlIndex++; //versionUrl = url; //Debug.Log("http地址:versionUrl " + url); //HttpRequest.Instance.RequestHttpGet(url, HttpRequest.defaultHttpContentType, 1, OnVersionCheckResult); OnVersionCheckResult(true, StartAot.ResourcesModel.versionUrlResult); } private void OnVersionCheckResult(bool _ok, string _result) { if (_ok) { //_result = _result.Replace("{}", "null"); versionInfo = JsonMapper.ToObject(_result); versionInfo.downAsset = 1; if (NeedNormalUpdate()) { if (Application.isMobilePlatform || Application.platform == RuntimePlatform.WindowsEditor) { RequestApkDownConfigs(); } else { step = Step.Completed; } } else { step = Step.Completed; var apkFiles = new DirectoryInfo(ResourcesPath.Instance.ExternalStorePath).GetFiles("*.apk"); for (int i = apkFiles.Length - 1; i >= 0; i--) { File.Delete(apkFiles[i].FullName); } } } else { Debug.Log("Aot 请求失败" + _result); //Debug.Log("http 数据通讯: VersionUtility:" + versionUrl + " result:" + _result); ////BuglyAgent.ReportException(new System.Exception(),"http 数据通讯: VersionUtility:" +versionUrl + " result:" + _result); //step = Step.None; //Clock.AlarmAt(DateTime.Now + new TimeSpan(TimeSpan.TicksPerSecond), RequestVersionCheck); } } public void RequestApkDownConfigs() { WindowCenter.Instance.OpenFromLocal(); } public bool NeedNormalUpdate() { return versionInfo != null && versionInfo.downAsset == 1 && versionInfo.VersionCount > 0; } public ApkDownUrl GetApkDownUrl() { var flag = ynmbxxjUtil.Instance.GetSplicePackageID(); if (apkDownUrls.ContainsKey(flag)) return apkDownUrls[flag]; else return null; } public string GetApkLocalUrl() { var apk = GetApkDownUrl(); if (apk == null) return string.Empty; if (!apk.isApk) return string.Empty; var remoteURL = GetApkRemoteUrl(); var fileName = Path.GetFileName(remoteURL); return StringUtility.Contact(androidRoot, "/", fileName); } public string GetApkRemoteUrl() { if (versionInfo == null) { return string.Empty; } var flag = ynmbxxjUtil.Instance.GetSplicePackageID(); if (apkDownUrls.ContainsKey(flag)) { return apkDownUrls[flag].url; } else { return string.Empty; } } public int GetApkSize() { if (versionInfo == null) { return 0; } var flag = ynmbxxjUtil.Instance.GetSplicePackageID(); if (apkDownUrls.ContainsKey(flag)) { return apkDownUrls[flag].size; } else { return 0; } } public string GetUpdateContent() { var apk = GetApkDownUrl(); if (apk == null) return string.Empty; return apk.updateContent; } public void StartDownLoad() { step = Step.DownLoad; var remoteURL = GetApkRemoteUrl(); var apkLocalUrl = GetApkLocalUrl(); downloadTask = new DownloadTask(remoteURL, apkLocalUrl); downloadTask.BeginDownload(OnDownLoadApkCompleted); } private void OnDownLoadApkCompleted(DownloadTask task) { if (task.IsDone) { step = Step.Completed; WindowCenter.Instance.Close(); ynmbxxjUtil.Instance.InstallAPK(GetApkLocalUrl()); } else { step = Step.DownLoadFailed; } } public void SkipVersion() { step = Step.Completed; } /// /// 是否为ios审核时间内 /// /// public bool InIosAuditTime() { DateTime dateTime; try { var textAsset = Resources.Load("Config/AuditTime"); var content = string.Empty; if (textAsset != null) { content = textAsset.text; if (DateTime.TryParse(content, out dateTime)) { return DateTime.Now < dateTime; } else { return false; } } else { return false; } } catch (System.Exception ex) { return false; } } public bool NeedDownAsset() { if (versionInfo != null && versionInfo.downAsset == 1 && VersionConfig.Get().assetAccess != InstalledAsset.IngoreDownLoad) { return true; } else { return false; } } public class VersionInfo { public JsonData notice_flag; public JsonData resource_url; public string ResourceAward; public int downAsset = 1; //默认是1 没有代表意义 不清楚逻辑可不要改动 public string downUrl; public int VersionCount; //大于0代表需要强更 public string GetResourcesURL(int _branch) { if (resource_url != null) { return resource_url[_branch.ToString()].ToString(); } else { return string.Empty; } } public string GetNoticeURL(int _branch) { try { if (notice_flag != null) { return notice_flag[_branch.ToString()].ToString(); } else { return string.Empty; } } catch (Exception ex) { DebugEx.Log(ex); return string.Empty; } } } public class ApkDownUrl { public string flag; public string url; public int size; public bool isApk;//是否是apk下载地址,0:否,1:是 public string updateContent;//更新内容提示 public ApkDownUrl(string content) { var strings = content.Split('\t'); flag = strings[0]; url = strings[1]; int.TryParse(strings[2], out size); isApk = strings[3] == "1"; updateContent = strings[4]; } } public enum Step { None, ApkExist, DownLoadPrepared, DownLoad, DownLoadFailed, Completed, } }