Ввод фона на iOS4 для воспроизведения аудио - PullRequest
18 голосов
/ 02 июля 2010

Документация довольно плохо написана, когда речь идет о проигрывании аудио в фоновом режиме.Создается впечатление, что все, что вам нужно сделать, чтобы продолжить воспроизведение звука, который вы сейчас воспроизводите, - это просто добавить пару ключ / значение в файл info.plist, и уолла, это волшебство.

Однако этоэто не тот случай.Например, если я проигрываю mp3, который длится 2 минуты, очевидно, что звук достаточно длинный, чтобы его можно было воспроизвести после того, как я нажал кнопку «Домой» и отправил свое приложение на задний план.Дело в том, что, хотя у меня есть эта пара ключ / значение в моем файле info.plist, он приостанавливает звук и затем возобновляет воспроизведение, как только я снова переключаюсь на приложение.

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

Итак, мой вопрос: что они делают, что мне не хватает? Я также должен как-то использовать их новых делегатов или вызвать аудио на applicationDidEnterBackground?Для меня это не имеет смысла, так как я не сохраняю состояние (они делают для меня быстрое переключение приложений) или действительно обрабатываю что-либо в фоновом режиме, кроме звука, который, как они говорят, должен обрабатываться автоматически.

Ответы [ 2 ]

22 голосов
/ 02 июля 2010

Вам также необходимо сделать вызовы beginBackgroundTaskWithExpirationHandler: перед тем, как запустить песню (делать это постоянно, на переднем плане или нет) и endBackgroundTask, когда она заканчивается.

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

Вы можете использовать его так:

// ivar, initialized to UIBackgroundTaskInvalid in awakeFromNib
UIBackgroundTaskIdentifier bgTaskId; 

При запуске аудиоплеера мы сохраняем идентификатор задачи bg:

if ([audioPlayer play]) {
  bgTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL];
}

Теперь обратный вызов audioPlayerDidFinishPlaying: по-прежнему будет происходить, потому что мы сказали iOS, что выполняем задачу, которую необходимо продолжить, даже если мы находимся в фоновом режиме. Таким образом, мы получаем обратный вызов и можем запустить следующий аудиофайл.

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)success
{
    UIBackgroundTaskIdentifier newTaskId = UIBackgroundTaskInvalid;

    if (self.haveMoreAudioToPlay) {
        newTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL];
        [self playNextAudioFile];
    }

    if (bgTaskId != UIBackgroundTaskInvalid) {
        [[UIApplication sharedApplication] endBackgroundTask: bgTaskId];
    }

    bgTaskId = newTaskId;
}      
17 голосов
/ 02 июля 2010

Единственная часть, отсутствующая в документации, - вам необходимо установить аудио сеанс.

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];

Добавьте это, и вам будет хорошо.

...