/// <summary> /// 加载沙盒内的补丁清单 /// 注意:在加载本地补丁清单之前,已经验证过文件的哈希值 /// </summary> private void LoadSandboxPatchManifest(int updateResourceVersion) { YooLogger.Log("Load sandbox patch manifest file."); string filePath = PathHelper.MakePersistentLoadPath(YooAssetSettingsData.GetPatchManifestFileName(updateResourceVersion)); string jsonData = File.ReadAllText(filePath); var sandboxPatchManifest = PatchManifest.Deserialize(jsonData); _impl.SetLocalPatchManifest(sandboxPatchManifest); }
/// <summary> /// 获取沙盒内补丁清单文件的哈希值 /// 注意:如果沙盒内补丁清单文件不存在,返回空字符串 /// </summary> private string GetSandboxPatchManifestFileHash(int updateResourceVersion) { string filePath = PathHelper.MakePersistentLoadPath(YooAssetSettingsData.GetPatchManifestFileName(updateResourceVersion)); if (File.Exists(filePath)) { return(HashUtility.FileMD5(filePath)); } else { return(string.Empty); } }
internal override void Update() { if (_steps == ESteps.None || _steps == ESteps.Done) { return; } if (_steps == ESteps.LoadWebManifest) { string webURL = GetPatchManifestRequestURL(YooAssetSettingsData.GetPatchManifestFileName(_resourceVersion)); YooLogger.Log($"Beginning to request patch manifest : {webURL}"); _downloader = new UnityWebDataRequester(); _downloader.SendRequest(webURL, _timeout); _steps = ESteps.CheckWebManifest; } if (_steps == ESteps.CheckWebManifest) { Progress = _downloader.Progress(); if (_downloader.IsDone() == false) { return; } // Check error if (_downloader.HasError()) { _steps = ESteps.Done; Status = EOperationStatus.Failed; Error = _downloader.GetError(); } else { // 解析补丁清单 if (ParseRemotePatchManifest(_downloader.GetText())) { _steps = ESteps.Done; Status = EOperationStatus.Succeed; } else { _steps = ESteps.Done; Status = EOperationStatus.Failed; Error = $"URL : {_downloader.URL} Error : remote patch manifest content is invalid"; } } _downloader.Dispose(); } }
/// <summary> /// 解析并保存远端请求的补丁清单 /// </summary> private bool ParseAndSaveRemotePatchManifest(int updateResourceVersion, string content) { try { var remotePatchManifest = PatchManifest.Deserialize(content); _impl.SetLocalPatchManifest(remotePatchManifest); YooLogger.Log("Save remote patch manifest file."); string savePath = PathHelper.MakePersistentLoadPath(YooAssetSettingsData.GetPatchManifestFileName(updateResourceVersion)); PatchManifest.Serialize(savePath, remotePatchManifest); return(true); } catch (Exception e) { YooLogger.Error(e.ToString()); return(false); } }
internal override void Update() { if (_steps == ESteps.None || _steps == ESteps.Done) { return; } if (_steps == ESteps.LoadWebManifestHash) { string webURL = GetPatchManifestRequestURL(YooAssetSettingsData.GetPatchManifestHashFileName(_resourceVersion)); YooLogger.Log($"Beginning to request patch manifest hash : {webURL}"); _downloader1 = new UnityWebDataRequester(); _downloader1.SendRequest(webURL, _timeout); _steps = ESteps.CheckWebManifestHash; } if (_steps == ESteps.CheckWebManifestHash) { if (_downloader1.IsDone() == false) { return; } // Check error if (_downloader1.HasError()) { _steps = ESteps.Done; Status = EOperationStatus.Failed; Error = _downloader1.GetError(); } else { string webManifestHash = _downloader1.GetText(); string cachedManifestHash = GetSandboxPatchManifestFileHash(_resourceVersion); // 如果补丁清单文件的哈希值相同 if (cachedManifestHash == webManifestHash) { YooLogger.Log($"Patch manifest file hash is not change : {webManifestHash}"); LoadSandboxPatchManifest(_resourceVersion); _steps = ESteps.InitVerifyingCache; } else { YooLogger.Log($"Patch manifest hash is change : {webManifestHash} -> {cachedManifestHash}"); _steps = ESteps.LoadWebManifest; } } _downloader1.Dispose(); } if (_steps == ESteps.LoadWebManifest) { string webURL = GetPatchManifestRequestURL(YooAssetSettingsData.GetPatchManifestFileName(_resourceVersion)); YooLogger.Log($"Beginning to request patch manifest : {webURL}"); _downloader2 = new UnityWebDataRequester(); _downloader2.SendRequest(webURL, _timeout); _steps = ESteps.CheckWebManifest; } if (_steps == ESteps.CheckWebManifest) { if (_downloader2.IsDone() == false) { return; } // Check error if (_downloader2.HasError()) { _steps = ESteps.Done; Status = EOperationStatus.Failed; Error = _downloader2.GetError(); } else { // 解析补丁清单 if (ParseAndSaveRemotePatchManifest(_resourceVersion, _downloader2.GetText())) { _steps = ESteps.InitVerifyingCache; } else { _steps = ESteps.Done; Status = EOperationStatus.Failed; Error = $"URL : {_downloader2.URL} Error : remote patch manifest content is invalid"; } } _downloader2.Dispose(); } if (_steps == ESteps.InitVerifyingCache) { InitVerifyingCache(); _verifyTime = UnityEngine.Time.realtimeSinceStartup; _steps = ESteps.UpdateVerifyingCache; } if (_steps == ESteps.UpdateVerifyingCache) { Progress = GetVerifyProgress(); if (UpdateVerifyingCache()) { _steps = ESteps.Done; Status = EOperationStatus.Succeed; float costTime = UnityEngine.Time.realtimeSinceStartup - _verifyTime; YooLogger.Log($"Verify result : Success {_verifySuccessCount}, Fail {_verifyFailCount}, Elapsed time {costTime} seconds"); } } }
public void Update() { if (IsDone()) { return; } if (_steps == ESteps.LoadStaticVersion) { YooLogger.Log($"Load application static version."); string filePath = PathHelper.MakeStreamingLoadPath(YooAssetSettings.VersionFileName); string url = PathHelper.ConvertToWWWPath(filePath); _downloader1 = new UnityWebDataRequester(); _downloader1.SendRequest(url); _steps = ESteps.CheckStaticVersion; } if (_steps == ESteps.CheckStaticVersion) { if (_downloader1.IsDone() == false) { return; } if (_downloader1.HasError()) { Error = _downloader1.GetError(); _steps = ESteps.Failed; } else { _staticVersion = int.Parse(_downloader1.GetText()); _steps = ESteps.LoadAppManifest; } _downloader1.Dispose(); } if (_steps == ESteps.LoadAppManifest) { YooLogger.Log($"Load application patch manifest."); string filePath = PathHelper.MakeStreamingLoadPath(YooAssetSettingsData.GetPatchManifestFileName(_staticVersion)); string url = PathHelper.ConvertToWWWPath(filePath); _downloader2 = new UnityWebDataRequester(); _downloader2.SendRequest(url); _steps = ESteps.CheckAppManifest; } if (_steps == ESteps.CheckAppManifest) { if (_downloader2.IsDone() == false) { return; } if (_downloader2.HasError()) { Error = _downloader2.GetError(); _steps = ESteps.Failed; } else { // 解析APP里的补丁清单 Result = PatchManifest.Deserialize(_downloader2.GetText()); _steps = ESteps.Succeed; } _downloader2.Dispose(); } }