Exemplo n.º 1
0
    //第一阶段更新,取得本地版本和服务器版本,下载服务器版本信息
    public static IEnumerable UpdateCoroutinePhase1()
    {
        //初始化
        UpdateInfoUtil.SetProgress(UPDATE_PROGRESS.Total, 0.0f);
        UpdateInfoUtil.SetProgress(UPDATE_PROGRESS.File, 0.0f);
        UpdateInfoUtil.SetCanPlay(false);

        //取得本地版本
        UpdateInfoUtil.SetStateString(UPDATE_STATE.UpdateStatus_TryGetLocalVersion);
        yield return(null);

        var code = Patcher.Instance.GetLocalVersion();

        if (code != UpdateRetCode.success)       //无法取得本地版本
        {
            UpdateInfoUtil.SetCanPlay(false);
            yield return(new WaitForSeconds(1.0f));

            UpdateInfoUtil.SetStateString(UPDATE_STATE.UpdateState_GetLocalVersionErr);

            Patcher.Instance.LogString("GetLocalVersion Failed!");
            yield return(code);
        }
        else
        {
            //设置本地版本
            UpdateInfoUtil.SetVersion(UPDATE_VERSION.Local, Patcher.Instance.m_CurrentVersion);
        }

        //log
        Patcher.Instance.LogString(HobaText.Format("Client Current Version: {0}", Patcher.Instance.m_CurrentVersion.ToString()));
        Patcher.Instance.LogString(HobaText.Format("FreeDiskSpace: {0}", OSUtility.GetFreeDiskSpace()));

        //检查磁盘空间

        /*
         * UpdateInfoUtil.SetStateString(UPDATE_STATE.UpdateStatus_TryCheckFreeSpace);
         * yield return null;
         * code = Patcher.Instance.CheckDiskFreeSpace(nCheckFreeSpaceMB * 1024 * 1024);
         * if (code != UpdateRetCode.success)
         * {
         *  UpdateInfoUtil.SetCanPlay(false);
         *  yield return new WaitForSeconds(1.0f);
         *
         *  UpdateInfoUtil.SetStateString(UPDATE_STATE.UpdateState_DiskSpaceFullErr);
         *
         *  Patcher.Instance.LogString("CheckDiskFreeSpace Failed!");
         *  yield return code;
         * }
         */

        //test

        /*
         * string url = "https://www.google.com";
         * string hostName = UpdateUtility.GetHostName(url);
         * string errMsg1;
         * var code1 = UpdateUtility.GetByUrl(url, hostName, System.IO.Path.Combine(EntryPoint.Instance.DocPath, "google.txt"), 10, null, null, out errMsg1);
         * Patcher.Instance.LogString(HobaText.Format("Download Test: {0} {1} {2}", url, code1, errMsg1));
         */

        if (!EntryPoint.Instance.SkipUpdate)             //配置跳过更新
        {
            //DNS解析, 忽略解析错误
            UpdateInfoUtil.SetStateString(UPDATE_STATE.UpdateStatus_TryDNSResolving);
            yield return(null);

            string errUpdateServer;
            string errClientServer;
            code = Patcher.Instance.DNSResolving(2, out errUpdateServer, out errClientServer);
            if (!string.IsNullOrEmpty(errUpdateServer))
            {
                Patcher.Instance.LogString("UpdateServer DNSResolving Error : " + errUpdateServer);
            }
            if (!string.IsNullOrEmpty(errClientServer))
            {
                Patcher.Instance.LogString("errClientServer DNSResolving Error : " + errClientServer);
            }

            Patcher.Instance.LogString(string.Format("IP URL UpdateServer1: {0}, UpdateServer2: {1}, UpdateServer3: {2}",
                                                     Patcher.Instance.strUpdateServerDir1, Patcher.Instance.strUpdateServerDir2, Patcher.Instance.strUpdateServerDir3));
            Patcher.Instance.LogString(string.Format("IP URL ClientServer: {0}", Patcher.Instance.strClientServerDir));
            Patcher.Instance.LogString(string.Format("IP URL DynamicServer : {0}", Patcher.Instance.strDynamicServerDir));
            Patcher.Instance.LogString(string.Format("IP URL DynamicAccountRole : {0}", Patcher.Instance.strDynamicAccountRoleDir));

            //从服务器获取version.txt
            UpdateInfoUtil.SetStateString(UPDATE_STATE.UpdateStatus_TryGetNewVersion);
            yield return(null);

            string errMsg    = "";
            string savedFile = Patcher.Instance.strGameNewVerFile;

            DownloadTaskErrorCode dlCode = DownloadTaskErrorCode.Unknown;
            {
                //为了方便部署,内网version.txt用和更新资源jup同一目录,也就是cdn
                if (dlCode != DownloadTaskErrorCode.Success && !string.IsNullOrEmpty(Patcher.Instance.strUpdateServerDir1))
                {
                    string url1      = Patcher.Instance.strUpdateServerDir1 + UpdateConfig.VersionConfigRelativePath;
                    string hostName1 = Patcher.Instance.strUpdateServerHostName1;

                    int nTryConnect = 0;            //尝试多次连接
                    while (dlCode != DownloadTaskErrorCode.Success && nTryConnect < DownloadMan.maxTryConnect)
                    {
                        ++nTryConnect;
                        int timeout = (int)((float)DownloadMan.reqTimeOut * nTryConnect / DownloadMan.maxTryConnect);
                        dlCode = Patcher.Instance.FetchServerVersionFile(url1, hostName1, savedFile, timeout, out errMsg);
                    }
                }

                if (dlCode != DownloadTaskErrorCode.Success && !string.IsNullOrEmpty(Patcher.Instance.strUpdateServerDir2))
                {
                    string url2      = Patcher.Instance.strUpdateServerDir2 + UpdateConfig.VersionConfigRelativePath;
                    string hostName2 = Patcher.Instance.strUpdateServerHostName2;

                    int nTryConnect = 0;            //尝试多次连接
                    while (dlCode != DownloadTaskErrorCode.Success && nTryConnect < DownloadMan.maxTryConnect)
                    {
                        ++nTryConnect;
                        int timeout = (int)((float)DownloadMan.reqTimeOut * nTryConnect / DownloadMan.maxTryConnect);
                        dlCode = Patcher.Instance.FetchServerVersionFile(url2, hostName2, savedFile, DownloadMan.reqTimeOut, out errMsg);
                    }
                }

                if (dlCode != DownloadTaskErrorCode.Success && !string.IsNullOrEmpty(Patcher.Instance.strUpdateServerDir3))
                {
                    string url3      = Patcher.Instance.strUpdateServerDir3 + UpdateConfig.VersionConfigRelativePath;
                    string hostName3 = Patcher.Instance.strUpdateServerHostName3;

                    int nTryConnect = 0;            //尝试多次连接
                    while (dlCode != DownloadTaskErrorCode.Success && nTryConnect < DownloadMan.maxTryConnect)
                    {
                        ++nTryConnect;
                        int timeout = (int)((float)DownloadMan.reqTimeOut * nTryConnect / DownloadMan.maxTryConnect);
                        dlCode = Patcher.Instance.FetchServerVersionFile(url3, hostName3, savedFile, DownloadMan.reqTimeOut, out errMsg);
                    }
                }
            }


            if (dlCode != DownloadTaskErrorCode.Success)
            {
                UpdateInfoUtil.SetCanPlay(false);
                yield return(new WaitForSeconds(1.0f));

                UpdateInfoUtil.SetStateString(UPDATE_STATE.UpdateState_GetNewVersionErr);

                if (dlCode == DownloadTaskErrorCode.Md5Dismatch)
                {
                    code = UpdateRetCode.md5_not_match;
                }
                else
                {
                    code = UpdateRetCode.download_fail;
                }

                Patcher.Instance.LogString("FetchServerVersionFile Failed! DownloadTaskErrorCode: " + dlCode + ": " + errMsg);

                yield return(code);
            }

            //读取游戏新版本信息
            code = Patcher.Instance.TryGetLatestVersionFromServer();
        }
        else
        {
            //读取游戏新版本信息
            code = UpdateRetCode.success;
        }

        if (code != UpdateRetCode.success)
        {
            UpdateInfoUtil.SetCanPlay(false);
            yield return(new WaitForSeconds(1.0f));

            UpdateInfoUtil.SetStateString(UPDATE_STATE.UpdateState_GetNewVersionErr);

            Patcher.Instance.LogString("GetVersionMan Failed!");
            yield return(code);
        }
        else
        {
            //设置服务器版本
            UpdateInfoUtil.SetVersion(UPDATE_VERSION.Server, Patcher.Instance.m_VersionMan.VerLastest);
        }

        //log
        Patcher.Instance.LogString(HobaText.Format("Server Version: {0}", Patcher.Instance.m_VersionMan.VerLastest.ToString()));

        UpdateInfoUtil.SetDownloadTotalSize(GameUpdateMan.Instance.GetDownloadTotalSize());

        UpdateInfoUtil.SetCanPlay(false);
        UpdateInfoUtil.SetStateString(UPDATE_STATE.UpdateStatus_SuccessGetVersions);
        yield return(code);
    }
