Table of Contents
XcodeでiOSアプリを開発時、あらかじめ用意したリソースファイルを読み込ませる場合は Bundle.main の以下のメソッド path(forResource:ofType:) でローカルリソースのパスを取得するのが一般的です。
func path(forResource name: String?, ofType ext: String?) -> String?
ファイルをプロジェクトにインポートしたにもかかわらず、このメソッドがそのファイルのパスを返さず nil が返ってくることがあります。
// test.mp4 を読み込もうとしたが…… let bundlePath = Bundle.main.path(forResource: "test", ofType: "mp4") // nil
ここで確認することは、以下の2つです。
読み込むファイルが Copy Bundle Resources に含まれているか
プロジェクトに組み込まれるファイルは、TARGETS > Build Phases > Copy Bundle Resources に登録されます。
読み込みたいファイルがちゃんとプロジェクトのディレクトリ内にあったとしても、ここに登録されていなければ、そのファイルはアプリ内に組み込まれません。
読み込むファイルがこのリストにない場合、プロジェクトナビゲーターからドラッグ&ドロップで追加します。
プロジェクトのファイルの同期がうまくいっていないときは、プロジェクトの Clean Build Folder などを行ってみましょう。ショートカットキーは [Command + Shift + K] です。
読み込むファイルがプロジェクトディレクトリに存在するか
以下のように、プロジェクトナビゲーターにファイルが表示されていたとしても、それは参照で、実際のファイルは全く別のディレクトリにある可能性があります。
プロジェクトのディレクトリを Finder で開き、読み込もうとしているファイルがあるかどうか確認しましょう。
フォルダ内のファイルにアクセスできないとき
例えば、以下のようなコードで、フォルダ内に入れたリソースを読み込もうとした時に「file not found」と出てしまう場合についてです。
if let htmlData = Bundle.main.path(forResource: "test/codes", ofType: "html") { print("OK!") } else { print("file not found") }
このとき、読み込もうとしているファイルが入っているフォルダの、ファイルマネージャー上での色に注目してください。ただのファイルグループとして追加されているときは、以下のように黄色いフォルダで表示されます。
これは実際のファイルの構造とは関係のない、Xcode上で作業がしやすいように作られるただのグループです。実際に Finder 上で確認できる実際のファイル構造とリンクしているフォルダは、以下のように青いフォルダで表示されます。
このように、ファイルを参照できる青いフォルダを作るには、ファイル追加時に「Create folder references」を選択します。
これで、test/codes のようなスラッシュを含むディレクトリパスによってファイルへアクセスできるようになります。
以上、Bundle.main.path が nil を返すときに確認する事項でした。
ファイルを読み込めずにエラーが発生して、途方に暮れていたのですが、
この記事を読んで解決することができました。
アプリも無事に完成しました。
ありがとうございました!
非常に参考になりました! おかげで動画を上手く再生することができました。ありがとうございました