Audio Session — その概要、カテゴリ、およびiOSでの構成

著者: IT Sectr 公開日: 2026-05-24 読了時間: 8 分

Audio Sessionは、アプリのオーディオ動作を管理するためのiOSの中心的なメカニズムです:システムとの対話、割り込みの処理、オーディオルーティング。各iOSアプリは単一のオーディオセッションを受け取り、画面ロック時、通話中、Bluetooth接続時にサウンドがどのように動作するかを決定します。Apple Developer Documentation、2026によると、Audio Sessionはカテゴリとモードを通じて構成されます—適切な構成がないと、アプリはバックグラウンドでサウンドを再生できない場合があります。

重要なポイント

  • Audio Session(AVAudioSession)は、OSレベルでアプリのオーディオ動作を管理するiOSのシステムオブジェクトです。
  • セッションカテゴリは基本的な動作を定義します:playbackrecordambientplayAndRecordなど。
  • モードとオプションは動作を精密化します:defaultvoiceChatvideoRecordingallowBluetooth
  • 割り込み(通話、アラーム)時、セッションはNotificationCenterを通じてinterruptionTypeタイプの通知を受け取ります。
  • バックグラウンド再生には、Background Modes — Audio、AirPlay and Picture in Pictureを有効にする必要があります。

Audio Sessionとは?

Audio Sessionは、アプリ起動時にシステムによって作成され、そのライフサイクル全体にわたって存在する単一のAVAudioSessionインスタンスです。アプリとiOSオーディオシステムの間の仲介役として機能し、カテゴリ構成によって、アプリがバックグラウンドでサウンドを再生できるかどうか、通話中にサウンドがミュートされるかどうか、どのデバイスにオーディオを出力するかが決まります。

各アプリが独立してフォーカスを要求および解放するAndroid Audio Focusとは異なり、iOS Audio Sessionはアプリごとに1つのセッションを通じて集中的に管理されます。セッションがアクティブ化されると、システムは自動的に前のアプリのセッションを非アクティブ化し、割り込み通知を送信します。このアーキテクチャ上の違いが、2つのプラットフォームでのオーディオ処理の異なるアプローチを定義しています。

WWDC 2024セッション211によると、iOSアプリのオーディオ問題の約40%は、誤ったAudio Session構成が原因です。最も一般的な間違いは、playbackの代わりにambientカテゴリを選択することで、画面ロック時にサウンドが消えてしまいます。

AVAudioSessionの仕組み

起動時、アプリはセッションのsharedInstanceを取得し、setCategory(_:mode:options:)呼び出しでカテゴリを設定し、setActive(true)でセッションをアクティブ化します。アクティブ化後、iOSはルーティングのためにカテゴリポリシーを考慮します。別のアプリがそのセッションをアクティブ化すると、現在のアプリはNotification.Name.AVAudioSessionInterruptionを通じてAudioSessionInterruptionType.began通知を受け取ります。

Audio Sessionのカテゴリ

カテゴリはAudio Sessionの主要パラメータであり、6つの定義済み動作オプションを定義します。カテゴリの選択は、iOSでオーディオを設定する際の最初で最も重要な決定です。

カテゴリ使用するタイミングバックグラウンドオーディオミュートスイッチの影響
ambientゲーム、背景効果いいえはい
playback音楽、ポッドキャスト、オーディオブックはいいいえ
recordボイスメモ、オーディオ録音いいえ該当なし
playAndRecordVoIP、ボイスメッセージはいいいえ
multiRouteDJミキサー、カラオケはいいいえ
soloAmbientデフォルト(iOS default)いいえはい

Playbackカテゴリ — プレーヤーの主要な選択肢

音楽およびビデオプレーヤーでは、常にplaybackを使用してください。このカテゴリでは、画面ロック時、ミュートスイッチオフ時(iPhoneの物理ボタン)、およびアプリがバックグラウンドにあるときにサウンドを再生できます。playbackカテゴリがない場合、画面ロックまたはアプリの最小化時にセッションが非アクティブ化されます。

ambientカテゴリは、ゲームや背景音のあるアプリに適しています—他のアプリが再生を続けられるようにします。例えば、ユーザーが音楽を聴きながらambientセッションのゲームを開くと、音楽はゲームのサウンドの上で再生され続けます。これはAndroidとの根本的な違いであり、Androidではそのようなシナリオに明示的なduck許可が必要です。

Audio Sessionの設定方法

Audio Sessionの構成は、再生を開始する前に行う必要があります。application(_:didFinishLaunchingWithOptions:)メソッドまたはプレーヤーのイニシャライザでセッションを構成することをお勧めします。カテゴリを設定した後、セッションをアクティブ化する必要があります。

Swiftでの基本的なAudio Sessionのセットアップ

swift
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ヘッドフォンをサポートするアプリに必須です—これがないと、ヘッドセットが接続されていても、サウンドが内蔵スピーカーにルーティングされる場合があります。

録音と再生(VoIP)の構成

swift
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通知を待って、アクティブ化を再試行する必要があります。

