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; }
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); }
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; } } } }