質問: * AVAudioPlayerでDocumentフォルダに作成したファイルを実機で再生できない * シミュレータでは再生できる * シミュレータで録音したファイルをBundleに移動すれば実機でも再生できる どなたか解決策をご存じの方がいらっしゃれば教えていただけると幸いです。よろしくお願いします。
回答: この辺りAppleのドキュメントは必ずしもわかりやすいとは言えない上に、日本語版も提供されていないのですが、`AVAudioRecorder`を用いて録音を行う場合、`AVAudioSession`の設定も必要になるようです。 Multimedia Programming Guide - Recording with the AVAudioRecorder Class 古い記述のままで、ARCを使用しないObjective-Cでコード例が書かれているのですが、要点を抜き出すと: * 録音開始前に`AVAudioSession`の`setCategory(_:)`でcategoryを`AVAudioSessionCategoryRecord`に設定しておく。 * 同じく録音開始前に、`AVAudioSession`の`setActive(_:)`でactiveを`true`に設定しておく。 * 録音終了後、`AVAudioSession`の`setActive(_:)`でactiveを`false`に変更する。 同ドキュメントでは見つけられませんでしたが、上記の後で`AVAudioPlayer`で録音データを再生する場合: * 再生開始前に`AVAudioSession`の`setCategory(_:)`でcategoryを`AVAudioSessionCategoryAmbient`に設定しておく。 と言ったことをしておかないといけないようです。 あなたのGithubのコードですと、 `record(_:)`メソッド中の`audioRecorder?.stop()`の後: ``` let session = AVAudioSession.sharedInstance() try! session.setActive(false) ``` (エラーをcatchしたほうが良いかもしれませんが、ここでは概略を示すため簡略化しておきます。) `setupAudioRecorder()`メソッド中の`audioRecorder = try AVAudioRecorder(URL: url, settings: recordSettings)`の後: ``` let session = AVAudioSession.sharedInstance() try session.setCategory(AVAudioSessionCategoryRecord) try session.setActive(true) ``` `play(_:)`メソッド中の`audioPlayer = try AVAudioPlayer(contentsOfURL: url)`の前: ``` let audioSession = AVAudioSession.sharedInstance() try audioSession.setCategory(AVAudioSessionCategoryAmbient) ``` ...のような感じで、`AVAudioSession`の操作をするコードを付け足してみてください。 なお、エラーメッセージを見ると試行錯誤の過程で(?)ファイルパスの作成方法をいろいろいじった跡が窺えますが、当然ながら録音用と再生用のファイルパスはDocumentsディレクトリー下の同じファイルを指すようにご注意ください。 こちらの環境では、上記の修正で確実に再生できるようになったのですが、全く同じ環境ではないでしょうから、まだ何かあるかもしれません。お試しの上何かあれば、おしらせください。