Audio Sessionは、アプリのオーディオ動作を管理するためのiOSの中心的なメカニズムです:システムとの対話、割り込みの処理、オーディオルーティング。各iOSアプリは単一のオーディオセッションを受け取り、画面ロック時、通話中、Bluetooth接続時にサウンドがどのように動作するかを決定します。Apple Developer Documentation、2026によると、Audio Sessionはカテゴリとモードを通じて構成されます—適切な構成がないと、アプリはバックグラウンドでサウンドを再生できない場合があります。
重要なポイント
Audio Sessionは、アプリ起動時にシステムによって作成され、そのライフサイクル全体にわたって存在する単一のAVAudioSessionインスタンスです。アプリとiOSオーディオシステムの間の仲介役として機能し、カテゴリ構成によって、アプリがバックグラウンドでサウンドを再生できるかどうか、通話中にサウンドがミュートされるかどうか、どのデバイスにオーディオを出力するかが決まります。
各アプリが独立してフォーカスを要求および解放するAndroid Audio Focusとは異なり、iOS Audio Sessionはアプリごとに1つのセッションを通じて集中的に管理されます。セッションがアクティブ化されると、システムは自動的に前のアプリのセッションを非アクティブ化し、割り込み通知を送信します。このアーキテクチャ上の違いが、2つのプラットフォームでのオーディオ処理の異なるアプローチを定義しています。
WWDC 2024セッション211によると、iOSアプリのオーディオ問題の約40%は、誤ったAudio Session構成が原因です。最も一般的な間違いは、playbackの代わりにambientカテゴリを選択することで、画面ロック時にサウンドが消えてしまいます。
起動時、アプリはセッションのsharedInstanceを取得し、setCategory(_:mode:options:)呼び出しでカテゴリを設定し、setActive(true)でセッションをアクティブ化します。アクティブ化後、iOSはルーティングのためにカテゴリポリシーを考慮します。別のアプリがそのセッションをアクティブ化すると、現在のアプリはNotification.Name.AVAudioSessionInterruptionを通じてAudioSessionInterruptionType.began通知を受け取ります。
カテゴリはAudio Sessionの主要パラメータであり、6つの定義済み動作オプションを定義します。カテゴリの選択は、iOSでオーディオを設定する際の最初で最も重要な決定です。
| カテゴリ | 使用するタイミング | バックグラウンドオーディオ | ミュートスイッチの影響 |
|---|---|---|---|
| ambient | ゲーム、背景効果 | いいえ | はい |
| playback | 音楽、ポッドキャスト、オーディオブック | はい | いいえ |
| record | ボイスメモ、オーディオ録音 | いいえ | 該当なし |
| playAndRecord | VoIP、ボイスメッセージ | はい | いいえ |
| multiRoute | DJミキサー、カラオケ | はい | いいえ |
| soloAmbient | デフォルト(iOS default) | いいえ | はい |
音楽およびビデオプレーヤーでは、常にplaybackを使用してください。このカテゴリでは、画面ロック時、ミュートスイッチオフ時(iPhoneの物理ボタン)、およびアプリがバックグラウンドにあるときにサウンドを再生できます。playbackカテゴリがない場合、画面ロックまたはアプリの最小化時にセッションが非アクティブ化されます。
ambientカテゴリは、ゲームや背景音のあるアプリに適しています—他のアプリが再生を続けられるようにします。例えば、ユーザーが音楽を聴きながらambientセッションのゲームを開くと、音楽はゲームのサウンドの上で再生され続けます。これはAndroidとの根本的な違いであり、Androidではそのようなシナリオに明示的なduck許可が必要です。
Audio Sessionの構成は、再生を開始する前に行う必要があります。application(_:didFinishLaunchingWithOptions:)メソッドまたはプレーヤーのイニシャライザでセッションを構成することをお勧めします。カテゴリを設定した後、セッションをアクティブ化する必要があります。
import AVFAudio
let session = AVAudioSession.sharedInstance
do {
try session.setCategory(
playback,
mode: default,
options: [allowBluetooth, defaultToSpeaker]
)
try session.setActive(true)
} catch {
print("Audio Sessionの設定に失敗しました:\(error.localizedDescription)")
}
optionsパラメータには、allowBluetooth(Bluetoothヘッドセットへの出力)とdefaultToSpeaker(レシーバーではなくスピーカーでの再生)が含まれます。allowBluetoothオプションは、Bluetoothヘッドフォンをサポートするアプリに必須です—これがないと、ヘッドセットが接続されていても、サウンドが内蔵スピーカーにルーティングされる場合があります。
let session = AVAudioSession.sharedInstance
try session.setCategory(
playAndRecord,
mode: voiceChat,
options: [allowBluetooth, allowBluetoothA2DP]
)
try session.overrideOutputAudioPort(speaker)
try session.setActive(true)
voiceChatモードのplayAndRecordカテゴリは、音声通信のためにオーディオパスを最適化します:エコーキャンセレーション、自動ゲインコントロール(AGC)を有効にし、最適なコーデックを選択します。OverrideOutputAudioPort(.speaker)は、ヘッドセットが接続されていてもスピーカー経由の出力を強制します—スピーカーフォンに便利です。
setActive(true)を呼び出すとセッションがアクティブ化され、アプリがオーディオを使用することをシステムに通知します。再生が一時停止された場合、他のアプリがオーディオストリームを取得できるようにセッションを非アクティブ化することをお勧めします。例外は、長時間のバックグラウンド再生(音楽、ポッドキャスト)を行うアプリで、セッションはトラック全体を通してアクティブのままです。
setActiveを呼び出す際のエラー処理は重要です。優先度の高い別のセッションがアクティブな場合(例えば、通話中の電話)、setActiveはエラーをスローする可能性があります。その場合、AudioSessionInterruptionType.ended通知を待って、アクティブ化を再試行する必要があります。
モードはカテゴリを精密化し、特定のユースケースに合わせてオーディオパスを最適化します。各モードは、AGC、エコーキャンセレーション、コーデックの動作を変更します。モードはカテゴリを置き換えるのではなく補完します—1つのカテゴリが異なるモードで動作できます。
オプションはセッション動作の微調整を提供します。各オプションはフラグであり、配列内で他のオプションと組み合わせることができます。例えば、[.allowBluetooth、.defaultToSpeaker、.interruptSpokenAudioAndMix]はBluetoothヘッドセットへのサウンド出力を許可し、デフォルトでスピーカーを使用し、オーディオブックとミックスします。
iOS 17+では、AVAudioSessionSpatialPreferencesを介してAirPodsのパーソナライズされた空間オーディオを有効にするspatialAudioオプションが登場しました。WWDC 2024によると、Appleのテストでは空間オーディオにより音楽アプリのユーザーエンゲージメントが25%向上しました。
割り込みは、Audio SessionとAndroid Audio Focusの主な違いです。iOSでは、割り込みはNotificationCenterを介してAVAudioSession.interruptionNotificationを購読することで処理されます。通知には、割り込みタイプ(beganまたはended)を含む辞書が含まれています。
override func viewDidLoad() {
super.viewDidLoad()
let center = NotificationCenter.default
center.addObserver(
self,
selector: #selector(handleInterruption),
name: AVAudioSession.interruptionNotification,
object: nil
)
}
@objc func handleInterruption(_ notification: Notification) {
guard let userInfo = notification.userInfo,
let type = userInfo[AVAudioSession.interruptionTypeKey]
as? AVAudioSessionInterruptionType
else { return }
switch type {
case began:
pausePlayback()
case ended:
guard let options = userInfo[AVAudioSession.interruptionOptionKey]
as? AVAudioSessionInterruptionOptions
else { return }
if options.contains(shouldResume) {
resumePlayback()
}
}
interruptionType.beganを受信した場合、プレーヤーは再生を一時停止する必要があります。interruptionType.endedを受信した場合、interruptionOptionKeyプロパティはプレーヤーが自動的に再開できるかどうか(shouldResume)を示します。ユーザーが通話を拒否した場合、shouldResume = true。通話がタイムアウトで終了した場合—shouldResume = false、再開は許可されません。
別のアプリがplaybackカテゴリでそのAudio Sessionをアクティブ化すると、現在のセッションは割り込み通知を受け取ります。別のアプリがambientを使用する場合、割り込みは発生せず、サウンドはミックスされます。この動作は、Audio Focusのアクティブ化がすべてLOSSイベントをトリガーするAndroidとは根本的に異なります。
他のセッションがアクティブ化されても再生を続ける必要があるアプリ(例えば、音楽再生中のナビゲーション)には、.mixWithOthersオプションを使用します。このオプションは他のアプリとのサウンドミキシングを許可し、割り込みは送信されません。MixWithOthersはAndroidのduckモードに相当するiOSの機能です。
Audio Sessionは、内蔵スピーカー、ヘッドフォン、Bluetoothヘッドセット、AirPlayデバイス間のオーディオルーティングを自動的に管理します。アプリはcurrentRouteプロパティを通じて現在のルートを監視し、AVAudioSession.routeChangeNotificationを介して変更に関する通知を受け取ることができます。
Bluetoothヘッドフォンが接続されると、セッションがallowBluetoothオプションで構成されている場合、iOSは自動的にオーディオ出力をヘッドフォンに切り替えます。このオプションがないと、サウンドは内蔵スピーカーから出力され続けます。iOS 16以降、AirPods Proが接続されると、システムは自動的にレイテンシーを低減するためにProMotion同期を有効にします。
routeChangeNotificationを購読すると、ヘッドフォンの接続と切断に反応できます。Bluetoothヘッドセットが切断された場合、プレーヤーは再生を一時停止する必要があります—ユーザーは電話のスピーカーから音が出始めることを期待していない可能性があります。Apple HIG(2026)によると、これは音楽アプリに必須の動作です。
availableInputsおよびavailableOutputsプロパティは、利用可能なオーディオデバイスのリストをタイプ(builtInSpeaker、headphones、bluetoothA2DP、hdmi)とともに返します。開発者は、カスタムルーティングシナリオのためにoverrideOutputAudioPortを介してプログラム的に特定のデバイスを選択できます。
よくある質問
主な違いはアーキテクチャです。Audio Sessionはアプリごとに1つの集中型セッションで、一度設定すれば完了です。AndroidのAudio Focusでは、再生のたびに手動でフォーカスを要求する必要があります。さらに、iOSはmixWithOthersオプションによるミキシングをサポートしていますが、Androidではduckが完全停止の唯一の代替手段です。
最も一般的な原因は、誤ったAudio Sessionのカテゴリです。ambientまたはsoloAmbientが選択されている場合、画面ロック時に音が停止します。カテゴリをplaybackに切り替え、Info.plistにBackground Modes — Audio、AirPlay、and Picture in Pictureが追加されていることを確認してください。
setCategoryに.mixWithOthersオプションを追加します。これにより、アプリのサウンドを他のアクティブなセッションとミキシングできます。このオプションがないと、新しいアプリが現在のアプリを中断します。MixWithOthersはAndroidのduckモードに相当しますが、音量は完全に保持されます。
自動選択にはnilを指定してoverrideOutputAudioPortを使用します。Bluetoothへの強制出力:availableOutputsからAVAudioSessionRouteDescriptionを取得し、.bluetoothA2DPタイプのポートを選択してoverrideOutputAudioPortに渡します。セッションがallowBluetoothで構成されていることを確認してください。
ほとんどのアプリでは—はい。一時停止時にセッションを非アクティブ化すると、他のアプリがオーディオフォーカスを取得できます。例外は長時間のバックグラウンド再生を行う音楽プレーヤーです。一時停止が短い場合(5秒未満)、すばやく再開するためにセッションをアクティブに保つことをお勧めします。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。