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
// エラー発生
// fatal error: unexpectedly found nil while unwrapping an Optional value
ファイルが見つからないから nil が返る -> nil なのにアンラップする -> エラー!
解決策
今回の原因は、追加したファイルを Bundle Resource に追加しなかったことでした。そのため、アプリインストール時にファイルが実機やシミュレータにコピーされなかったのです。解決方法は二通りあります。
-
オプションをつけて、もう一度追加し直す
- Copy Bundle Resources にファイルを追加
1. オプションをつけて、もう一度追加し直す
すでに追加されているファイルを削除し、もう一度プロジェクトに追加します。その際、追加画面のオプションで Add to target のチェックボックスにチェックを入れます。これで完了です。
2. Copy Bundle Resources にファイルを追加
こちらの方法は、ファイルを削除しません。プロジェクトの設定を開き、Build Phases を選択します。そして、Copy Bundle Resources を表示します。
プロジェクトアイコンをクリックしてプロジェクトの設定を開く
Copy Bundle Resources を開いた
Copy Bundle Resource のファイル一覧の下にある + ボタンをクリックして、目的のファイルを追加します。これで完了です。