Beispiel #1
0
        private IEnumerator DownloadSingleFile(SingleFileDownloadRequest sr)
        {
            FileUtils.DeleteFile(sr.targetPath);

            var request = UnityWebRequest.Get(sr.url);

            request.downloadHandler = new DownloadHandlerFile(sr.targetPath);
            yield return(request.SendWebRequest());

            var(errorType, errorMsg) = CheckWebRequestError(sr, request);
            request.Dispose();

            if (errorType != WebRequestError.None)
            {
                CommonLog.Error(MAuthor.WY, errorMsg);
                var displayError = errorType == WebRequestError.Raw ? errorMsg : $"错误码:10{(int) errorType}";
                var mb           = MessageBox.Show("提示", $"获取服务器文件{Path.GetFileName(sr.url)} 失败 {displayError}", "重试", "退出");
                yield return(mb);

                if (mb.isOk)
                {
                    StartUpdate();
                }
                else
                {
                    Quit();
                }

                sr.success = false;
                yield break;
            }

            sr.success = true;
        }
Beispiel #2
0
        private (WebRequestError, string) CheckWebRequestError(SingleFileDownloadRequest sr,
                                                               UnityWebRequest request)
        {
            var error = request.error;

            if (!string.IsNullOrEmpty(error))
            {
                return(WebRequestError.Raw, error);
            }

            if (!File.Exists(sr.targetPath))
            {
                error = $"download finish but {sr.targetPath} not exist";
                return(WebRequestError.NoExist, error);
            }

            if (sr.md5 != null)
            {
                var bs        = File.ReadAllBytes(sr.targetPath);
                var md5Struct = MD5Creater.GenerateMd5Code(bs);
                var bm        = sr.md5.Value;
                if (md5Struct.MD51 != bm.MD51 || md5Struct.MD52 != bm.MD52)
                {
                    error =
                        $"download file {sr.targetPath} md5 error {md5Struct.GetMD5Str(false)}->{bm.GetMD5Str(false)}";
                    return(WebRequestError.Md5, error);
                }
            }

            return(WebRequestError.None, null);
        }
Beispiel #3
0
        private IEnumerator RequestVersions()
        {
            OnMessage("正在获取版本信息...");
            if (Application.internetReachability == NetworkReachability.NotReachable)
            {
                var mb = MessageBox.Show("提示", "请检查网络连接状态", "重试", "退出");
                yield return(mb);

                if (mb.isOk)
                {
                    StartUpdate();
                }
                else
                {
                    Quit();
                }

                yield break;
            }

            var versionFilePath           = _tempDownloadPath + VersionInfoFileName;
            var singleFileDownloadRequest = new SingleFileDownloadRequest();

            singleFileDownloadRequest.Reset(GetDownloadURL(VersionInfoFileName), versionFilePath);
            yield return(DownloadSingleFile(singleFileDownloadRequest));

            if (!singleFileDownloadRequest.success)
            {
                yield break;
            }

            VersionInfo versionInfo;

            try
            {
                var versionFileStr = File.ReadAllText(versionFilePath);
                versionInfo = versionFileStr.FromXML <VersionInfo>();
            }
            catch (Exception e)
            {
                CommonLog.Error(e.Message);
                MessageBox.Show("提示", "版本文件加载失败", "重试", "退出").onComplete +=
                    delegate(MessageBox.EventId id)
                {
                    if (id == MessageBox.EventId.Ok)
                    {
                        StartUpdate();
                    }
                    else
                    {
                        Quit();
                    }
                };

                yield break;
            }

            var state = versionInfo.CheckUpdateState(AssetBundleManager.Instance.GetVersion());

            _currentTargetVersion = versionInfo;
            var versionStr = versionInfo.DumpVersion();

            CommonLog.Log(MAuthor.WY, $"check version {versionStr} result {state}");
            if (state == VersionInfo.State.NeedUpdate)
            {
                //下载xmf
                var xmfFileName   = AssetBundlePathResolver.BundleSaveDirName + FileMapGroupInfo.FileExtension;
                var xmfTargetPath = _tempDownloadPath + xmfFileName;
                singleFileDownloadRequest.Reset(GetDownloadURL(xmfFileName, versionStr), xmfTargetPath,
                                                new MD5Creater.MD5Struct
                {
                    MD51 = versionInfo.AssetBundlesCacheXmfMd51, MD52 = versionInfo.AssetBundlesCacheXmfMd52
                });
                yield return(DownloadSingleFile(singleFileDownloadRequest));

                if (!singleFileDownloadRequest.success)
                {
                    yield break;
                }

                //下载AssetBundleXMLData.xml
                var xmlPath = _tempDownloadPath + AssetBundlePathResolver.DependFileName;
                singleFileDownloadRequest.Reset(
                    GetDownloadURL(AssetBundlePathResolver.DependFileName, versionStr), xmlPath,
                    new MD5Creater.MD5Struct
                {
                    MD51 = versionInfo.AssetBundleXmlMd51, MD52 = versionInfo.AssetBundleXmlMd52
                });
                yield return(DownloadSingleFile(singleFileDownloadRequest));

                if (!singleFileDownloadRequest.success)
                {
                    yield break;
                }

                var tableStr = File.ReadAllText(xmlPath);
                _currentDownloadAssetBundleTable = tableStr.FromXML <AssetBundleTable>();

                var newFileMap = new FileMapSystem.FileMapSystem(_tempDownloadPath);
                var bs         = File.ReadAllBytes(xmfTargetPath);
                newFileMap.InitFileMapInfo(bs);

                PrepareDownloads(newFileMap, versionStr);
                _step = Step.Prepared;
            }
            else
            {
                switch (state)
                {
                case VersionInfo.State.MustDownloadAppAgain:
                {
#if UNITY_ANDROID
                    ShowAndroidUpdateDialog(versionInfo.AppUpdateUrl);
                    yield break;
#elif UNITY_IOS
                    ShowIOSUpdateDialog(versionInfo.AppUpdateUrl);
                    yield break;
#else
                    var mb = MessageBox.Show("提示", $"需要重新下载app");
                    yield return(mb);

                    Quit();
#endif
                    break;
                }

                case VersionInfo.State.NotNeedUpdate:
                {
                    OnComplete();
                    break;
                }
                }
            }
        }