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