[Swift/SwiftUI]音を鳴らす

目次

概要

ただ音を鳴らすだけ。しかし、システム系の開発をおこなっていると、音を出すという機能は意外と作ることが少ない。
なので、すぐ取り出せるようにメモ。
アプリをより華やかにするのに役立つと思う。

ソースコード

import SwiftUI

@main
struct TestApp: App {
    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
    
    var body: some Scene {
        WindowGroup {
            PlaySoundView()
        }
    }
}

画面表示部分

import SwiftUI

struct PlaySoundView: View {
    @ObservedObject var viewModel: PlaySoundViewModel = PlaySoundViewModel()
    
    var body: some View {
        HStack {
            Spacer()
            Button {
                self.viewModel.playSoundDingdong()
            } label: {
                Image(systemName: "circle")
                    .foregroundColor(Color.blue)
                    .font(.system(size: 80))
            }
            Spacer()
            Button {
                self.viewModel.playSoundFailure()
            } label: {
                Image(systemName: "multiply")
                    .foregroundColor(Color.red)
                    .font(.system(size: 80))
            }
            Spacer()
        }
    }
}

処理部分

import AVFoundation
import UIKit
import Foundation

class PlaySoundViewModel: NSObject, ObservableObject {
    private var soundPlayer: AVAudioPlayer?
    
    func playSoundDingdong() {
        guard let data = NSDataAsset(name: "Dingdong")?.data else {
            return
        }
        do {
            soundPlayer = try AVAudioPlayer(data: data)
            soundPlayer?.prepareToPlay()
            soundPlayer?.play()
        } catch {
            print("error")
        }
    }
    
    func playSoundFailure() {
        guard let data = NSDataAsset(name: "Failure")?.data else {
            return
        }
        do {
            soundPlayer = try AVAudioPlayer(data: data)
            soundPlayer?.prepareToPlay()
            soundPlayer?.play()
        } catch {
            print("error")
        }
    }
}

音源の管理

今回はコードだけでは無く、ちゃんと音声データも追加しないといけない。
追加する場所はAssets.xcassetsの部分。
まずはAssets.xcassetsを選択して、「+ボタンをタップ -> Data Set」を選択する。

名前を設定した後、+と書かれている枠に音声ファイル(.mp3など)をドラッグアンドドロップする。

同じように他のファイルも追加する。
こんな感じになる。

デモ動画

詳細

今回は単純に音声の再生なので、細かい処理は省いている。
音楽を再生、録音データを再生する記事の時はちゃんと書いていこうと思う。

また、メソッド内でAVAudioPlayerのオブジェクトを生成すると音源が再生されないので注意。