AVAudioSession overrideOutputAudioPort и localNotifications отключены

Привет, я пробовал различные решения для подобных вопросов, но не смог заставить мой код работать. У меня есть следующая функция, которую я вызываю в своем приложении:

func PlaySound (WhenToPlaySound:String) {

AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord, error: nil)
    AVAudioSession.sharedInstance().setActive(true, error: nil)

    if WhenToPlaySound == "BeginningOfRound" {

        if UIApplication.sharedApplication().applicationState == UIApplicationState.Background {

            soundnotification.soundName = "BoxingBellStart.wav"

            UIApplication.sharedApplication().scheduleLocalNotification(soundnotification)

            println("timer is done in background mode")

        } else {

            // Load Sound
            soundlocation = NSBundle.mainBundle().URLForResource("BoxingBellStart", withExtension: "wav")!
            player = AVAudioPlayer(contentsOfURL: soundlocation, error: &Error)
            player.volume = 1.0

            // Play Sound
            player.play()

            println("timer is done in active mode")

        }

    } else {

        if UIApplication.sharedApplication().applicationState == UIApplicationState.Background {

            soundnotification.soundName = "Boxing.wav"

            UIApplication.sharedApplication().scheduleLocalNotification(soundnotification)

            println("timer is done in background mode")

        } else {

            // Load Sound
            soundlocation = NSBundle.mainBundle().URLForResource("Boxing", withExtension: "wav")!
            player = AVAudioPlayer(contentsOfURL: soundlocation, error: &Error)
            player.volume = 1.0

            // Play Sound
            player.play()

            println("timer is done in active mode")

        }

    }
}

В основном это работает, за исключением двух вещей:

<удар>1. Я не могу переопределить громкость динамика. Я хочу, чтобы громкость системы была полной, прежде чем я воспроизведу свой звук.

  1. LocalNotifications, которые настроены на активацию, когда приложение находится в фоновом режиме, оплачиваются только в том случае, если устройство не отключено.

Чтобы решить первую проблему, я хотел следующее, но не знал, как это использовать:

AVAudioSession.sharedInstance().overrideOutputAudioPort(<#portOverride: AVAudioSessionPortOverride#>, error: <#NSErrorPointer#>) 

Заранее спасибо, Ас


person Ace Green    schedule 06.03.2015    source источник


Ответы (1)


overrideOutputAudioPort влияет на маршрутизацию звука, а не на громкость.

Когда вы говорите, что хотите «переопределить громкость динамика», я предполагаю, что вы имеете в виду, что хотите контролировать громкость вывода системы из своего кода приложения. Это невозможно, так как Apple считает, что громкость вывода всегда должна оставаться под контролем пользователя.

Свойство volume AVAudioPlayer задает громкость относительно уровня выходного сигнала системы. По умолчанию 1.0 (громкость проигрывателя == системная громкость). Вы не можете поднять его выше, в стиле спинномозговой пункции, до 1,1...

См. также мой ответ здесь... если вы хотите взять под контроль системный том, вам понадобится предоставленный пользовательский интерфейс от MPVolumeView.

То же самое и с вашими уведомлениями: если пользователь отключил звук на устройстве, ваше приложение не сможет это игнорировать.

update
относительно уведомлений, это не так просто, как я предполагал. Это может сработать, если вы установите для категории AVAudioSession значение AVAudioSessionCategoryPlaybackознакомьтесь с документацией Apple по этому параметру).

При использовании этой категории звук вашего приложения продолжается, когда переключатель «Без звука» установлен в положение «Без звука» или при блокировке экрана.

Вам также может понадобиться добавить «аудио» в UIBackgroundModes в файле info.plist.

person foundry    schedule 06.03.2015
comment
относительно пункта 2. Я заметил, что другое приложение воспроизводит звуки локальных уведомлений, даже если устройство находится в беззвучном режиме. Если громкость отключена, то это не работает, но с громкостью и без звука воспроизводится звук уведомления. - person Ace Green; 06.03.2015
comment
@AceGreen - смотрите мое обновление. Что касается пункта 1, вы не можете изменить системный том без взаимодействия с пользователем (например, через MPVolumeView). - person foundry; 06.03.2015
comment
Хорошо, я отбросил пункт 1. Пункт 2 возможен, так как я вижу, что это делает приложение под названием RoundTimer. - person Ace Green; 07.03.2015
comment
С моей текущей настройкой: в активном режиме и AVAudio, и локальные уведомления воспроизводят звук в беззвучном и обычном режимах. В фоновом режиме AVAudio воспроизводится в беззвучном и обычном режиме, а LocalNotification воспроизводится только в обычном режиме. - person Ace Green; 07.03.2015
comment
@foundry, я переключился на динамик, этот сеанс действителен для воспроизведения через youtube.com через мое веб-представление? мой сеанс отлично работает с AVPlayer, но как только я загружаю любой URL-адрес для аудио, он перенаправляется на маршрут по умолчанию (согласно стандартам устройства) - person Kumar KL; 03.03.2016