| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202 |
- //------------------------------------------------------------
- // Game Framework
- // Copyright © 2013-2021 Jiang Yin. All rights reserved.
- // Homepage: https://gameframework.cn/
- // Feedback: mailto:ellan@gameframework.cn
- //------------------------------------------------------------
- using GameFramework;
- using static GameFramework.Utility;
- using GameFramework.Event;
- using GameFramework.Resource;
- using UnityEngine;
- using UnityGameFramework.Runtime;
- using ProcedureOwner = GameFramework.Fsm.IFsm<GameFramework.Procedure.IProcedureManager>;
- using GameFramework.Procedure;
- namespace GFMain
- {
- public class ProcedureCheckVersion : ProcedureBase
- {
- private bool m_CheckVersionComplete = false;
- private bool m_NeedUpdateVersion = false;
- private bool m_webErr = false;
- private VersionInfo m_VersionInfo = null;
- public override bool UseNativeDialog
- {
- get
- {
- return true;
- }
- }
- protected override void OnEnter(ProcedureOwner procedureOwner)
- {
- base.OnEnter(procedureOwner);
- showMessage = false;
- m_CheckVersionComplete = false;
- m_NeedUpdateVersion = false;
- m_VersionInfo = null;
- MainEntry.Event.Subscribe(WebRequestSuccessEventArgs.EventId, OnWebRequestSuccess);
- MainEntry.Event.Subscribe(WebRequestFailureEventArgs.EventId, OnWebRequestFailure);
- // 向服务器请求版本信息
- MainEntry.WebRequest.AddWebRequest(Text.Format(MainEntry.BuiltinData.BuildInfo.CheckVersionUrl, GetPlatformPath()), this);
- }
- protected override void OnLeave(ProcedureOwner procedureOwner, bool isShutdown)
- {
- MainEntry.Event.Unsubscribe(WebRequestSuccessEventArgs.EventId, OnWebRequestSuccess);
- MainEntry.Event.Unsubscribe(WebRequestFailureEventArgs.EventId, OnWebRequestFailure);
- base.OnLeave(procedureOwner, isShutdown);
- }
- bool showMessage = false;
- protected override void OnUpdate(ProcedureOwner procedureOwner, float elapseSeconds, float realElapseSeconds)
- {
- base.OnUpdate(procedureOwner, elapseSeconds, realElapseSeconds);
- if (showMessage) return;
- if (m_webErr)
- {
- MainEntry.CommonUI.messageBox.ShowMessage("网络错误!", callback: (res) =>
- {
- ChangeState<ProcedureCheckResources>(procedureOwner);
- });
- showMessage = true;
- }
- if (!m_CheckVersionComplete)
- {
- return;
- }
- if (m_NeedUpdateVersion)
- {
- //MainEntry.CommonUI.messageBox.ShowMessage("有更新,是否更新?", UnityCommon.MessageBoxParams.MessageType.ConfirmCancel, (res) =>
- //{
- // if (res == UnityCommon.MessageBoxParams.ResultType.Confirm)
- // {
- 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<ProcedureCheckResources>(procedureOwner);
- // }
- //});
- //showMessage = true;
- }
- else
- {
- ChangeState<ProcedureVerifyResources>(procedureOwner);
- }
- }
- private void GotoUpdateApp(object userData)
- {
- string url = null;
- #if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN
- url = MainEntry.BuiltinData.BuildInfo.WindowsAppUrl;
- #elif UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX
- url = MainEntry.BuiltinData.BuildInfo.MacOSAppUrl;
- #elif UNITY_IOS
- url = MainEntry.BuiltinData.BuildInfo.IOSAppUrl;
- #elif UNITY_ANDROID
- url = MainEntry.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 = Converter.GetString(versionInfoBytes);
- m_VersionInfo = 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)
- {
- // 需要强制更新游戏应用
- //MainEntry.UI.OpenDialog(new DialogParams
- //{
- // Mode = 2,
- // Title = MainEntry.Localization.GetString("ForceUpdate.Title"),
- // Message = MainEntry.Localization.GetString("ForceUpdate.Message"),
- // ConfirmText = MainEntry.Localization.GetString("ForceUpdate.UpdateButton"),
- // OnClickConfirm = GotoUpdateApp,
- // CancelText = MainEntry.Localization.GetString("ForceUpdate.QuitButton"),
- // OnClickCancel = delegate (object userData) { UnityGameFramework.Runtime.MainEntry.Shutdown(ShutdownType.Quit); },
- //});
- return;
- }
- // 设置资源更新下载地址
- MainEntry.Resource.UpdatePrefixUri = Path.GetRegularPath(m_VersionInfo.UpdatePrefixUri);
- m_CheckVersionComplete = true;
- m_NeedUpdateVersion = MainEntry.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);
- m_webErr = true;
- }
- 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(Text.Format("Platform '{0}' is not supported.", Application.platform));
- }
- }
- }
- }
|