Firebase: Firebase Cloud StorageでiOSでGetFileAsyncを使うとUnknown Errorが発生する
やりたいこと
iOSでFirebaseのStorageからファイルをダウンロードしたい。
対処
- GetFileAsyncにはfile://を含んだUriを指定する
- 保存したファイルを読み込む場合はfile://は不要
の2つのパスが必要になります。
ここにサンプルコードがありました。
quickstart-unity/UIHandler.cs at master · firebase/quickstart-unity · GitHub
firebase - GetFileAsync not working downloading from storage in Unity, built on iOS - Stack Overflow
ロードする流れは
- 端末に一旦ダウンロードする
- ダウンロードしたものを読み込む
となっています。
以下は重要なところをサンプルコードより抜き出し、ちょっと変更したものです。
void Main() { string destinationFilePath = PathUtil.PathToTemporaryCacheUri(filename); await replayRef.GetFileAsync(destinationFilePath); string destinationFilePathForSystemIO = PathUtil.FileUriStringToPath(destinationFilePath); var data = System.IO.File.ReadAllBytes(destinationFilePathForSystemIO); // 取得できた! } public class PathUtil { static readonly string UriFileScheme = Uri.UriSchemeFile + "://"; public static string PathToUri(string filename, string path) { if (filename.StartsWith(UriFileScheme)) { return filename; } return $"{UriFileScheme}{path}/{filename}"; } public static string PathToTemporaryCacheUri(string filename) { #if UNITY_EDITOR || UNITY_ANDROID return $"{Application.temporaryCachePath}/{filename}"; #else return PathToUri(filename, Application.temporaryCachePath); #endif } public static string FileUriStringToPath(string fileUriString) { return Uri.UnescapeDataString((new Uri(fileUriString)).PathAndQuery); } }
感想
盛大に罠にはまりました!