Exemplo n.º 2
0
    //第二阶段更新,下载更新包
    public static IEnumerable UpdateCoroutinePhase2()
    {
        UpdateRetCode code = UpdateRetCode.success;

        if (EntryPoint.Instance.SkipUpdate)             //配置跳过更新
        {
            yield return(code);
        }

        if (Patcher.Instance.IsWritingPackFileExist())
        {
            code = UpdateRetCode.pack_err;
            UpdateInfoUtil.SetCanPlay(false);

            UpdateInfoUtil.SetStateString(UPDATE_STATE.UpdateStatus_LastWritePackErr);

            Patcher.Instance.LogString("Last IsWritingPackFileExist!");
            yield return(code);
        }

        //初始化pck环境
        code = Patcher.Instance.InitPackages();
        if (code != UpdateRetCode.success)
        {
            Patcher.Instance.ReleasePackages();     //释放pck环境

            UpdateInfoUtil.SetCanPlay(false);
            UpdateInfoUtil.SetStateString(UPDATE_STATE.UpdateState_OpenPackFileErr);

            Patcher.Instance.LogString("InitPackages Failed!");
            yield return(code);
        }

        //清除写包标志,如果成功打开包
        Patcher.Instance.WritePacking(false);

        yield return(null);

        //
        ELEMENT_VER verBegin  = Patcher.Instance.m_CurrentVersion;
        ELEMENT_VER verLatest = Patcher.Instance.m_VersionMan.VerLastest;

        //检查磁盘空间
        long packSizeOverAll = Patcher.Instance.m_VersionMan.CalcSize(verBegin, verLatest);

        code = Patcher.Instance.CheckDiskFreeSpace(packSizeOverAll + 100 * 1024 * 1024);
        if (code != UpdateRetCode.success)
        {
            UpdateInfoUtil.SetCanPlay(false);
            yield return(new WaitForSeconds(1.0f));

            UpdateInfoUtil.SetStateString(UPDATE_STATE.UpdateState_DiskSpaceFullErr);

            Patcher.Instance.LogString("CheckDiskFreeSpace Failed!");
            yield return(code);
        }

        while (true)
        {
            if (Patcher.Instance.m_CurrentVersion == verLatest ||                            //更新完成
                Patcher.Instance.m_CurrentVersion > verLatest)
            {
                Patcher.Instance.ReleasePackages();

                code = UpdateRetCode.success;

                UpdateInfoUtil.SetProgress(UPDATE_PROGRESS.Total, 1.0f);
                UpdateInfoUtil.SetProgress(UPDATE_PROGRESS.File, 1.0f);

                UpdateInfoUtil.SetStateString(UPDATE_STATE.UpdateState_Success);
                yield return(code);                                                                 //退出coroutine
            }
            else if (Patcher.Instance.m_CurrentVersion < Patcher.Instance.m_VersionMan.VerSeperate) //本地版本过旧
            {
                Patcher.Instance.ReleasePackages();

                code = UpdateRetCode.patcher_version_too_new;

                UpdateInfoUtil.SetCanPlay(false);
                yield return(new WaitForSeconds(1.0f));

                UpdateInfoUtil.SetStateString(UPDATE_STATE.UpdateState_LocalVersionTooOldErr);
                yield return(code);                //退出coroutine
            }

            //找到版本pair
            code = Patcher.Instance.FindVersionPair();
            if (code != UpdateRetCode.success)
            {
                Patcher.Instance.ReleasePackages();

                UpdateInfoUtil.SetCanPlay(false);
                yield return(new WaitForSeconds(1.0f));

                UpdateInfoUtil.SetStateString(UPDATE_STATE.UpdateState_ServerMaintananceErr);

                Patcher.Instance.LogString("FindVersionPair Failed!");
                yield return(code);               //退出coroutine
            }
            else
            {
                //当前version_pair
                Patcher.Instance.LogString(HobaText.Format("Will update from {0} to {1}", Patcher.Instance.m_PackFileVer.VerFrom.ToString(), Patcher.Instance.m_PackFileVer.VerTo.ToString()));
            }

            yield return(null);

            //更新
            foreach (var item in Patcher.Instance.UpdateAutoCoroutine(verBegin, verLatest))
            {
                if (item is UpdateRetCode)
                {
                    code = (UpdateRetCode)item;
                    break;
                }

                yield return(item);
            }
            if (code != UpdateRetCode.success)
            {
                break;
            }
        }

        switch (code)
        {
        case UpdateRetCode.success:
        {
            UpdateInfoUtil.SetProgress(UPDATE_PROGRESS.Total, 1.0f);
            UpdateInfoUtil.SetProgress(UPDATE_PROGRESS.File, 1.0f);
            yield return(null);
        }
        break;

        case UpdateRetCode.md5_not_match:
        {
            Patcher.Instance.LogString(HobaText.Format("AutoUpdate Failed! {0}", code));
            UpdateInfoUtil.SetCanPlay(false);
            UpdateInfoUtil.SetStateString(UPDATE_STATE.UpdateState_NetUnstable);
            yield return(null);
        }
        break;

        case UpdateRetCode.connect_fail:
        {
            Patcher.Instance.LogString(HobaText.Format("AutoUpdate Failed! {0}", code));
            UpdateInfoUtil.SetCanPlay(false);
            UpdateInfoUtil.SetStateString(UPDATE_STATE.UpdateState_NetConnectionErr);
            yield return(null);
        }
        break;

        default:
        {
            Patcher.Instance.LogString(HobaText.Format("AutoUpdate Failed! {0}", code));
            UpdateInfoUtil.SetCanPlay(false);
            UpdateInfoUtil.SetStateString(UPDATE_STATE.UpdateState_AutoUpdateErr);
            yield return(null);
        }
        break;
        }

        Patcher.Instance.ReleasePackages();     //释放pck环境
        Patcher.Instance.CleanPatcherTmpDir();  //清除Tmp目录

        yield return(code);
    }
