TAKOYAKING’s blog 一覧

TAKOYAKING’s blog

たこ焼き系

Firebase: Firebase Cloud StorageでiOSでGetFileAsyncを使うとUnknown Errorが発生する

やりたいこと

iOSでFirebaseのStorageからファイルをダウンロードしたい。

現象

AndroidやUnity Editorではうまくいくのに、iOSだとUnknown Errorが発生して、ダウンロードできない。

原因

iOSに関してはfile://のようなuriを指定しなければならなかった

対処

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

感想

盛大に罠にはまりました!