Ввод фона на iOS4 для воспроизведения аудио
Документация довольно плохо написана, когда речь идет о проигрывании аудио в фоновом режиме. Создается впечатление, что все, что вам нужно сделать, чтобы продолжить воспроизведение звука, который вы сейчас воспроизводите, - это просто добавить пару ключ / значение к info.plist
файл и валлах, это волшебство.
Однако, это не так. Например, если я проигрываю mp3, который длится 2 минуты, очевидно, что звук достаточно длинный, чтобы его можно было воспроизвести после того, как я нажал кнопку "Домой" и отправил свое приложение на задний план. Дело в том, что хотя у меня есть пара ключ / значение в моем info.plist
файл, он приостанавливает звук, а затем возобновляет воспроизведение, как только я переключаюсь обратно в приложение.
Apple заявляет, что все платформы для поддержки звука поддерживают фон и звук должны продолжать воспроизводиться до того момента, пока он не закончится, и тогда Apple приостановит ваше приложение.
Итак, мой вопрос: что они делают, что мне не хватает? Нужно ли мне как-то использовать их новых делегатов или вызвать аудио на applicationDidEnterBackground
? Для меня это не имеет смысла, так как я не сохраняю состояние (они делают для меня быстрое переключение приложений) или действительно обрабатываю что-либо в фоновом режиме, кроме звука, который, как они говорят, должен обрабатываться автоматически.
2 ответа
Единственная часть, отсутствующая в документации, это то, что вам нужно установить аудио сеанс.
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
Добавьте это, и вам будет хорошо идти.
Вам также нужно сделать вызовы 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;
}