ProcedureCheckVersion.cs 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. //------------------------------------------------------------
  2. // Game Framework
  3. // Copyright © 2013-2021 Jiang Yin. All rights reserved.
  4. // Homepage: https://gameframework.cn/
  5. // Feedback: mailto:ellan@gameframework.cn
  6. //------------------------------------------------------------
  7. using GameFramework;
  8. using static GameFramework.Utility;
  9. using GameFramework.Event;
  10. using GameFramework.Resource;
  11. using UnityEngine;
  12. using UnityGameFramework.Runtime;
  13. using ProcedureOwner = GameFramework.Fsm.IFsm<GameFramework.Procedure.IProcedureManager>;
  14. using GameFramework.Procedure;
  15. namespace GFMain
  16. {
  17. public class ProcedureCheckVersion : ProcedureBase
  18. {
  19. private bool m_CheckVersionComplete = false;
  20. private bool m_NeedUpdateVersion = false;
  21. private bool m_webErr = false;
  22. private VersionInfo m_VersionInfo = null;
  23. public override bool UseNativeDialog
  24. {
  25. get
  26. {
  27. return true;
  28. }
  29. }
  30. protected override void OnEnter(ProcedureOwner procedureOwner)
  31. {
  32. base.OnEnter(procedureOwner);
  33. showMessage = false;
  34. m_CheckVersionComplete = false;
  35. m_NeedUpdateVersion = false;
  36. m_VersionInfo = null;
  37. MainEntry.Event.Subscribe(WebRequestSuccessEventArgs.EventId, OnWebRequestSuccess);
  38. MainEntry.Event.Subscribe(WebRequestFailureEventArgs.EventId, OnWebRequestFailure);
  39. // 向服务器请求版本信息
  40. MainEntry.WebRequest.AddWebRequest(Text.Format(MainEntry.BuiltinData.BuildInfo.CheckVersionUrl, GetPlatformPath()), this);
  41. }
  42. protected override void OnLeave(ProcedureOwner procedureOwner, bool isShutdown)
  43. {
  44. MainEntry.Event.Unsubscribe(WebRequestSuccessEventArgs.EventId, OnWebRequestSuccess);
  45. MainEntry.Event.Unsubscribe(WebRequestFailureEventArgs.EventId, OnWebRequestFailure);
  46. base.OnLeave(procedureOwner, isShutdown);
  47. }
  48. bool showMessage = false;
  49. protected override void OnUpdate(ProcedureOwner procedureOwner, float elapseSeconds, float realElapseSeconds)
  50. {
  51. base.OnUpdate(procedureOwner, elapseSeconds, realElapseSeconds);
  52. if (showMessage) return;
  53. if (m_webErr)
  54. {
  55. MainEntry.CommonUI.messageBox.ShowMessage("网络错误!", callback: (res) =>
  56. {
  57. ChangeState<ProcedureCheckResources>(procedureOwner);
  58. });
  59. showMessage = true;
  60. }
  61. if (!m_CheckVersionComplete)
  62. {
  63. return;
  64. }
  65. if (m_NeedUpdateVersion)
  66. {
  67. //MainEntry.CommonUI.messageBox.ShowMessage("有更新,是否更新?", UnityCommon.MessageBoxParams.MessageType.ConfirmCancel, (res) =>
  68. //{
  69. // if (res == UnityCommon.MessageBoxParams.ResultType.Confirm)
  70. // {
  71. procedureOwner.SetData<VarInt32>("VersionListLength", m_VersionInfo.VersionListLength);
  72. procedureOwner.SetData<VarInt32>("VersionListHashCode", m_VersionInfo.VersionListHashCode);
  73. procedureOwner.SetData<VarInt32>("VersionListCompressedLength", m_VersionInfo.VersionListCompressedLength);
  74. procedureOwner.SetData<VarInt32>("VersionListCompressedHashCode", m_VersionInfo.VersionListCompressedHashCode);
  75. ChangeState<ProcedureUpdateVersion>(procedureOwner);
  76. // }
  77. // else
  78. // {
  79. // ChangeState<ProcedureCheckResources>(procedureOwner);
  80. // }
  81. //});
  82. //showMessage = true;
  83. }
  84. else
  85. {
  86. ChangeState<ProcedureVerifyResources>(procedureOwner);
  87. }
  88. }
  89. private void GotoUpdateApp(object userData)
  90. {
  91. string url = null;
  92. #if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN
  93. url = MainEntry.BuiltinData.BuildInfo.WindowsAppUrl;
  94. #elif UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX
  95. url = MainEntry.BuiltinData.BuildInfo.MacOSAppUrl;
  96. #elif UNITY_IOS
  97. url = MainEntry.BuiltinData.BuildInfo.IOSAppUrl;
  98. #elif UNITY_ANDROID
  99. url = MainEntry.BuiltinData.BuildInfo.AndroidAppUrl;
  100. #endif
  101. if (!string.IsNullOrEmpty(url))
  102. {
  103. Application.OpenURL(url);
  104. }
  105. }
  106. private void OnWebRequestSuccess(object sender, GameEventArgs e)
  107. {
  108. WebRequestSuccessEventArgs ne = (WebRequestSuccessEventArgs)e;
  109. if (ne.UserData != this)
  110. {
  111. return;
  112. }
  113. // 解析版本信息
  114. byte[] versionInfoBytes = ne.GetWebResponseBytes();
  115. string versionInfoString = Converter.GetString(versionInfoBytes);
  116. m_VersionInfo = Json.ToObject<VersionInfo>(versionInfoString);
  117. if (m_VersionInfo == null)
  118. {
  119. Log.Error("Parse VersionInfo failure.");
  120. return;
  121. }
  122. 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());
  123. if (m_VersionInfo.ForceUpdateGame)
  124. {
  125. // 需要强制更新游戏应用
  126. //MainEntry.UI.OpenDialog(new DialogParams
  127. //{
  128. // Mode = 2,
  129. // Title = MainEntry.Localization.GetString("ForceUpdate.Title"),
  130. // Message = MainEntry.Localization.GetString("ForceUpdate.Message"),
  131. // ConfirmText = MainEntry.Localization.GetString("ForceUpdate.UpdateButton"),
  132. // OnClickConfirm = GotoUpdateApp,
  133. // CancelText = MainEntry.Localization.GetString("ForceUpdate.QuitButton"),
  134. // OnClickCancel = delegate (object userData) { UnityGameFramework.Runtime.MainEntry.Shutdown(ShutdownType.Quit); },
  135. //});
  136. return;
  137. }
  138. // 设置资源更新下载地址
  139. MainEntry.Resource.UpdatePrefixUri = Path.GetRegularPath(m_VersionInfo.UpdatePrefixUri);
  140. m_CheckVersionComplete = true;
  141. m_NeedUpdateVersion = MainEntry.Resource.CheckVersionList(m_VersionInfo.InternalResourceVersion) == CheckVersionListResult.NeedUpdate;
  142. }
  143. private void OnWebRequestFailure(object sender, GameEventArgs e)
  144. {
  145. WebRequestFailureEventArgs ne = (WebRequestFailureEventArgs)e;
  146. if (ne.UserData != this)
  147. {
  148. return;
  149. }
  150. Log.Warning("Check version failure, error message is '{0}'.", ne.ErrorMessage);
  151. m_webErr = true;
  152. }
  153. private string GetPlatformPath()
  154. {
  155. switch (Application.platform)
  156. {
  157. case RuntimePlatform.WindowsEditor:
  158. case RuntimePlatform.WindowsPlayer:
  159. return "Windows";
  160. case RuntimePlatform.OSXEditor:
  161. case RuntimePlatform.OSXPlayer:
  162. return "MacOS";
  163. case RuntimePlatform.IPhonePlayer:
  164. return "IOS";
  165. case RuntimePlatform.Android:
  166. return "Android";
  167. default:
  168. throw new System.NotSupportedException(Text.Format("Platform '{0}' is not supported.", Application.platform));
  169. }
  170. }
  171. }
  172. }