如何处理iOS设备被locking或其他应用程序时播放的背景audio?

使用OpenFrameworks为iOSdevise生成音乐系统,我需要提供一种模式,用户可以在此模式下聆听应用程序产生的音乐:

  • 该设备被locking
  • 用户使用另一个应用程序

一些像BLOOM或闹钟这样的应用程序就是这样工作的,并build议用户使用一个开关来启用/禁用此function。

任何提示呢?

播放背景audio

连续播放或录制audio的应用程序(即使应用程序在后台运行时)也可注册在后台执行这些任务。 您可以从Xcode项目的function选项卡的背景模式部分启用audio支持。 (您也可以通过在应用程序的Info.plist文件中包含具有audio值的UIBackgroundModes键来启用此支持。)在后台播放audio内容的应用程序必须播放声音内容而不是静音。

Apple参考“播放和录制背景audio”

屏幕locking时确保audio持续

对于启用/禁用此function,我发现激活和停用audio会话 ,我没有尝试过,但它看起来像你所需要的。

你需要在plist文件中做一些修改。

即1)将所需的背景模式设置为应用程序播放audio

2)设置应用程序不会在后台运行到NO。

NSError *setCategoryErr = nil; NSError *activationErr = nil; [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error:&setCategoryErr]; [[AVAudioSession sharedInstance] setActive:YES error:&activationErr]; 

然后,你需要在AppDelegate中编写这么多的代码

现在,您可以轻松地在电话屏幕locking或背景中运行audio。

在xCode项目设置以及代码中进行以下更改。

步骤1)在Xcode的导航器中select你的项目文件。 然后,从能力部分开启背景模式部分。 在给出背景模式列表后,在audio和Airplay开关上打勾。

stp 2)使用下面的swift代码,基本上你需要为你的应用程序设置audio会话。

 var audioPlayer : AVAudioPlayer! @IBAction func playButtonClicked(sender : AnyObject){ let dispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) dispatch_async(dispatchQueue, { if let data = NSData(contentsOfFile: self.audioFilePath()) { do{ let session = AVAudioSession.sharedInstance() try session.setCategory(AVAudioSessionCategoryPlayback) try session.setActive(true) self.audioPlayer = try AVAudioPlayer(data: data) //self.audioPlayer.delegate = self self.audioPlayer.prepareToPlay() self.audioPlayer.play() } catch{ print("\(error)") } } }); } func audioFilePath() -> String{ let filePath = NSBundle.mainBundle().pathForResource("mySong", ofType: "mp3")! return filePath } 

即使应用程序处于后台或手机处于静音模式或设备已locking,此audio回放会话也将播放您的应用程序回放。

看看这个教程。 它有一些后台服务的例子

http://www.raywenderlich.com/29948/backgrounding-for-ios

你需要在plist文件中做一些修改。

1)将所需的背景模式设置为应用程序播放audio

2)设置应用程序不会在后台运行到NO。

 let dispatchQueue = DispatchQueue.global() dispatchQueue.async(execute: { do{ let session = AVAudioSession.sharedInstance() try session.setCategory(AVAudioSessionCategoryPlayback) try session.setActive(true) self.isObjectAllocate = true if self.isPlayed == false{ self.playSound(soundName: "http://radio.zahraun.com:8000/live.m3u") self.isPlayed = true self.btnPlayAudio.setImage(#imageLiteral(resourceName: "pause") , for: .normal) }else{ self.audioPlayer.pause() self.isPlayed = false self.btnPlayAudio.setImage(#imageLiteral(resourceName: "audioPlay"), for: .normal) } } catch{ print("\(error)") } }); 

你也可以使用这个代码:

 AVAudioSession *session = [AVAudioSession sharedInstance]; [session setCategory:AVAudioSessionCategoryPlayback error:NULL]; AVAudioSession *backgroundMusic = [AVAudioSession sharedInstance]; [backgroundMusic setCategory:AVAudioSessionCategoryPlayback error:NULL];