티스토리 뷰

공식문서

 

 

Introduction

Introduction Audio is a managed service in iOS, tvOS, and watchOS. The system manages audio behavior at the app, inter-app, and device levels through the use of audio sessions. You use an audio session to communicate to the system how you intend to use aud

developer.apple.com

 

AVAudioSession 인스턴스를 사용하여 앱의 오디오 세션과 상호 작용하여 다음을 수행할 수 있습니다.

  • 앱에서 오디오를 사용하는 방법을 시스템과 통신하도록 오디오 세션 카테고리 및 모드 구성
  • 앱의 오디오 세션을 활성화하여 카테고리 및 모드 구성을 실행합니다.
  • 오디오 중단 및 경로 변경과 같은 중요한 오디오 세션 notifications 구독 및 응답
  • 샘플링 속도, I/O 버퍼 지속 시간 및 채널 수 설정과 같은 고급 오디오 장치 구성 수행

Activating an Audio Session

디바이스를 공항이라하면, 앱은 비행기이고 시스템은 컨트롤타워입니다.

앱이 오디오세션 활성화를 요청합니다. 그러면 시스템에서 오디오 세션에 할당한 카테고리를 보고 리퀘스트를 수행할지 판단합니다. 만약에 나의 앱이 다른 앱을 침묵시키겠다고하면 시스템은 다른앱(뮤직앱)의 오디오세션을 종료(deactivate)합니다. 그리고 시스템이 나의 앱을 재생합니다.

Activating and Deactivating Your Audio Session

AVFoundation은 알아서 재생이나 기록을 실행(activating)하지만, 수동으로 실행(activating)하는 것은 이 수행이 성공했는지 여부를 알 수 있게 해줍니다.

하지만 앱에 재생/정지 UI가 있다면, 세션이 활성화되기전에 유저가 재생 버튼을 누르도록 코드를 작성하세요.

세션이 바뀔때 성공했는지 확인하고 시스템이 activating을 거부하는 것에 대한 처리를 작성하세요.

시스템은 당신의 오디오세션을 시계, 캘린더알람, 전화올 때 비활성화합니다.

사용자가 알람을 취소하거나 전화를 거절하면, 시스템은 세션이 다시 활성화될 수 있게 허락합니다.

방해가 끝나고 다시 활성화할 지는 앱 타입에 따라 결정됩니다. Audio Guidelines By App Type.

let session = AVAudioSession.sharedInstance()
do {
    // 1) Configure your audio session category, options, and mode
    // 2) Activate your audio session to enable your custom configuration
    try session.setActive(true)
} catch let error as NSError {
    print("Unable to activate audio session:  \\(error.localizedDescription)")
}

… 백그라운드앱, 음성통화앱, 게임 앱에 대한 내용 다른 오디오 재생 관련 내용 생략 …

Configuring an Audio Session

카테고리는 앱의 오디오 수행을 결정합니다. (벨/무음 상태에서 오디오 재생할건지 등)

디테일은 Table B-1 참고

Category

Category무음이나 잠금일 때 조용히 하기동시재생가능녹음, 재생 여부

ambient O X 재생
soloAmbient O O 재생
playback X O(X로 바꿀 수 있음) 재생
record X(잠금에서 녹음가능) O 녹음
playAndRecord X O(X로 바꿀 수 있음) 재생, 녹음
multiRoute X O 재생, 녹음

Note:  For your app to continue playing audio when the Ring/Silent switch is set to silent and the screen is locked, make sure the [UIBackgroundModes] audio key has been added to your app’s Info.plist  file. This requirement is in addition to your using the correct category

대부분의 앱은 카테고리를 한 번만 설정해주면 됩니다. 하지만 필요에 따라 바꿔줄 수도 있습니다.

오디오 세션이 활성화중에도 바꿀수 있는데 카테고리 바꾸기전에 비활성화하고 바꾸는게 낫습니다.

Audio Session Default Behavior

앱의 기본 설정

재생 가능, 녹음 불가능

iOS는 무음모드와 잠금에서 소리꺼짐

앱이 오디오 재생하면 다른 백드라운드 오디오(음악앱 등)는 소리꺼짐

Configuring Your Audio Session

카테고리세팅으로 오디오 세션을 설정할 수 있습니다.

어떤 카테고리는 옵션([AVAudioSessionCategoryOptions](<https://developer.apple.com/documentation/avfoundation/avaudiosession/categoryoptions>))으로 변경가능합니다.

playback은 다른 앱의 소리를 끕니다. 하지만 mixWithOthers를 하면 다른 앱이랑 소리가 같이 나올 수 있습니다.

// Access the shared, singleton audio session instance
let session = AVAudioSession.sharedInstance()
do {
    // Configure the audio session for movie playback
    try session.setCategory(AVAudioSessionCategoryPlayback,
                            mode: AVAudioSessionModeMoviePlayback,
                            options: [])
} catch let error as NSError {
    print("Failed to set the audio session category and mode: \\(error.localizedDescription)")
}

…여러 채널 재생, 에어플레이, 백그라운드 재생 생략…

Notifications Support Interruption Handling

방해 받았을 때 처리하는 방법

Interruption(방해)가 발생하면 나의 앱 오디오 세션이 비활성화됩니다. - 즉시 오디오 정지

 

Audio Interruption Handling Techniques

방해 발생 후

  • 상태와 문맥 저장
  • UI변경

방해 종료 후

  • 상태와 문맥 다시 저장
  • UI변경
  • 필요 시, 세션 재활성화

Observing Audio Interruptions

func registerForNotifications() {
    NotificationCenter.default.addObserver(
		self,
		selector: #selector(handleInterruption),
		name: .AVAudioSessionInterruption,
		object: AVAudioSession.sharedInstance()
	)
}
 
func handleInterruption(_ notification: Notification) {
    // Handle interruption
}
func handleInterruption(_ notification: Notification) {
    guard let info = notification.userInfo,
        let typeValue = info[AVAudioSessionInterruptionTypeKey] as? UInt,
        let type = AVAudioSessionInterruptionType(rawValue: typeValue) else {
            return
    }
    if type == .began {
        // Interruption began, take appropriate actions (save state, update user interface)
    }
    else if type == .ended {
        guard let optionsValue =
            userInfo[AVAudioSessionInterruptionOptionKey] as? UInt else {
                return
        }
        let options = AVAudioSessionInterruptionOptions(rawValue: optionsValue)
        if options.contains(.shouldResume) {
            // Interruption Ended - playback should resume
        }
    }
}

…미디어 서버 초기화 생략…

Audio Sessions Control Device Configuration

하드웨어 설정 Configuring Device Hardware.

Audio Sessions Protect User Privacy

개인정보 보호 Protecting User Privacy.

댓글
공지사항