Exemplo n.º 3
0
    public IEnumerable UpdateRoutine()
    {
        //检查系统内存

        /*
         * if (SystemInfo.systemMemorySize < nMemoryMinimum)
         * {
         *  yield return new WaitForUserClick(MessageBoxStyle.MB_YesNo,
         *          HobaText.Format(EntryPoint.Instance.UpdateStringConfigParams.SystemRequire_Memory, nMemoryMinimum),
         *          UpdateInfoUtil.GetStateString(UPDATE_STATE.UpdateString_HasError));
         *
         *  if (WaitForUserClick.RetCode == 0)
         *  {
         *      Patcher.Instance.UpdateExit();
         *      EntryPoint.ExitGame();
         *      yield break;
         *  }
         * }
         * */

        LTPlatformBase.ShareInstance().SetBreakPoint(SDK.POINT_STATE.Game_Check_Update); //平台SDK打点:检查更新

        yield return(null);

        //更新资源,测试
        {
            string baseDir = EntryPoint.Instance.ResPath;
            string docDir  = EntryPoint.Instance.DocPath;
            string libDir  = EntryPoint.Instance.LibPath;
            string tmpDir  = EntryPoint.Instance.TmpPath;

            string updateServerDir1      = EntryPoint.Instance.GetUpdateServerUrl1();
            string updateServerDir2      = EntryPoint.Instance.GetUpdateServerUrl2();
            string updateServerDir3      = EntryPoint.Instance.GetUpdateServerUrl3();
            string clientServerDir       = EntryPoint.Instance.GetClientServerUrl();
            string dynamicServerDir      = EntryPoint.Instance.GetDynamicServerUrl();
            string dynamicAccountRoleDir = EntryPoint.Instance.GetDynamicAccountRoleUrl();

            foreach (var item in Patcher.Instance.Init(baseDir, docDir, libDir, tmpDir,
                                                       updateServerDir1, updateServerDir2, updateServerDir3, clientServerDir, dynamicServerDir, dynamicAccountRoleDir))
            {
                yield return(item);
            }

            //设置初始版本
#if  UNITY_EDITOR //|| UNITY_STANDALONE_WIN
            Patcher.Instance.CleanAllUpdatesReturnToBase(Patcher.Instance.BaseVersion);
#else
            string baseVersion   = CPlatformConfig.GetBaseVersion();
            bool   bWriteVersion = Patcher.Instance.SetFirstVersion(baseVersion, false);
            if (bWriteVersion)
            {
                Patcher.Instance.CleanAllUpdatesReturnToBase(Patcher.Instance.BaseVersion);
            }
#endif

            bool          bSkipPhase2 = false;
            UpdateRetCode retCode     = UpdateRetCode.success;

UpdateStartPhase1:
            //阶段1...
            int nTryTime = 0;
            do
            {
                _HotUpdateViewer.SetInstallPercent(-1.0f);

                foreach (var item in Patcher.UpdateCoroutinePhase1())
                {
                    CUpdateInfo updateInfo = UpdateInfoUtil.GetUpdateInfo();
                    _HotUpdateViewer.SetPartProgress(updateInfo.curUpdateProgress);
                    _HotUpdateViewer.SetAllProgress(updateInfo.totalUpdateProgress);
                    _HotUpdateViewer.SetDesc(updateInfo.strUpdateInfo);

                    //新UI
                    _HotUpdateViewer.SetCurrentVersion(updateInfo.curVersion);
                    _HotUpdateViewer.SetServerVersion(updateInfo.serverVersion);

                    yield return(null);

                    if (item is UpdateRetCode)
                    {
                        retCode = (UpdateRetCode)item;
                        break;
                    }

                    yield return(item);
                }

                m_CurrentVersion = Patcher.Instance.m_CurrentVersion.ToString();
                m_ServerVersion  = Patcher.Instance.m_VersionMan.VerLastest.ToString();

                if (retCode != UpdateRetCode.success)               //错误处理
                {
                    if (nTryTime == 0)
                    {
                        _HotUpdateViewer.SetCircle(false);
                        yield return(new WaitForUserClick(MessageBoxStyle.MB_OK,
                                                          UpdateInfoUtil.GetStateString(UPDATE_STATE.UpdateState_NetworkErr),
                                                          UpdateInfoUtil.GetStateString(UPDATE_STATE.UpdateString_HasError)));

                        UpdateInfoUtil.SetCanPlay(false);    //重试
                    }
                    else
                    {
                        LTPlatformBase.ShareInstance().SetBreakPoint(SDK.POINT_STATE.Game_Check_Update_Fail); //平台SDK打点:检查更新失败

                        _HotUpdateViewer.SetCircle(false);
                        yield return(new WaitForUserClick(MessageBoxStyle.MB_OK,
                                                          UpdateInfoUtil.GetStateString(UPDATE_STATE.UpdateState_NetConnectionErr),
                                                          UpdateInfoUtil.GetStateString(UPDATE_STATE.UpdateString_HasError)));

#if !UNITY_EDITOR
                        Patcher.Instance.UpdateExit();
                        EntryPoint.ExitGame();
                        yield break;
#else                                                            //忽略错误,直接游戏
                        retCode     = UpdateRetCode.success;
                        bSkipPhase2 = true;
                        break;
#endif
                    }

                    ++nTryTime;
                }
                else                 //成功
                {
                    if (IsVersionCanUpdate() && !IsVersionComplete())
                    {
                        long   downloadSize = GetDownloadTotalSize();
                        string num          = string.Empty;
                        float  fMB          = downloadSize / (1024.0f * 1024.0f);
                        if (fMB >= 1f)
                        {
                            fMB = ((fMB * 10) - (fMB * 10) % 1) / 10; //保留一位小数
                            if (fMB % 1 > 0)
                            {
                                //有小数点
                                num = HobaText.Format("{0:0.0} MB", fMB);
                            }
                            else
                            {
                                num = HobaText.Format("{0:0} MB", fMB);
                            }
                        }
                        else
                        {
                            float fKB = downloadSize / 1024.0f;
                            num = HobaText.Format("{0:0} KB", fKB);
                        }

                        //下载总量提示
                        _HotUpdateViewer.SetCircle(false);
                        yield return(new WaitForUserClick(MessageBoxStyle.MB_OkCancel,
                                                          UpdateInfoUtil.GetStateString(UPDATE_STATE.UpdateState_DownloadCheck),
                                                          UpdateInfoUtil.GetStateString(UPDATE_STATE.UpdateStatus_BeginUpdate),
                                                          UpdateInfoUtil.GetStateString(UPDATE_STATE.UpdateString_WifiTips),
                                                          num));

                        if (WaitForUserClick.RetCode == 0)
                        {
                            LTPlatformBase.ShareInstance().SetBreakPoint(SDK.POINT_STATE.Game_Check_Update_Fail); //平台SDK打点:检查更新失败
                            Patcher.Instance.UpdateExit();
                            EntryPoint.ExitGame();
                            yield break;
                        }

                        //存储空间检查,提示
                        long lDiskSize = OSUtility.GetFreeDiskSpace();
                        long lNeedSize = (long)(downloadSize * fExtraSpace) + 100 * 1024 * 1024;

                        Patcher.Instance.LogString(HobaText.Format("CheckDownloadSize! FreeDiskSize: {0}, NeedSize: {1}", lDiskSize, lNeedSize));

                        if (lDiskSize != 0 && lDiskSize < lNeedSize)
                        {
                            LTPlatformBase.ShareInstance().SetBreakPoint(SDK.POINT_STATE.Game_Check_Update_Fail); //平台SDK打点:检查更新失败

                            long   iNeedSizeMB       = lNeedSize / (1024 * 1024);
                            string strNoSpaceMessage = HobaText.Format(EntryPoint.Instance.UpdateStringConfigParams.SystemRequire_Space, iNeedSizeMB);
                            yield return(new WaitForUserClick(MessageBoxStyle.MB_OK,
                                                              strNoSpaceMessage,
                                                              UpdateInfoUtil.GetStateString(UPDATE_STATE.UpdateString_HasFatalError)));

                            Patcher.Instance.UpdateExit();
                            EntryPoint.ExitGame();
                            yield break;
                        }

                        _HotUpdateViewer.StartPromotion();
                    }
                    break;              //确认下载,进入下一阶段
                }
            } while (true);

            if (!bSkipPhase2 && retCode == UpdateRetCode.success)
            {
                yield return(new WaitForSeconds(0.2f));

                if (!IsVersionComplete() && !bWifiMsgBoxShow)           //需要下载更新包,如果不是wifi需要提示
                {
                    if (OSUtility.IsNetAvailable() && !OSUtility.IsWifi())
                    {
                        _HotUpdateViewer.SetCircle(false);
                        yield return(new WaitForUserClick(MessageBoxStyle.MB_OkCancel,
                                                          UpdateInfoUtil.GetStateString(UPDATE_STATE.UpdateString_HasErrorNotWifi),
                                                          UpdateInfoUtil.GetStateString(UPDATE_STATE.UpdateString_HasError)));

                        bWifiMsgBoxShow = true;

                        if (WaitForUserClick.RetCode == 0)
                        {
                            LTPlatformBase.ShareInstance().SetBreakPoint(SDK.POINT_STATE.Game_Check_Update_Fail); //平台SDK打点:检查更新失败
                            Patcher.Instance.UpdateExit();
                            EntryPoint.ExitGame();
                            yield break;
                        }
                        //继续
                    }
                }

                //阶段2...
                do
                {
                    foreach (var item in Patcher.UpdateCoroutinePhase2())
                    {
                        CUpdateInfo updateInfo = UpdateInfoUtil.GetUpdateInfo();
                        _HotUpdateViewer.SetPartProgress(updateInfo.curUpdateProgress);
                        _HotUpdateViewer.SetAllProgress(updateInfo.totalUpdateProgress);
                        _HotUpdateViewer.SetDesc(updateInfo.strUpdateInfo);
                        _HotUpdateViewer.SetCurrentVersion(updateInfo.curVersion);
                        _HotUpdateViewer.SetServerVersion(updateInfo.serverVersion);

                        yield return(null);

                        if (item is UpdateRetCode)
                        {
                            retCode = (UpdateRetCode)item;
                            break;
                        }
                        else
                        {
                            yield return(item);
                        }
                    }

                    if (retCode == UpdateRetCode.pack_err ||                  //包错误, 严重错误,需要清空所有更新目录重试
                        retCode == UpdateRetCode.pack_open_err ||
                        retCode == UpdateRetCode.pack_read_err ||
                        retCode == UpdateRetCode.pack_write_err)
                    {
                        _HotUpdateViewer.SetCircle(false);
                        yield return(new WaitForUserClick(MessageBoxStyle.MB_OK,
                                                          UpdateInfoUtil.GetStateString(UPDATE_STATE.UpdateString_HasFatalErrorNeedCleanUp),
                                                          UpdateInfoUtil.GetStateString(UPDATE_STATE.UpdateString_HasFatalError)));

                        yield return(new WaitForSeconds(1.0f));

                        //上次写包错误,这时需要删除所有更新包,从基础版本重新更新,待测试
                        Patcher.Instance.CleanAllUpdatesReturnToBase(Patcher.Instance.BaseVersion);
                        UpdateInfoUtil.SetCanPlay(false);    //重试

                        yield return(new WaitForSeconds(1.0f));

                        goto UpdateStartPhase1;                                //重新开始更新,阶段1
                    }
                    else if (retCode == UpdateRetCode.patcher_version_too_new) //版本太老,不能通过自动更新解决, 需要重新下载程序
                    {
                        _HotUpdateViewer.SetCircle(false);
#if UNITY_STANDALONE_WIN
                        //FIXME:: 原逻辑版本不一致都不能进入游戏, 策划需求Windows 特殊处理点取消进入游戏,忽略程序版本限制
                        yield return(new WaitForUserClick(MessageBoxStyle.MB_OkCancel,
                                                          UpdateInfoUtil.GetStateString(UPDATE_STATE.UpdateString_HasFatalErrorNeedReinstall),
                                                          UpdateInfoUtil.GetStateString(UPDATE_STATE.UpdateStatus_BeginUpdate)));

                        if (WaitForUserClick.RetCode == 0)
                        {
                            retCode = UpdateRetCode.success;       //走Phase3
                            break;
                        }
                        else
                        {
                            Patcher.Instance.UpdateExit();
                            EntryPoint.ExitGame();
                            yield break;
                        }
#else
                        //FIXME:: 原逻辑
                        LTPlatformBase.ShareInstance().SetBreakPoint(SDK.POINT_STATE.Game_Check_Update_Fail); //平台SDK打点:检查更新失败
#if PLATFORM_KAKAO
                        while (true)
                        {
                            yield return(new WaitForUserClick(MessageBoxStyle.MB_OK,
                                                              UpdateInfoUtil.GetStateString(UPDATE_STATE.UpdateString_HasFatalErrorNeedReinstall),
                                                              UpdateInfoUtil.GetStateString(UPDATE_STATE.UpdateStatus_BeginUpdate)));


                            string url = string.Empty;
                            if (Application.platform == RuntimePlatform.Android)
                            {
                                string id = "com.longtugame.xxaxc"; //写死
                                url = string.Format("market://details?id={0}", id);
                            }
                            else if (Application.platform == RuntimePlatform.IPhonePlayer)
                            {
                                string id = "1073000645"; //写死
                                url = string.Format("itms-apps://itunes.apple.com/app/id{0}?action=write-review", id);
                            }
                            Patcher.Instance.LogString(string.Format("OpenUrl:{0}", url));
                            OSUtility.OpenUrl(url);  //跳转到商店

                            yield return(null);

                            yield return(null);
                        }
#else
                        // 非Kakao平台
                        yield return(new WaitForUserClick(MessageBoxStyle.MB_OK,
                                                          UpdateInfoUtil.GetStateString(UPDATE_STATE.UpdateString_HasFatalErrorNeedReinstall),
                                                          UpdateInfoUtil.GetStateString(UPDATE_STATE.UpdateStatus_BeginUpdate)));

                        Patcher.Instance.UpdateExit();
                        EntryPoint.ExitGame();
                        yield break;
#endif
#endif
                    }
                    else if (retCode == UpdateRetCode.pack_file_broken)                                       //某些安卓机型上出现解包错误,重启app继续更新即可
                    {
                        LTPlatformBase.ShareInstance().SetBreakPoint(SDK.POINT_STATE.Game_Check_Update_Fail); //平台SDK打点:检查更新失败

                        _HotUpdateViewer.SetCircle(false);
                        CUpdateInfo updateInfo = UpdateInfoUtil.GetUpdateInfo();
                        yield return(new WaitForUserClick(MessageBoxStyle.MB_OK,
                                                          updateInfo.strUpdateInfo,
                                                          UpdateInfoUtil.GetStateString(UPDATE_STATE.UpdateString_HasError)));

                        {
                            Patcher.Instance.UpdateExit();
#if UNITY_ANDROID
                            AndroidUtil.DoRestart(200);
#else
                            EntryPoint.ExitGame();
#endif
                            yield break;
                        }
                    }
                    else if (retCode != UpdateRetCode.success)               //普通错误处理
                    {
                        CUpdateInfo updateInfo = UpdateInfoUtil.GetUpdateInfo();
                        string      msgText    = string.Format("{0} {1}", updateInfo.strUpdateInfo, retCode.ToString());

                        _HotUpdateViewer.SetCircle(false);
                        yield return(new WaitForUserClick(MessageBoxStyle.MB_OkCancel,
                                                          msgText,
                                                          UpdateInfoUtil.GetStateString(UPDATE_STATE.UpdateString_HasError)));

                        if (WaitForUserClick.RetCode == 0)
                        {
#if !UNITY_EDITOR
                            LTPlatformBase.ShareInstance().SetBreakPoint(SDK.POINT_STATE.Game_Check_Update_Fail); //平台SDK打点:检查更新失败
                            Patcher.Instance.UpdateExit();
                            EntryPoint.ExitGame();
                            yield break;
#else
                            retCode = UpdateRetCode.success;       //走Phase3
                            break;
#endif
                        }
                        else
                        {
                            UpdateInfoUtil.SetCanPlay(false);    //重试
                        }
                    }
                    else                   //成功
                    {
                        break;
                    }
                } while (true);
            }

            Patcher.Instance.ReleasePackages();

            //第三阶段,下载服务器列表
            if (retCode == UpdateRetCode.success)
            {
                _HotUpdateViewer.SetCircle(false);
                _HotUpdateViewer.PrepareEnterGame();
                //_HotUpdateViewer.SetInstallPercent(-1.0f);

                //yield return new WaitForSeconds(0.2f);

                float progress = 0f;
                float count    = 0;
                foreach (var item in Patcher.UpdateCoroutinePhase3())
                {
                    CUpdateInfo updateInfo = UpdateInfoUtil.GetUpdateInfo();
                    _HotUpdateViewer.SetPartProgress(updateInfo.curUpdateProgress);
                    _HotUpdateViewer.SetAllProgress(updateInfo.totalUpdateProgress);
                    _HotUpdateViewer.SetDesc(updateInfo.strUpdateInfo);
                    _HotUpdateViewer.SetCurrentVersion(updateInfo.curVersion);
                    _HotUpdateViewer.SetServerVersion(updateInfo.serverVersion);

                    //新UI
                    _HotUpdateViewer.SetInstallInfo(updateInfo.strUpdateInfo);
                    _HotUpdateViewer.SetEnterGameTips(updateInfo.strUpdateInfo);
                    //模拟进度条
                    _HotUpdateViewer.SetEnterGameProgress(progress);
                    float maxProgress = (count < 2) ? 0.5f : 1f;
                    progress = UnityEngine.Random.Range(progress, maxProgress);
                    count++;

                    yield return(null);

                    if (item is UpdateRetCode)
                    {
                        retCode = (UpdateRetCode)item;
                        break;
                    }
                    else
                    {
                        yield return(item);
                    }
                }

                if (retCode != UpdateRetCode.success)
                {
                    yield return(new WaitForSeconds(1.0f));

                    UpdateInfoUtil.SetCanPlay(false);
                }
                else
                {
                    _HotUpdateViewer.SetEnterGameProgress(1f);
                    yield return(new WaitForSeconds(0.3f));

                    UpdateInfoUtil.SetCanPlay(true);
                }
            }
        }

        Patcher.Instance.UpdateExit();

        if (UpdateInfoUtil.GetUpdateInfo().bCanPlay)
        {
            _IsUpdateSucceed = true;
            yield return(null);
        }

        //yield return new WaitForSeconds(2.0f);
    }