163 lines
6.2 KiB
C#
163 lines
6.2 KiB
C#
using GameFramework;
|
|
using GameFramework.Event;
|
|
using GameFramework.Resource;
|
|
using GeometryTD.Definition;
|
|
using GeometryTD.UI;
|
|
using UnityEngine;
|
|
using UnityGameFramework.Runtime;
|
|
using ProcedureOwner = GameFramework.Fsm.IFsm<GameFramework.Procedure.IProcedureManager>;
|
|
|
|
namespace GeometryTD.Procedure
|
|
{
|
|
public class ProcedureCheckVersion : ProcedureBase
|
|
{
|
|
private bool m_CheckVersionComplete = false;
|
|
private bool m_NeedUpdateVersion = false;
|
|
private VersionInfo m_VersionInfo = null;
|
|
|
|
public override bool UseNativeDialog => true;
|
|
|
|
protected override void OnEnter(ProcedureOwner procedureOwner)
|
|
{
|
|
base.OnEnter(procedureOwner);
|
|
|
|
m_CheckVersionComplete = false;
|
|
m_NeedUpdateVersion = false;
|
|
m_VersionInfo = null;
|
|
|
|
GameEntry.Event.Subscribe(WebRequestSuccessEventArgs.EventId, OnWebRequestSuccess);
|
|
GameEntry.Event.Subscribe(WebRequestFailureEventArgs.EventId, OnWebRequestFailure);
|
|
|
|
// 向服务器请求版本信息
|
|
GameEntry.WebRequest.AddWebRequest(Utility.Text.Format(GameEntry.BuiltinData.BuildInfo.CheckVersionUrl, GetPlatformPath()), this);
|
|
}
|
|
|
|
protected override void OnLeave(ProcedureOwner procedureOwner, bool isShutdown)
|
|
{
|
|
GameEntry.Event.Unsubscribe(WebRequestSuccessEventArgs.EventId, OnWebRequestSuccess);
|
|
GameEntry.Event.Unsubscribe(WebRequestFailureEventArgs.EventId, OnWebRequestFailure);
|
|
|
|
base.OnLeave(procedureOwner, isShutdown);
|
|
}
|
|
|
|
protected override void OnUpdate(ProcedureOwner procedureOwner, float elapseSeconds, float realElapseSeconds)
|
|
{
|
|
base.OnUpdate(procedureOwner, elapseSeconds, realElapseSeconds);
|
|
|
|
if (!m_CheckVersionComplete)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (m_NeedUpdateVersion)
|
|
{
|
|
procedureOwner.SetData<VarInt32>("VersionListLength", m_VersionInfo.VersionListLength);
|
|
procedureOwner.SetData<VarInt32>("VersionListHashCode", m_VersionInfo.VersionListHashCode);
|
|
procedureOwner.SetData<VarInt32>("VersionListCompressedLength", m_VersionInfo.VersionListCompressedLength);
|
|
procedureOwner.SetData<VarInt32>("VersionListCompressedHashCode", m_VersionInfo.VersionListCompressedHashCode);
|
|
ChangeState<ProcedureUpdateVersion>(procedureOwner);
|
|
}
|
|
else
|
|
{
|
|
ChangeState<ProcedureVerifyResources>(procedureOwner);
|
|
}
|
|
}
|
|
|
|
private void GotoUpdateApp(object userData)
|
|
{
|
|
string url = null;
|
|
#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN
|
|
url = GameEntry.BuiltinData.BuildInfo.WindowsAppUrl;
|
|
#elif UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX
|
|
url = GameEntry.BuiltinData.BuildInfo.MacOSAppUrl;
|
|
#elif UNITY_IOS
|
|
url = GameEntry.BuiltinData.BuildInfo.IOSAppUrl;
|
|
#elif UNITY_ANDROID
|
|
url = GameEntry.BuiltinData.BuildInfo.AndroidAppUrl;
|
|
#endif
|
|
if (!string.IsNullOrEmpty(url))
|
|
{
|
|
Application.OpenURL(url);
|
|
}
|
|
}
|
|
|
|
private void OnWebRequestSuccess(object sender, GameEventArgs e)
|
|
{
|
|
WebRequestSuccessEventArgs ne = (WebRequestSuccessEventArgs)e;
|
|
if (ne.UserData != this)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// 解析版本信息
|
|
byte[] versionInfoBytes = ne.GetWebResponseBytes();
|
|
string versionInfoString = Utility.Converter.GetString(versionInfoBytes);
|
|
m_VersionInfo = Utility.Json.ToObject<VersionInfo>(versionInfoString);
|
|
if (m_VersionInfo == null)
|
|
{
|
|
Log.Error("Parse VersionInfo failure.");
|
|
return;
|
|
}
|
|
|
|
Log.Info("Latest game version is '{0} ({1})', local game version is '{2} ({3})'.", m_VersionInfo.LatestGameVersion, m_VersionInfo.InternalGameVersion.ToString(), Version.GameVersion, Version.InternalGameVersion.ToString());
|
|
|
|
if (m_VersionInfo.ForceUpdateGame)
|
|
{
|
|
// 需要强制更新游戏应用
|
|
GameEntry.UI.OpenDialog(new DialogParams
|
|
{
|
|
Mode = 2,
|
|
Title = GameEntry.Localization.GetString("ForceUpdate.Title"),
|
|
Message = GameEntry.Localization.GetString("ForceUpdate.Message"),
|
|
ConfirmText = GameEntry.Localization.GetString("ForceUpdate.UpdateButton"),
|
|
OnClickConfirm = GotoUpdateApp,
|
|
CancelText = GameEntry.Localization.GetString("ForceUpdate.QuitButton"),
|
|
OnClickCancel = delegate (object userData) { UnityGameFramework.Runtime.GameEntry.Shutdown(ShutdownType.Quit); },
|
|
});
|
|
|
|
return;
|
|
}
|
|
|
|
// 设置资源更新下载地址
|
|
GameEntry.Resource.UpdatePrefixUri = Utility.Path.GetRegularPath(m_VersionInfo.UpdatePrefixUri);
|
|
|
|
m_CheckVersionComplete = true;
|
|
m_NeedUpdateVersion = GameEntry.Resource.CheckVersionList(m_VersionInfo.InternalResourceVersion) == CheckVersionListResult.NeedUpdate;
|
|
}
|
|
|
|
private void OnWebRequestFailure(object sender, GameEventArgs e)
|
|
{
|
|
WebRequestFailureEventArgs ne = (WebRequestFailureEventArgs)e;
|
|
if (ne.UserData != this)
|
|
{
|
|
return;
|
|
}
|
|
|
|
Log.Warning("Check version failure, error message is '{0}'.", ne.ErrorMessage);
|
|
}
|
|
|
|
private string GetPlatformPath()
|
|
{
|
|
switch (Application.platform)
|
|
{
|
|
case RuntimePlatform.WindowsEditor:
|
|
case RuntimePlatform.WindowsPlayer:
|
|
return "Windows";
|
|
|
|
case RuntimePlatform.OSXEditor:
|
|
case RuntimePlatform.OSXPlayer:
|
|
return "MacOS";
|
|
|
|
case RuntimePlatform.IPhonePlayer:
|
|
return "IOS";
|
|
|
|
case RuntimePlatform.Android:
|
|
return "Android";
|
|
|
|
default:
|
|
throw new System.NotSupportedException(Utility.Text.Format("Platform '{0}' is not supported.", Application.platform));
|
|
}
|
|
}
|
|
}
|
|
}
|