iOS:开始从后台播放声音

Posted

技术标签:

【中文标题】iOS:开始从后台播放声音【英文标题】:iOS: Start playing sound from background 【发布时间】:2015-06-28 16:51:04 【问题描述】:

当用户关闭应用程序时,我需要开始播放声音。我使用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 中运行此代码,它会播放声音。我在我的Info.plist 中添加了后台模式App plays audio or streams audio/video using AirPlay,这里有什么问题?

【问题讨论】:

你需要一个 UIBackgroundTaskIdentifier 好的,请举个例子。 查看我用 Swift 示例更新的答案。 @Woodstock 此代码来自那里。 【参考方案1】:

在非常基本的层面上,您的应用要在后台播放音频应满足三个先决条件:

必须播放音乐

在目标功能中为音频设置“背景模式”。

对于基本播放,初始化您的音频会话,并将您的音频会话类别设置为 AVAudioSessionCategoryPlayback。否则,您将获得默认行为。

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

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

查看this Swift 示例。

【讨论】:

以上是关于iOS:开始从后台播放声音的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 无法在后台播放声音

是否可以在后台播放来自应用程序的声音

iOS 实现后台 播放音乐声音 AVAudioPlayer

使用 AVAudioPlayer 在后台播放声音序列

音频在后台播放但没有声音 Cordova 3+ IOS

使用 system() 函数在后台播放声音