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의 시스템 객체입니다.
  • 세션 카테고리는 기본 동작을 정의합니다: playback, record, ambient, playAndRecord 등.
  • 모드와 옵션은 동작을 세분화합니다: default, voiceChat, videoRecording, allowBluetooth.
  • 인터럽션(통화, 알람) 시 세션은 NotificationCenter를 통해 interruptionType 유형의 알림을 받습니다.
  • 백그라운드 재생을 위해서는 Background Modes — Audio, AirPlay and Picture in Picture를 활성화해야 합니다.

Audio Session이란?

Audio Session은 앱이 시작될 때 시스템에 의해 생성되고 전체 수명 주기 동안 존재하는 단일 AVAudioSession 인스턴스입니다. 앱과 iOS 오디오 시스템 간의 중개자 역할을 하며, 카테고리 구성은 앱이 백그라운드에서 사운드를 재생할 수 있는지, 통화 중 사운드가 음소거되는지, 어떤 기기로 오디오를 출력할지를 결정합니다.

각 앱이 독립적으로 포커스를 요청하고 해제하는 Android Audio Focus와 달리, iOS Audio Session은 앱당 하나의 세션을 통해 중앙에서 관리됩니다. 세션이 활성화되면 시스템은 자동으로 이전 앱의 세션을 비활성화하고 인터럽션 알림을 보냅니다. 이 아키텍처 차이는 두 플랫폼에서 오디오 처리에 대한 서로 다른 접근 방식을 정의합니다.

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, 에코 제거 및 코덱의 동작을 변경합니다. 모드는 카테고리를 대체하지 않고 보완합니다 — 하나의 카테고리가 다양한 모드와 함께 작동할 수 있습니다.

  • 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)에 따르면 이는 음악 앱에 필수적인 동작입니다.

availableInputsavailableOutputs 속성은 유형(builtInSpeaker, headphones, bluetoothA2DP, hdmi)과 함께 사용 가능한 오디오 기기 목록을 반환합니다. 개발자는 사용자 지정 라우팅 시나리오를 위해 overrideOutputAudioPort를 통해 프로그래밍 방식으로 특정 기기를 선택할 수 있습니다.

자주 묻는 질문

Audio Session과 Android Audio Focus의 차이점은 무엇인가요?

주요 차이점은 아키텍처입니다. Audio Session은 앱당 하나의 중앙 집중식 세션으로 한 번 구성하면 됩니다. Android의 Audio Focus는 재생할 때마다 수동으로 포커스를 요청해야 합니다. 또한 iOS는 mixWithOthers 옵션을 통한 믹싱을 지원하는 반면, Android에서는 duck이 완전 중지의 유일한 대안입니다.

iPhone 화면을 잠그면 사운드가 사라지는 이유는 무엇인가요?

가장 흔한 원인은 잘못된 Audio Session 카테고리입니다. ambient 또는 soloAmbient가 선택된 경우 화면 잠금 시 사운드가 중지됩니다. 카테고리를 playback으로 전환하고 Info.plist에 Background Modes — Audio, AirPlay, and Picture in Picture가 추가되었는지 확인하세요.

iOS에서 두 앱이 동시에 재생되도록 하려면 어떻게 하나요?

setCategory에 .mixWithOthers 옵션을 추가하세요. 이렇게 하면 앱의 사운드가 다른 활성 세션과 믹싱될 수 있습니다. 이 옵션이 없으면 새 앱이 현재 앱을 인터럽트합니다. MixWithOthers는 Android의 duck 모드와 유사하지만 볼륨이 완전히 유지됩니다.

프로그래밍 방식으로 Bluetooth 스피커로 사운드를 전환하려면 어떻게 하나요?

자동 선택을 위해 nil과 함께 overrideOutputAudioPort를 사용하세요. Bluetooth로 강제 출력: availableOutputs에서 AVAudioSessionRouteDescription을 가져오고 .bluetoothA2DP 유형의 포트를 선택하여 overrideOutputAudioPort에 전달하세요. 세션이 allowBluetooth로 구성되어 있는지 확인하세요.

플레이어를 일시 중지할 때 setActive(false)를 호출해야 하나요?

대부분의 앱에서 — . 일시 중지 시 세션을 비활성화하면 다른 앱이 오디오 포커스를 얻을 수 있습니다. 예외는 장시간 백그라운드 재생이 있는 음악 플레이어입니다. 일시 중지가 짧은 경우(5초 미만) 빠른 재개를 위해 세션을 활성 상태로 유지하는 것이 좋습니다.

요약

  • Audio Session (AVAudioSession)은 OS 수준에서 사운드 동작을 관리하는 iOS의 앱당 단일 오디오 세션입니다.
  • 6가지 카테고리: ambient, playback, record, playAndRecord, multiRoute, soloAmbient — 기본 오디오 동작을 정의합니다.
  • 백그라운드 재생을 위해서는 playback 카테고리와 Info.plist의 Background Modes가 필요합니다.
  • 인터럽션은 began(일시 중지) 및 ended(shouldResume 시 재개) 유형으로 NotificationCenter를 통해 처리됩니다.
  • .mixWithOthers 옵션은 인터럽션 없이 다른 앱과 사운드 믹싱을 활성화합니다.
  • 라우팅은 자동으로 관리되지만 헤드폰 연결 해제 시 일시 중지를 위해 routeChangeNotification을 통해 모니터링됩니다.
  • playAndRecord 카테고리와 voiceChat 모드는 에코 제거 및 AGC가 있는 VoIP 앱의 표준입니다.

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기