catログにこのメッセージが複数回表示されます:
[avas] AVAudioSessionPortImpl.mm:56:ValidateRequiredFields: Unknown selected data source for Port Speaker (type: Speaker)
私はこのコードを使用してバックグラウンドミュージックを再生しています:
let path = Bundle.main.path(forResource: fileName, ofType:"mp3")!
let url = URL(fileURLWithPath: path)
do {
let sound = try AVAudioPlayer(contentsOf: url)
self.player = sound
sound.prepareToPlay()
sound.volume = 0.05
sound.numberOfLoops = loops
sound.play()
} catch {
print("[PLAY SOUND][DELEGATE] error loading file -> \(fileName)")
}
私は調査を行い、同様の問題を発見したので、viewdidloadにオーディオカテゴリを追加しました。
do {
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, mode: AVAudioSessionModeDefault)
try AVAudioSession.sharedInstance().setActive(true)
} catch {
print(error)
}
上記のコードを追加した後、サイレントモードの電話でもバックグラウンドミュージックが再生されます。 Unknown selected data source for Port Speaker (type: Speaker)
のデバッガメッセージはまだ表示されています
メッセージUnknown selected data source for Port Speaker
はiOS 12の問題のようです。コードが機能していても、何らかの警告が表示されるようです。おそらくAppleはすぐにこれを修正するので、今のところこの警告を無視して、解決策が見つかったらそれを黙らせることができるかもしれません。
サイレントモードで再生するバックグラウンドミュージックについては、AVAudioSessionCategory
を選択したためです。 AVAudioSessionCategoryPlayback
ドキュメントによると( source ):
このカテゴリを使用する場合、アプリの音声はサイレントスイッチがサイレントに設定された状態で、または画面がロックされたときに続行されます。
アプリのスタイルによっては、AVAudioSessionCategorySoloAmbient
を使用できます( source ):
オーディオは、画面のロックとサイレントスイッチ(iPhoneではRing/Silentスイッチと呼ばれます)によって無音になります。
または、おそらくAVAudioSessionCategoryAmbient
( source ):
このカテゴリは、音楽アプリの再生中にユーザーが再生する仮想ピアノなど、「一緒に再生」スタイルのアプリにも適しています。このカテゴリを使用すると、他のアプリの音声が音声とミックスされます。オーディオは、画面のロックとサイレントスイッチ(iPhoneではRing/Silentスイッチと呼ばれます)によって無音になります。
Swift 4.2から、当初は次のようにセットアップしました。
try AVAudioSession.sharedInstance().setCategory(.playAndRecord, mode: .default, options: [])
実際に録音機能は必要なかったので、変更しました
try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: [])
これによりエラーが解消されました(エラーを解消するために私ができる唯一のことでした)。ただし、録音機能も必要な場合は、明らかにこれは機能しません。