使って創ってApp

ソフトウェアを使ったり作ったりするブログです

NSBundleでファイルが読み込めない iOS開発

iOSアプリ開発中に Xcode の Project Navigator 欄にファイルを確かに追加したのに、プログラムから読み込めないことがあったので記事にします。

開発環境

症状

iOSアプリ開発のプロジェクトに追加したファイルのパスを 、NSBundle のメソッドを使って取得しようとしたけど、fatal error が出る。コードは以下の通り。

let url = NSBundle.mainBundle().URLForResource("1億5千万の奇跡", withExtension: "m4a")!
// エラー発生
// fatal error: unexpectedly found nil while unwrapping an Optional value

ファイルが見つからないから nil が返る -> nil なのにアンラップする -> エラー!

解決策

今回の原因は、追加したファイルを Bundle Resource に追加しなかったことでした。そのため、アプリインストール時にファイルが実機やシミュレータにコピーされなかったのです。解決方法は二通りあります。

  1. オプションをつけて、もう一度追加し直す

  2. Copy Bundle Resources にファイルを追加

1. オプションをつけて、もう一度追加し直す

すでに追加されているファイルを削除し、もう一度プロジェクトに追加します。その際、追加画面のオプションで  Add to target のチェックボックスにチェックを入れます。これで完了です。

f:id:hitxutokun:20151221233013p:plain

2. Copy Bundle Resources にファイルを追加

こちらの方法は、ファイルを削除しません。プロジェクトの設定を開き、Build Phases を選択します。そして、Copy Bundle Resources を表示します。

f:id:hitxutokun:20151222212122p:plain
プロジェクトアイコンをクリックしてプロジェクトの設定を開く
f:id:hitxutokun:20151222212302p:plain
Copy Bundle Resources を開いた

Copy Bundle Resource のファイル一覧の下にある + ボタンをクリックして、目的のファイルを追加します。これで完了です。

まとめ

Xcode にファイルを追加する際は、Add to target チェックボックスにチェックを入れるようにしましょう。