ProcedureCheckVersion.cs 6.5 KB

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