Audio Sessionのモードとポリシー

モードはカテゴリを精密化し、特定のユースケースに合わせてオーディオパスを最適化します。各モードは、AGC、エコーキャンセレーション、コーデックの動作を変更します。モードはカテゴリを置き換えるのではなく補完します—1つのカテゴリが異なるモードで動作できます。

  • default — 音楽とビデオの標準モード。AGCオフ、エコーキャンセレーション最小限。
  • voiceChat — VoIP向け最適化。エコーキャンセレーション、AGC、ノイズサプレッションを有効化。playAndRecordカテゴリと併用。
  • videoRecording — ビデオ録画用。再生よりも録画品質を優先。recordまたはplayAndRecordカテゴリと併用。
  • measurement — オーディオ測定用。最小限の信号処理、AGCやエコーキャンセレーションなし。
  • gameChat — ゲーム内ボイスチャット用。voiceChatと類似、ただしゲームオーディオを優先。
  • moviePlayback — 映画視聴用。マルチチャンネルオーディオ(5.1、7.1)とDolby Atmos向け最適化。

Audio Sessionカテゴリのオプション

オプションはセッション動作の微調整を提供します。各オプションはフラグであり、配列内で他のオプションと組み合わせることができます。例えば、[.allowBluetooth、.defaultToSpeaker、.interruptSpokenAudioAndMix]はBluetoothヘッドセットへのサウンド出力を許可し、デフォルトでスピーカーを使用し、オーディオブックとミックスします。

iOS 17+では、AVAudioSessionSpatialPreferencesを介してAirPodsのパーソナライズされた空間オーディオを有効にするspatialAudioオプションが登場しました。WWDC 2024によると、Appleのテストでは空間オーディオにより音楽アプリのユーザーエンゲージメントが25%向上しました。

割り込みと通話の処理

割り込みは、Audio SessionとAndroid Audio Focusの主な違いです。iOSでは、割り込みはNotificationCenterを介してAVAudioSession.interruptionNotificationを購読することで処理されます。通知には、割り込みタイプ(beganまたはended)を含む辞書が含まれています。

割り込み通知の購読

swift
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の機能です。

オーディオルーティングとBluetooth

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とAndroid Audio Focusの違いは?

主な違いはアーキテクチャです。Audio Sessionはアプリごとに1つの集中型セッションで、一度設定すれば完了です。AndroidのAudio Focusでは、再生のたびに手動でフォーカスを要求する必要があります。さらに、iOSはmixWithOthersオプションによるミキシングをサポートしていますが、Androidではduckが完全停止の唯一の代替手段です。

iPhoneの画面をロックすると音が消えるのはなぜ?

最も一般的な原因は、誤ったAudio Sessionのカテゴリです。ambientまたはsoloAmbientが選択されている場合、画面ロック時に音が停止します。カテゴリをplaybackに切り替え、Info.plistにBackground Modes — Audio、AirPlay、and Picture in Pictureが追加されていることを確認してください。

iOSで2つのアプリが同時に再生できるようにするには?

setCategoryに.mixWithOthersオプションを追加します。これにより、アプリのサウンドを他のアクティブなセッションとミキシングできます。このオプションがないと、新しいアプリが現在のアプリを中断します。MixWithOthersはAndroidのduckモードに相当しますが、音量は完全に保持されます。

プログラム的にBluetoothスピーカーにサウンドを切り替えるには?

自動選択にはnilを指定してoverrideOutputAudioPortを使用します。Bluetoothへの強制出力:availableOutputsからAVAudioSessionRouteDescriptionを取得し、.bluetoothA2DPタイプのポートを選択してoverrideOutputAudioPortに渡します。セッションがallowBluetoothで構成されていることを確認してください。

プレーヤーを一時停止するときにsetActive(false)を呼び出すべきですか?

ほとんどのアプリでは—はい。一時停止時にセッションを非アクティブ化すると、他のアプリがオーディオフォーカスを取得できます。例外は長時間のバックグラウンド再生を行う音楽プレーヤーです。一時停止が短い場合(5秒未満)、すばやく再開するためにセッションをアクティブに保つことをお勧めします。

まとめ

  • Audio Session(AVAudioSession)は、OSレベルでサウンド動作を管理するiOSのアプリごとの単一オーディオセッションです。
  • 6つのカテゴリ:ambientplaybackrecordplayAndRecordmultiRoutesoloAmbient—基本的なオーディオ動作を定義します。
  • バックグラウンド再生には、playbackカテゴリとInfo.plistのBackground Modesが必要です。
  • 割り込みはNotificationCenterを通じて、began(一時停止)とended(shouldResume時に再開)タイプで処理されます。
  • .mixWithOthersオプションは、割り込みなしで他のアプリとのサウンドミキシングを有効にします。
  • ルーティングは自動的に管理されますが、ヘッドフォン切断時に一時停止するためにrouteChangeNotificationで監視されます。
  • playAndRecordカテゴリとvoiceChatモードは、エコーキャンセレーションとAGCを備えたVoIPアプリの標準です。

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください