検証環境
概要
- Addressables ではサーバからダウンロードしたリモートカタログを
端末のキャッシュに保存する際に、ストレージの空き容量を確認していない
- そのため、空き容量が不足していると File.WriteAllText で例外が発生して
ContentCatalogProvider で ProvideHandle.Complete が呼ばれなくなるので
Addressables の処理が完了していないことになり
それ以降 Addressables の API を呼び出しても処理が進行しなくなる現象に遭遇した
- ContentCatalogProvider で File.WriteAllText でリモートカタログを
キャッシュに保存する際に例外が発生したかどうかのチェックを追加して
例外が発生した場合も ProvideHandle.Complete を呼ぶようにすれば
キャッシュの保存に失敗した後も Addressable の API は正常に呼び出せるようになる
ContentCatalogProvider.cs
272 行目以降
private void OnCatalogLoaded(ContentCatalogData ccd)
{
Addressables.LogFormat("Addressables - Content catalog load result = {0}.", ccd);
if (ccd != null)
{
ccd.location = m_ProviderInterface.Location;
ccd.localHash = m_LocalHashValue;
if (!string.IsNullOrEmpty(m_RemoteHashValue) && !string.IsNullOrEmpty(m_LocalDataPath))
{
var dir = Path.GetDirectoryName(m_LocalDataPath);
if (!string.IsNullOrEmpty(dir) && !Directory.Exists(dir))
Directory.CreateDirectory(dir);
var localCachePath = m_LocalDataPath;
Addressables.LogFormat("Addressables - Saving cached content catalog to {0}.", localCachePath);
try
{
File.WriteAllText(localCachePath, JsonUtility.ToJson(ccd));
File.WriteAllText(localCachePath.Replace(".json", ".hash"), m_RemoteHashValue);
}
catch ( Exception e )
{
m_ProviderInterface.Complete(ccd, false, e);
ccd.localHash = m_RemoteHashValue;
return;
}
ccd.localHash = m_RemoteHashValue;
}
}
m_ProviderInterface.Complete(ccd, ccd != null, ccd == null ? new Exception($"Unable to load ContentCatalogData from location {m_ProviderInterface.Location}.") : null);
}