iOSアプリ開発で、ボタンをタップした時や特定のイベントが発生した時に「効果音」や「BGM」を鳴らしたい場面は多いですよね。
この記事では、Swiftを使ってアプリ内に保存されたローカルの音声ファイルを再生するシンプルな実装方法を解説します。
動作確認環境
- Swift 5.x
- Xcode 14以降
AVFoundationフレームワークを使用
音声再生用のユーティリティクラスを作成する
音声再生には AVFoundation フレームワークの AVAudioPlayer を使用します。
どこからでも簡単に呼び出せるように、静的メソッドを持たせたユーティリティクラス(AVAudioPlayerUtil)を作成しておくと非常に便利です。
import AVFoundation
class AVAudioPlayerUtil {
// プレイヤーのインスタンスを保持
static var audioPlayer: AVAudioPlayer?
/// 音声ファイルをセットして再生準備を行う
/// - Parameter url: 音声ファイルのURL
static func setup(url: URL) {
do {
audioPlayer = try AVAudioPlayer(contentsOf: url)
audioPlayer?.prepareToPlay()
} catch {
print("音声ファイルの読み込みに失敗しました: \(error.localizedDescription)")
}
}
/// 音声を再生する
static func play() {
audioPlayer?.play()
}
}
このクラスでは、指定したURLから音声を読み込む setup メソッドと、再生を実行する play メソッドを定義しています。
do-catch文を使うことで、万が一ファイルが存在しない場合やフォーマットエラーが起きた際のアプリのクラッシュを防ぎます。
再生処理を呼び出す(実行例)
次に、実際に音声を鳴らしたい場所(ViewControllerのボタンタップイベントなど)で、先ほどのユーティリティを呼び出します。
前提として、Xcodeのプロジェクトナビゲータに再生したい音声ファイル(例:sound.mp3)をあらかじめドラッグ&ドロップで追加しておいてください。
// プロジェクト内にある音声ファイルのURLを取得する
if let fileUrl = Bundle.main.url(forResource: "sound", withExtension: "mp3") {
// 再生準備
AVAudioPlayerUtil.setup(url: fileUrl)
// 再生スタート
AVAudioPlayerUtil.play()
} else {
print("指定された音声ファイルが見つかりません")
}
Bundle.main.url を使って、プロジェクトに同梱した音声ファイルのパスを安全に取得しています。
ファイル名や拡張子のタイポ(打ち間違い)があると値が取得できないため、if let を使って安全にアンラップ(オプショナルバインディング)するのがSwiftにおけるベストプラクティスです。
まとめ
AVFoundation と AVAudioPlayer を使えば、数行のコードで簡単にローカル音声ファイルの再生が可能です。
BGMのループ再生や音量調整など、より細かな制御を行いたい場合も audioPlayer インスタンスのプロパティを変更するだけで対応できるので、ぜひご自身のアプリに組み込んでみてください。




