当iOS设备被锁定或在其他应用程序上时,如何处理后台音频播放?

当iOS设备被锁定或在其他应用程序上时,如何处理后台音频播放?,ios,audio,background,multitasking,locked,Ios,Audio,Background,Multitasking,Locked,使用OpenFrameworks为iOS设计生成性音乐系统,我需要提供一种模式,用户可以在以下情况下收听应用程序生成的音乐: 设备已锁定 用户使用另一个应用程序 一些应用程序(如BLOOM或alarm clock)就是这样工作的,建议用户使用一个开关来启用/禁用此功能 有什么建议吗?播放背景音频 连续播放或录制音频的应用程序(即使在应用程序运行时) 在后台运行)可以注册以在中执行这些任务 背景。您可以从“背景模式”部分启用音频支持 您的Xcode项目中的“功能”选项卡的。(您还可以启用 通过

使用OpenFrameworks为iOS设计生成性音乐系统,我需要提供一种模式,用户可以在以下情况下收听应用程序生成的音乐:

  • 设备已锁定
  • 用户使用另一个应用程序
一些应用程序(如BLOOM或alarm clock)就是这样工作的,建议用户使用一个开关来启用/禁用此功能


有什么建议吗?

播放背景音频

连续播放或录制音频的应用程序(即使在应用程序运行时) 在后台运行)可以注册以在中执行这些任务 背景。您可以从“背景模式”部分启用音频支持 您的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,我认为它应该指向这里:你的第二个链接是金色的!非常感谢。“应用程序不在后台运行”应该设置为“否”,这很好,谢谢。我还需要设置功能>背景模式>音频和播放