iOS:开始播放背景声音

时间:2015-06-28 16:51:05

标签: ios background avfoundation avaudioplayer

我需要在用户关闭应用时开始播放声音。我使用applicationDidEnterBackground方法。这是:

func applicationDidEnterBackground(application: UIApplication) {
    let dispatchQueue =
    dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)

    dispatch_async(dispatchQueue, {[weak self] in

        var audioSessionError: NSError?
        let audioSession = AVAudioSession.sharedInstance()
        NSNotificationCenter.defaultCenter().addObserver(self!,
            selector: "handleInterruption:",
            name: AVAudioSessionInterruptionNotification,
            object: nil)

        audioSession.setActive(true, error: nil)

        if audioSession.setCategory(AVAudioSessionCategoryPlayback,
            error: &audioSessionError){
                println("Successfully set the audio session")
        } else {
            println("Could not set the audio session")
        }

        let filePath = NSBundle.mainBundle().pathForResource("MySong",
            ofType:"mp3")

        let fileData = NSData(contentsOfFile: filePath!,
            options: .DataReadingMappedIfSafe,
            error: nil)

        var error:NSError?

        /* Start the audio player */
        self!.audioPlayer = AVAudioPlayer(data: fileData, error: &error)

        /* Did we get an instance of AVAudioPlayer? */
        if let theAudioPlayer = self!.audioPlayer{
            theAudioPlayer.delegate = self;
            if theAudioPlayer.prepareToPlay() &&
                theAudioPlayer.play(){
                    println("Successfully started playing")
            } else {
                println("Failed to play")
            }
        } else {
            /* Handle the failure of instantiating the audio player */
        }
        })

}
func handleInterruption(notification: NSNotification){
/* Audio Session is interrupted. The player will be paused here */

let interruptionTypeAsObject =
notification.userInfo![AVAudioSessionInterruptionTypeKey] as! NSNumber

let interruptionType = AVAudioSessionInterruptionType(rawValue:
  interruptionTypeAsObject.unsignedLongValue)

if let type = interruptionType{
  if type == .Ended{

    /* resume the audio if needed */

  }
}

}

func audioPlayerDidFinishPlaying(播放器:AVAudioPlayer!,     成功举旗:Bool){

  println("Finished playing the song")

  /* The flag parameter tells us if the playback was successfully
  finished or not */
  if player == audioPlayer{
    audioPlayer = nil
  }
  }

它不起作用。调试后,我看到theAudioPlayer.play()返回false。如果我在applicationDidFinishLaunching中运行此代码,则会播放声音。我将背景模式App plays audio or streams audio/video using AirPlay添加到我的Info.plist这里有什么问题?

1 个答案:

答案 0 :(得分:0)

在非常基础的级别,您的应用程序应该满足以在后台播放音频的三个先决条件:

  • 音乐必须正在播放
  • 在目标功能中设置音频的“背景模式”。

  • 对于基本播放,请初始化音频会话,并将音频会话类别设置为AVAudioSessionCategoryPlayback。如果不这样做,您将获得默认行为。

您还应该配置您的应用以响应

  • 音频输出的变化
  • 音频会话中断(例如电话)
  • 远程控制事件(通过控制中心或锁定屏幕)

查看this Swift示例。