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

2016年10月22日(更新: 2021年1月5日)

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 に登録されます。

Copy Bundle Resources の表示をチェック

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

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

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

プロジェクトのファイルの同期がうまくいっていないときは、プロジェクトの Clean Build Folder などを行ってみましょう。ショートカットキーは [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 を返すときに確認する事項でした。

[Xcode/Swift] Bundle.main.path が nil を返すときに確認すること」への2件のフィードバック

  1. 広瀬耕二

    ファイルを読み込めずにエラーが発生して、途方に暮れていたのですが、
    この記事を読んで解決することができました。

    アプリも無事に完成しました。
    ありがとうございました!

    返信
  2. Zhalen

    非常に参考になりました! おかげで動画を上手く再生することができました。ありがとうございました

    返信

コメントを残す

メールアドレスが公開されることはありません。