//------------------------------------------------------------ // 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; 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(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("VersionListLength", m_VersionInfo.VersionListLength); procedureOwner.SetData("VersionListHashCode", m_VersionInfo.VersionListHashCode); procedureOwner.SetData("VersionListCompressedLength", m_VersionInfo.VersionListCompressedLength); procedureOwner.SetData("VersionListCompressedHashCode", m_VersionInfo.VersionListCompressedHashCode); ChangeState(procedureOwner); // } // else // { // ChangeState(procedureOwner); // } //}); //showMessage = true; } else { ChangeState(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(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)); } } } }