AVAudioSession overrideOutputAudioPort& localNotifications in mute

时间:2015-03-06 14:53:42

标签: ios swift avaudioplayer avaudiosession localnotification

您好我尝试了类似问题的各种解决方案,但无法让我的代码工作。我在我的应用程序中调用了以下函数:

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仅在设备未静音时付费。
  2. 为了解决我想要的第一个问题,但我不知道如何使用它:

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

    提前致谢, 王牌

1 个答案:

答案 0 :(得分:1)

overrideOutputAudioPort会影响音频路由,而不会影响音量。

如果您想要&#34;覆盖扬声器音量&#34;,我认为您的意思是要从您的应用代码控制系统输出音量。这是不可能的,因为Apple认为输出量应始终保持在用户的控制之下。

AVAudioPlayer的volume属性将卷 relative 设置为系统输出级别。默认为1.0(播放器音量==系统音量)。你不能把它更高,脊柱式的风格,改为1.1 ......

另请参阅我的回答here ...如果您想控制系统音量,则需要MPVolumeView提供的用户界面。

同样关于您的通知 - 如果用户将设备静音,您的应用就无法忽略该设置。

更新
关于通知,它并不像我建议的那样简单。如果将AVAudioSession类别设置为AVAudioSessionCategoryPlayback(和read the apple docs on this setting),则可能会有效。

  

使用此类别时,您的应用音频将继续,静音开关设置为静音或屏幕锁定

您可能还需要添加音频&#39;到UIBackgroundModes的{​​{1}}。