Quick answer: Upload both catalog.hash and catalog.json together. Clear the player’s catalog cache on update, and version your remote load path.
A live game pushes a content update. Some players fail to load with “catalog hash mismatch”. They downloaded a stale .json but new .hash, or vice versa — partial upload.
Atomic Upload
The catalog is two files: catalog_XXX.json (the data) and catalog_XXX.hash (the integrity check). Upload them together; if a CDN serves a new .hash but cached .json, mismatch.
Upload .json first, then .hash. The .hash being newest ensures clients see consistent state.
Version the Path
RemoteLoadPath = "https://cdn.game.com/content/v[BuildVersion]/"
Each release goes to its own directory. No overwrites, no partial-state. Old clients keep using old paths until they update.
Clear Catalog Cache
Addressables.ClearResourceLocators();
var handle = Addressables.LoadContentCatalogAsync(catalogUrl);
await handle.Task;
Force a fresh catalog load. Combine with Caching.ClearCache() if bundles are also stale.
Check Catalog Update
var checkHandle = Addressables.CheckForCatalogUpdates();
await checkHandle.Task;
if (checkHandle.Result.Count > 0)
{
await Addressables.UpdateCatalogs(checkHandle.Result).Task;
}
Built-in update check. Run at startup; pull new catalogs before loading content.
Verifying
Push update. Players on old version keep working; updated players pull new catalog cleanly. No hash mismatch errors in analytics.
“Catalog is .json + .hash. Keep them in sync, version the path, clear cache on update.”
For LiveOps, automate the upload order in your deploy script — manual CDN uploads are the #1 cause of partial-state mismatches.