当iOS设备被锁定或在其他应用程序上时,如何处理后台音频播放?
使用OpenFrameworks为iOS设计生成性音乐系统,我需要提供一种模式,用户可以在以下情况下收听应用程序生成的音乐:当iOS设备被锁定或在其他应用程序上时,如何处理后台音频播放?,ios,audio,background,multitasking,locked,Ios,Audio,Background,Multitasking,Locked,使用OpenFrameworks为iOS设计生成性音乐系统,我需要提供一种模式,用户可以在以下情况下收听应用程序生成的音乐: 设备已锁定 用户使用另一个应用程序 一些应用程序(如BLOOM或alarm clock)就是这样工作的,建议用户使用一个开关来启用/禁用此功能 有什么建议吗?播放背景音频 连续播放或录制音频的应用程序(即使在应用程序运行时) 在后台运行)可以注册以在中执行这些任务 背景。您可以从“背景模式”部分启用音频支持 您的Xcode项目中的“功能”选项卡的。(您还可以启用 通过
- 设备已锁定
- 用户使用另一个应用程序
有什么建议吗?播放背景音频 连续播放或录制音频的应用程序(即使在应用程序运行时) 在后台运行)可以注册以在中执行这些任务 背景。您可以从“背景模式”部分启用音频支持 您的Xcode项目中的“功能”选项卡的。(您还可以启用 通过在音频中包含UIBackgroundModes键来实现此支持 应用程序的Info.plist文件中的值。)在中播放音频内容的应用程序 背景必须播放可听内容,而不是静音
要启用/禁用我发现的此功能,我自己还没有尝试过,但它看起来就像您需要的一样。您需要在plist文件中进行一些更改 i、 e。 1) 将所需背景模式设置为应用程序播放音频
2) 将应用程序不在后台运行设置为否
NSError *setCategoryErr = nil;
NSError *activationErr = nil;
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error:&setCategoryErr];
[[AVAudioSession sharedInstance] setActive:YES error:&activationErr];
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)")
}
});
然后,您需要在AppDelegate中编写这些代码
现在,您可以在手机屏幕锁定或进入后台时轻松运行音频。您还可以使用以下代码:
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryPlayback error:NULL];
AVAudioSession *backgroundMusic = [AVAudioSession sharedInstance];
[backgroundMusic setCategory:AVAudioSessionCategoryPlayback error:NULL];
在xCode项目设置和代码中进行以下更改 步骤1)在Xcode的导航器中选择项目文件。然后,从“能力”部分,打开“背景模式”部分。背景模式列表提供给您后,勾选音频和播放开关 stp 2)使用以下swift代码,基本上你需要为你的应用程序设置音频会话
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
}
此音频播放会话将播放您的应用程序播放,即使应用程序处于后台、手机处于静默模式或设备已锁定。请参阅本教程。它有一些后台服务示例
您需要在plist文件中进行几处更改 1) 将所需背景模式设置为应用程序播放音频
2) 将应用程序不在后台运行设置为否
NSError *setCategoryErr = nil;
NSError *activationErr = nil;
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error:&setCategoryErr];
[[AVAudioSession sharedInstance] setActive:YES error:&activationErr];
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)")
}
});
你好,Danich,非常感谢你的回答。有没有办法在运行时更改它?我为此打开了另一个线程:对不起,没有注意到您关于启用/禁用的问题。我认为新线程不是一个好主意。更新了我的答案。接受,如果你认为它有用的话。这个答案中的第二个链接是404,我认为它应该指向这里:你的第二个链接是金色的!非常感谢。“应用程序不在后台运行”应该设置为“否”,这很好,谢谢。我还需要设置功能>背景模式>音频和播放