[Swift3] Bundle.main.path が nil を返すときに確認すること

By | 2016年10月22日

iOSアプリにあらかじめ用意したリソースファイルを読み込ませる場合、Bundle.main の以下のメソッド path(forResource:ofType:) でローカルリソースのパスを取得するのが一般的です。

func path(forResource name: String?, ofType ext: String?) -> String?

ファイルをプロジェクトにインポートしたにもかかわらず、このメソッドがそのファイルのパスを返さず nil が返ってくることがあります。

let bundlePath = Bundle.main.path(forResource: "test", ofType: "mp4") // nil

ここで確認することは、以下の2つです。

読み込むファイルが Copy Bundle Resources に含まれているか

プロジェクトに組み込まれるファイルは、TARGETS > Build Phases > Copy Bundle Resources に登録されます。

Copy Bundle Resources の表示をチェック

読み込みたいファイルがちゃんとプロジェクトのディレクトリ内にあったとしても、ここに登録されていなければ、そのファイルはアプリ内に組み込まれません。

読み込むファイルがこのリストにない場合、プロジェクトナビゲーターからドラッグ&ドロップで追加します。

Copy Bundle Resources に読み込みたいファイルを追加

プロジェクトのファイルの同期がうまくいっていないときは、プロジェクトの Clean [Command + Shift + K] などを行ってみましょう。

読み込むファイルがプロジェクトディレクトリに存在するか

以下のように、プロジェクトナビゲーターにファイルが表示されていたとしても、それは参照で、実際のファイルは全く別のディレクトリにある可能性があります。

Xcodeのナビゲーションバーに表示されたファイル

プロジェクトのディレクトリを Finder で開き、読み込もうとしているファイルがあるかどうか確認しましょう。

XcodeプロジェクトのディレクトリをFinderで表示

フォルダ内のファイルにアクセスできないとき

例えば、以下のようなコードで、フォルダ内に入れたリソースを読み込もうとした時に「file not found」と出てしまう場合についてです。

        if let htmlData = Bundle.main.path(forResource: "test/codes", ofType: "html") {
            print("OK!")
        } else {
            print("file not found")
        }

このとき、読み込もうとしているファイルが入っているフォルダの、ファイルマネージャー上での色に注目してください。ただのファイルグループとして追加されているときは、以下のように黄色いフォルダで表示されます。

Xcodeのファイルマネージャーで表示される黄色いフォルダ

これは実際のファイルの構造とは関係のない、Xcode上で作業がしやすいように作られるただのグループです。実際に Finder 上で確認できる実際のファイル構造とリンクしているフォルダは、以下のように青いフォルダで表示されます。

Xcodeのファイルマネージャー上で表示される、ファイル参照のある青いフォルダ

このように、ファイルを参照できる青いフォルダを作るには、ファイル追加時に「Create folder references」を選択します。

create folder references にチェックを入れてフォルダをプロジェクトに追加

これで、test/codes のようなスラッシュを含むディレクトリパスによってファイルへアクセスできるようになります。

以上、Bundle.main.path が nil を返すときに確認する事項でした。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*