Handling audio interruptions 문서 번역

kimseawater
daily-monster
Published in
6 min readMar 26, 2024

안녕하세요 화요일마다 돌아오는 kimseawater입니다! 오늘은 Handling audio interruption이라는 공식문서를 번역해봤습니다! 틀린 내용이 있다면 댓글 부탁드립니다..!!!

Interruption은 iOS, watchOS 유저 경험의 공통 부분이다. 예를들어, 폰에서 TV movie를 보다가, 전화를 받는 경우가 있다. 이 경우, movie의 오디오는 fade out 되고, 재생은 멈추고, 전화 벨소리가 fade in 된다. 전화를 거절하면, 컨트롤은 다시 TV앱으로 넘어오고, movie audio가 fade in 되면서 재생이 시작된다.

이는 app의 audio session이 하는 것이다. interruption이 시작되고 끝날 때, audio session은 등록된 옵저버들에게 알려서, 그들이 적절한 액션을 취하도록 한다. 예를들어, AVPlayer가 앱의 audio session을 모니터링해서, 자동으로 interruption event에 응답해 재생을 멈추도록 할 수 있다. 이 변화는 key-value observing을 이용해 player의 timeControlStatus 프로퍼티를 관찰해서 모니터링할 수 있고, 필요하다면 player를 pause하고 resume할 때 user interface를 업데이트 할 수 있다.

Customize the interruption behavior

대부분의 앱은 system의 default interruption behavior에 의존한다. 그러나, AVAudioSession은 default behavior를 앱에 맞게 customize할 수 있는 기능을 제공한다.

  • 최근의 iPad 모델은 유저가 디바이스의 스마트 폴리오 커버를 닫을 때 하드웨어 레벨의 built-in 마이크를 음소거 시키는 기능을 제공한다. 만약, 앱이 재생하거나 오디오를 녹음한다면 시스템이 마이크를 꺼버려도 계속 재생하고 싶을 것이다. 이때 audion session을 구성할 때 overrideMutedMicrophoneInterruption 옵션을 이용해서 default interruption behavior를 disable하게 할 수도 있다.
  • 전화가 오거나 했을 때의 System alert는, 활성화된 오디오 세션을 interrupt한다. 만약 시스템이 이 경우 audio session을 Interrupt하지 않게 하고 싶다면, setPrefersNoInterruptionsFromSystemAlerts(_:) 메서드 값을 세팅해서 이를 나타낼 수 있다.

Observe audio session interruptions

AVAudioSession이 보내는 notification을 바로 관찰할 수 있다. 이는 route change와 같은 interruption이나 다른 이유로 시스템이 재생을 멈출 때를 알 때 유용하다. audio interruption을 관찰하기위해, interruptionNotification 타입 관찰을 등록해라.

func setupNotifications() {
let nc = NotificationCenter.default
nc.addObserver(
self,
selector: #selector(handleInterruption),
name: AVAudioSession.interruptionNotification,
object: AVAudioSession.sharedInstance()
)
}

@objc func handleInterruption(notification: Notification) {
// 구현
}

Handle audio session interruptions

전송된 Notification 객체는 interruption에 대한 상세 정보가 담긴 user-information dictionary를 보낸다. userInfo Dictionary로부터 전송된 AVAudioSession.InterruptionType 값을 받아서 interruption의 타입을 알 수 있다. interruption 타입은 interruption이 시작했는지 끝났는지를 알려준다.

@objc func handleInterruption(notification: Notification) {
guard let userInfo = notification.userInfo,
let typeValue = userInfo[AVAudioSessionInterruptionTypeKey] as? UInt,
let type = AVAudioSession.InterruptionType(rawValue: typeValue) else { return }

switch type {
case .began:
// An interruption began. Update the UI as necessary.
case .ended:
// An interruption ended. Resume playback, if appropriate.
guard let optionsValue = userInfo[AVAudioSessionInterruptionOptionKey] as? UInt else { return }
let options = AVAudioSession.InterruptionOptions(rawValue: optionValue)
if options.contains(.shouldResume) {
// An interruption ended. Resume playback.
} else {
// An interruption ended. Don't resume playback.
}
default: ()
}
}

interruptionType이 AVAudioSession.InterruptionType.ended면, userInfo dictionary에 AVAudioSession.InterruptionOptions 값이 포함된다. 이를 이용해 재생이 재개되도록 할 수 있다.

--

--