Как обрабатывать фоновое воспроизведение звука, когда устройство iOS заблокировано или в другом приложении?

При разработке генеративной музыкальной системы для iOS с использованием OpenFrameworks мне нужно было предоставить режим, в котором пользователь мог бы слушать музыку, созданную приложением, когда:

  • устройство заблокировано
  • пользователь использует другое приложение

Некоторые приложения, такие как BLOOM или будильник, работают так и предлагают пользователям переключатель для включения/отключения этой функции.

Любые советы для этого?


person gluon    schedule 03.05.2012    source источник


Ответы (6)


Воспроизведение фонового звука

Приложение, которое непрерывно воспроизводит или записывает звук (даже когда приложение работает в фоновом режиме), может зарегистрироваться для выполнения этих задач в фоновом режиме. Вы включаете поддержку звука в разделе «Фоновые режимы» на вкладке «Возможности» в вашем проекте Xcode. (Вы также можете включить эту поддержку, включив ключ UIBackgroundModes со значением аудио в файле Info.plist вашего приложения.) Приложения, воспроизводящие аудиоконтент в фоновом режиме, должны воспроизводить звуковой контент, а не тишину.

Справочник Apple "Воспроизведение и запись фонового звука"

Продолжение звука при блокировке экрана

Для включения/отключения этой функции я нашел Активация и деактивация вашей аудиосессии, я сам не пробовал, но похоже, что вам нужно.

person DanSkeel    schedule 03.05.2012
comment
Привет Danich и большое спасибо за ваш ответ. Есть ли способ изменить его во время выполнения? - person gluon; 08.05.2012
comment
Я открыл еще один поток для этого конкретного момента: ios-de" title="как мы можем разрешить отключение фонового звука во время выполнения на ios de">stackoverflow.com/questions/10504432/ - person gluon; 08.05.2012
comment
Извините, не заметил вашего вопроса о включении/отключении. Я думаю, что новая тема - не лучшая идея. Обновил мой ответ. Примите, если считаете это полезным. - person DanSkeel; 09.05.2012
comment
Давайте сделаем это. тестирую прямо сейчас. Я исправил опечатку в вашей последней ссылке. - person gluon; 09.05.2012
comment
Вторая ссылка в этом ответе — 404, я думаю, она должна указывать здесь: developer.apple.com/library/ios/qa/qa1626/_index.html - person voidref; 19.06.2014
comment
Ваша вторая ссылка золотая! Большое спасибо. - person Gasper; 21.07.2017
comment
Кажется, что AVAudioSessionCategoryPlayback в основном также является обязательным, UIBackgroundModes, установленным на audio, НЕ достаточно. По крайней мере, AVAudioSessionCategoryAmbient, SoloAmbient и т. д. НЕ работает, поскольку всегда отключает звук — приложение может по-прежнему работать в фоновом режиме, но звук будет остановлен... - person Jonny; 05.09.2017

Вам нужно внести пару изменений в файл plist.

т. е. 1) Установите для параметра «Требуемый фоновый режим» значение «Приложение воспроизводит звук».

2) установить Приложение не работает в фоновом режиме на НЕТ.

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

Затем вам нужно написать столько кода в AppDelegate

Теперь вы можете легко запускать звук, когда экран телефона заблокирован или работает в фоновом режиме.

person dhaval rupani    schedule 01.02.2013
comment
Приложение не работает в фоновом режиме, следует установить значение НЕТ - person ctpenrose; 09.12.2014
comment
Это здорово, спасибо. Мне также нужно было установить «Возможности»> «Фоновые режимы»> «Аудио и AirPlay». - person Dunc; 08.01.2016

Внесите следующие изменения в настройки проекта xCode, а также в код.

шаг 1) Выберите файл проекта в навигаторе Xcode. Затем в разделе «Возможности» включите подраздел «Фоновые режимы». После того, как вам будет предоставлен список фоновых режимов, отметьте переключатель Audio & Airplay.

stp 2) Используйте следующий быстрый код, в основном вам нужно установить аудиосессию для вашего приложения.

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
}

Этот сеанс воспроизведения звука будет воспроизводить воспроизведение вашего приложения, даже если приложение находится в фоновом режиме, или телефон находится в беззвучном режиме, или устройство заблокировано.

person Himanshu Mahajan    schedule 27.10.2015

Посмотрите на этот урок. Он имеет некоторые из примеров фоновых служб

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

person hmlasnk    schedule 18.11.2015

Вам нужно внести пару изменений в файл plist.

1) Установите для параметра «Требуемый фоновый режим» значение «Приложение воспроизводит звук».

2) установить Приложение не работает в фоновом режиме на НЕТ.

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)")
                    }
            });
person Varun Naharia    schedule 17.03.2017

Также вы можете использовать этот код:

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

AVAudioSession *backgroundMusic = [AVAudioSession sharedInstance];

[backgroundMusic setCategory:AVAudioSessionCategoryPlayback error:NULL];
person Evgenii Melnik    schedule 23.05.2013